2015-07-30 2 views
0

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

я удалил бесполезную часть, включая тот, который открывает порт и инициализирует фс.

+0

если 'res' короток для' result', то почему бы не использовать 'int's и возвращать TRUE, или ЛОЖНЫЙ? Кажется мне намного яснее. В настоящее время у вас непоследовательное использование 'res' и' data'. –

+0

Действительно, (res <0) бесполезно. Но в каких случаях возвращать TRUE или FALSE? – ogs

ответ

0

Вы отправляете адрес типа uint8_t

res = read_byte(&data); 

И получать его как char *

char read_byte(char * data) 
3

char подписан тип. uint8_t неподписан. Таким образом, вы передаете указатель на неподписанный тип функции, которая должна быть подписана. У вас есть несколько вариантов:

1) Изменить функцию подписи принять uint8_t* вместо char*

2) Изменить тип параметра вы проходящие в char* вместо uint8_t* (то есть изменить data быть char).

3) Выполните явное приведение при вызове функции (менее предпочтительной опции).

(или проигнорировать предупреждение, которое я не включаю в качестве опции, считая его неправильным)

+0

Собственно, вы * можете * безопасно игнорировать предупреждение. Стандарт C позволяет получить доступ к * любому * типу с помощью указателя на тип символа. – EOF

+0

@EOF Я согласен, но это может перерасти в плохую привычку. –

+1

Единственное, что я рекомендую, - это лить 'uint8_t *' на 'void *' перед тем, как передать его функции, ожидающей 'char *'. – EOF

 Смежные вопросы

  • Нет связанных вопросов^_^