[gcc] Warning imcomprehensible

Warning imcomprehensible [gcc] - C - Programmation

Marsh Posté le 21-01-2006 à 14:50:56    

Bonjour,
 
Sous Linux avec gcc version 4.0.3, j'ai un warning qui revient souvent du type:
 

Code :
  1. warning: pointer targets in passing argument 1 of 'strcpy' differ in signedness


avec ce source:

Code :
  1. unsigned char buff[16] ;
  2. strcpy(buff, "Bonjour\n\r" ) ;


 
Ce message apparait maintenant sytématiquement avec les fonctions strings en autre.
Ce n'est pas bloquant puisque c'est seulement un 'warning', mais j'aimerais bien en connaitre la cause.
 
 
merci pour toute information à ce sujet

Reply

Marsh Posté le 21-01-2006 à 14:50:56   

Reply

Marsh Posté le 21-01-2006 à 15:12:36    

Voilà la fonction :
 
Library:   string.h
 
Prototype: char strcpy(char *s1, const char *s2);
 
Syntax:    
    char string2[20]="red dwarf";
    char string1[20]="";
           strcpy(string1, string2);
 
Donc dans ton exemple tu peut pas copier un char dans un unsigned char.

Reply

Marsh Posté le 21-01-2006 à 15:16:44    

malouin35 a écrit :

Voilà la fonction :
 
Library:   string.h
 
Prototype: char strcpy(char *s1, const char *s2);
 
Syntax:    
    char string2[20]="red dwarf";
    char string1[20]="";
           strcpy(string1, string2);
 
Donc dans ton exemple tu peut pas copier un char dans un unsigned char.


Et puis faut pas oublier d'inclure "<strings.h>"...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 21-01-2006 à 15:36:16    

malouin35 a écrit :

Voilà la fonction :
 
Library:   string.h
 
Prototype: char strcpy(char *s1, const char *s2);
 
Syntax:    
    char string2[20]="red dwarf";
    char string1[20]="";
           strcpy(string1, string2);
 
Donc dans ton exemple tu peut pas copier un char dans un unsigned char.


 
Effectivement, il ne veux pas des "unsigned char", même en copiant un unsigned char dans un autre unsigned char.
C'est bizarre, avec une  version plus ancienne de gcc, je n'avais pas ce warning.
 
Merci pour cette précision.

Reply

Marsh Posté le 21-01-2006 à 15:45:03    

gcc-4.0.3 ?  

Reply

Marsh Posté le 21-01-2006 à 17:12:43    

domos a écrit :

warning: pointer targets in passing argument 1 of 'strcpy' differ in signedness


avec ce source:

unsigned char buff[16] ;
strcpy(buff, "Bonjour\n\r" ) ;




Pourquoi unsigned ? Le bon type pour les chaines de caractères, c'est char. Point. strcpy() attend l'adresse d'un char, pas d'un unsigned char.

Message cité 2 fois
Message édité par Emmanuel Delahaye le 21-01-2006 à 17:13:54

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2006 à 08:41:41    

Emmanuel Delahaye a écrit :

Pourquoi unsigned ? Le bon type pour les chaines de caractères, c'est char. Point. strcpy() attend l'adresse d'un char, pas d'un unsigned char.


 
Désolé de froisser les puristes.
Je ne maitrise pas le language C.
 
J'ai repris une partie de code dans un ex. et la compilation passait sans warning avec un version gcc + ancienne.
Je ne comprenais pas le message mais on me l'a aimablement expliqué plut haut.
 
Maintenant, c'est plus clair.
 
voilà

Reply

Marsh Posté le 23-01-2006 à 09:01:22    

domos a écrit :

Je ne maitrise pas le language C.


Il ne tient qu'à toi de le maitriser...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-01-2006 à 17:12:01    

Emmanuel Delahaye a écrit :

Pourquoi unsigned ? Le bon type pour les chaines de caractères, c'est char. Point.


Mais pourquoi donc ?
Une chaîne de caractères est une suite de codes ascii. La table des codes ascii allant de 0 à 127 (voire de 0 à 255), il serait logique de la déclarer comme une suite de valeurs non signées non ???
En plus, que je déclare

char tab[]="A"

ou

unsigned char tab[]="A"


J'aurai toujours la même valeur binaire "0100 0001" dans "tab[0]"...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-01-2006 à 17:46:17    

Emmanuel Delahaye a écrit :

Il ne tient qu'à toi de le maitriser...


 
en même temps a-t-on en général vraiment BESOIN de maitriser le C ?
 
....

Reply

Marsh Posté le 24-01-2006 à 17:46:17   

Reply

Marsh Posté le 24-01-2006 à 17:51:54    

bin pour ecrire un programme en C, je vois pas comment trop faire autrement ? oO


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 24-01-2006 à 18:01:56    

Sve@r a écrit :

Mais pourquoi donc ?
Une chaîne de caractères est une suite de codes ascii. La table des codes ascii allant de 0 à 127 (voire de 0 à 255), il serait logique de la déclarer comme une suite de valeurs non signées non ???
En plus, que je déclare

char tab[]="A"

ou

unsigned char tab[]="A"


J'aurai toujours la même valeur binaire "0100 0001" dans "tab[0]"...


Parce que c'est écrit dans la définition du langage C et pour des raisons probablement historiques qui me dépassent (demande sur news:comp.lang.c). D'ailleurs, toutes les fonctions standards manipulant des chaines ont des paramètres de type char * et non unsigned char *.


Message édité par Emmanuel Delahaye le 24-01-2006 à 18:02:39

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-01-2006 à 13:04:11    

ni signed char * d'ailleurs. Mais char peut être égal à l'un des deux.

Reply

Marsh Posté le 25-01-2006 à 13:12:19    

Tarabiscote a écrit :

ni signed char * d'ailleurs. Mais char peut être égal à l'un des deux.


Exact, j'ai oublié de préciser que, selon l'implémentation (ou un reglage du compilateur), un char sera en réalité un unsigned char ou un signed char.
 
Le choix du char (aka plain char) est une façon de régler le problème de la portabilité.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed