1

我已经阅读了类似的问题,但在这种情况下,我无法找到一个可以帮助我理解此警告的问题。我在尝试学习 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 的部分。

4

2 回答 2

8

char是有符号类型。uint8_t未签名。因此,您将指向无符号类型的指针传递给需要签名的函数。你有几个选择:

1)将函数签名更改为接受uint8_t*而不是char*

2) 更改您传递给的参数类型,char*而不是uint8_t*(即更改data为 be char)。

3) 在调用函数时执行显式转换(不太可取的选项)。

(或者忽略警告,我不包括在内,认为它是错误的)

于 2015-07-30T17:17:23.923 回答
1

您正在发送类型的地址uint8_t

res = read_byte(&data);

并将其接收为char *

char read_byte(char * data) 
于 2015-07-30T17:15:22.093 回答