我已经阅读了类似的问题,但在这种情况下,我找不到能帮助我理解这个警告的问题。我正在尝试学习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;
}
我删除了无用的部分,包括打开端口并初始化fs的部分。
答案 0 :(得分:5)
char
是签名类型。 uint8_t
未签名。因此,您将指向无符号类型的指针传递给需要签名的函数。您有几种选择:
1)更改功能签名以接受uint8_t*
而不是char*
2)将您传递的参数类型更改为char*
而不是uint8_t*
(即将data
更改为char
)。
3)调用函数时执行显式转换(不太优选的选项)。
(或者忽略警告,我不会将其作为选项包括在内,认为它错了)
答案 1 :(得分:1)
您要发送uint8_t
res = read_byte(&data);
并以char *
char read_byte(char * data)