[Dúvida] - Erros na manipulação de arquivos [RESOLVIDO]

1. [Dúvida] - Erros na manipulação de arquivos [RESOLVIDO]

Caique
CaiquePortela

(usa Ubuntu)

Enviado em 11/10/2013 - 21:35h

Estou desenvolvendo um projeto com arduino, ele enviará dados via serial para o PC e quero tratar os dados em C. Segue o código:


#include <stdio.h> // Inclui bibioteca de entrada/saida de texto
#include <mysql/mysql.h> // Inclui a biblioteca de conexão com banco de dados

#define HOST "localhost"
#define USER "root"
#define PASS "pass"
#define DB "database"

FILE *port;
MYSQL con;

void MySql()
{
mysql_init(&con);
if(!mysql_real_connect(&con, HOST, USER, PASS, DB, 0, NULL, 0))
{
printf("Falha de conexao\n");
printf("Erro %d : %s\n", mysql_errno(&con), mysql_error(&con));
exit(0);
}
}

void Port()
{
port = fopen("ttyACM0", "r");

if(!port) printf("Ocorreu um erro ao tentar ler a porta! \n\n");
}

int main(void)
{

MySql(); // Conectando-se ao banco de dados

printf("################################################### \n");
printf("#################### Sistema ##################### \n");
printf("################################################### \n\n");

Port(); // Leitura da porta de comunicação com o arduino

char *get;

while(1)
{
get = getc(port);
printf("%s", get);
}

return 0; // Fecha o programa
}


Compilo com o comando:

gcc nome.c -o nome -l mysqlclient

E sai o erro:

nome.c: Na função ‘main’:
nome.c:49:7: aviso: assignment makes pointer from integer without a cast [habilitado por padrão]

A linha em questão é essa: get = getc(port); ... Mas preciso que a variável get seja char pois na porta passara letras e números, mesmo assim compila e quando vou executar aparece:

###################################################
######## Sistema de compras inteligente #########
###################################################

Ocorreu um erro ao tentar ler a porta!

Falha de segmentação (imagem do núcleo gravada)


Era pra conseguir ler a porta, está tudo correto. E esse erro de segmentação eu não entendi oque significa.


Alguém pode me ajudar??




  


2. Re: [Dúvida] - Erros na manipulação de arquivos [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/10/2013 - 08:38h

A função getc() devolve um valor do tipo int. Desse modo, você deveria declarar a variável que recebe o valor por ela retornado como int.

No seu programa, você declarou get como ponteiro para caracteres. Uma variável do tipo ponteiro serve para armazenar endereços de memória onde possa haver dados, não para guardar os dados, em si.

Imaginando a execução do seu programa, da forma como ele está, se você enviar para porta serial a letra "A", cujo valor decimal correspondente é 65, a variável get vai entender aquilo como sendo o endereço 65 da memória. Faz sentido? Você sabe o que existe na posição 65 da memória? Sabe ao menos se a posição 65 realmente foi alocada pelo sistema operacional para o seu programa? Depois, quando mais tarde você tentar usar esse endereço como argumento da função printf() para obter uma string, seu programa falha porque provavelmente não tem autorização para usar a referida posição de memória.

A forma de corrigir é:

  1) Trocar o tipo de get para int (aliás, trocar o nome da variável para algo mais descritivo também não seria má ideia).

  2) Trocar a conversão "%s" (imprimir a string situada no endereço indicado por um ponteiro) na chamada a printf() por "%c" (imprimir o caráter indicado por um argumento inteiro).

Você não precisa ter medo de usar int pelo fato de ter de ler tanto caracteres quanto números, até porque, no fim das contas, tudo o que o computador manipula são números. Mesmo o tipo char, apesar do nome, é um inteiro em C, só que uma precisão possivelmente menor do que int (por exemplo, 8 bits para char e 32 para int). A notação 'A' significa literalmente "o valor numérico correspondente ao símbolo A".

Além disso, a função getc() retorna um valor do tipo int, e não char, para poder indicar erros: se o valor retornado for maior que ou igual a zero, então se conseguiu ler um caráter válido; caso contrário, o valor retornado será negativo (mais especificamente, terá o valor da constante EOF, que normalmente vale -1). Depois de você determinar que a leitura foi bem sucedida, você pode, se quiser, mover o dado lido para uma variável do tipo char e seguir trabalhando com ela.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts