Цели указателя в передаваемом аргументе отличаются подписью

Я прочитал похожие вопросы, но мне не удалось найти такой, который помог бы мне понять это предупреждение в этом случае. Я на первой неделе пытаюсь выучить 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) 
Другие вопросы по тегам