Цели указателя в передаваемом аргументе отличаются подписью
Я прочитал похожие вопросы, но мне не удалось найти такой, который помог бы мне понять это предупреждение в этом случае. Я на первой неделе пытаюсь выучить C, поэтому заранее извиняюсь.
Я получаю следующее предупреждение и примечание:
In function 'read_line':
warning: pointer targets in passing argument 1 of 'read_byte' differ in signedness [-Wpointer-sign]
res = read_byte(&data);
^
note: expected 'char *' but argument is of type 'uint8_t *'
char read_byte(char * data)
При попытке скомпилировать этот код:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
char read_byte(char * data)
{
if(fs > 0 )
{
int n = read(fs, data, 1);
if (n < 0)
{
fprintf(stderr, "Read error\n");
return 1;
}
}
return *data;
}
uint8_t read_line(char * linebuf)
{
uint8_t data, res;
char * ptr = linebuf;
do
{
res = read_byte(&data);
if( res < 0 )
{
fprintf(stderr, "res < 0\n");
break;
}
switch ( data )
{
case '\r' :
break;
case '\n' :
break;
default :
*(ptr++) = data;
break;
}
}while(data != '\n');
*ptr = 0; // terminaison
return res;
}
int main(int argc, char **argv)
{
char buf[128];
if( read_line(buf) == 10 )
{
// parse data
}
close(fs);
return 0;
}
Я удалил ненужную часть, включая ту, которая открывает порт и инициализирует фс.
2 ответа
char
это подписанный тип. uint8_t
без знака Таким образом, вы передаете указатель на неподписанный тип функции, для которой требуется подпись. У вас есть несколько вариантов:
1) Измените подпись функции, чтобы принять uint8_t*
вместо char*
2) Измените тип параметра, который вы передаете char*
вместо uint8_t*
(т.е. изменить data
быть char
).
3) Выполнить явное приведение при вызове функции (менее предпочтительный вариант).
(Или проигнорируйте предупреждение, которое я не включаю в качестве опции, считая его неправильным)
Вы отправляете адрес типа uint8_t
res = read_byte(&data);
И получать его как char *
char read_byte(char * data)