Warning bei isdigit
-
Hallo zusammen,
kann mir jemand erklaeren, warum ich folgende Warnung bekomme:xspwld.c:757: warning: subscript has type `char'
ich habe ein Feld von chars definiert
char line[256];
und dann isdigit in Zeile 757 folgendermassen aufgerufen.
if( isdigit(line[0]) ){ ...Ich benutze gcc version 3.4.3 auf HPUX.
-
#include <ctype.h> int isdigit( int ch );
wenn du die warning nicht haben willst, dann mach einfach einen expliziten cast
-
kann man die Warnung denn gefahrlos ignorieren?
-
Nein, eigentlich nicht, da diese Warnung überhaupt nicht auftreten dürfte. Char ist kleiner als int und damit ohne Nebenwirkungen in int konvertierbar. Dabei warnt i.A. niemand. Ausserdem bilde ich mir ein dass "Subscript" der Index ist, und nicht der Parameter an isdigit. Und dass die Zahl 0 als char interpretiert wird halte ich auch für unwahrscheinlich.
Sicher dass da nicht line['0'] oder sowas steht?
-
bekomme die Warnung auch hier:
int PF_AsToIn(char *s,int size){
int i;for(i=0;i<size;i++){
if(isdigit(s[i])){ ...
-
Und steht da noch etwas in der Zeile? Oder wofür stehen die "..."?
-
Auf welchen Teil des Ausdrucks bezieht sich eigentlich die Warnung?
Sprich - nimm mal die beiden Codes und schau nach, bei welchem eine Warnung ausgegeben wird:
if(isdigit('0')) ...
if(line[0]=='0') ...
-
habe gerade mal die Compileroption -Wall rausgenommen und dafuer -Wchar-subscripts reingenommen. Jetzt bekomme ich nur noch diese Warnungen.
Im Manual steht:-Wchar-subscripts
Warn if an array subscript has type char. This is a common cause of error, as programmers often forget that this type is signed on some machines.Hilft das weiter? Mir sagt das nichts.
In der isdigit Zeile steht uebrigens nicht weiter. Mit ... wollte ich nur sagen,
das es irgendwie weitergeht, aber in der naechsten Zeile.
-
Eigentlich sehe ich in dem Code nur einen Subscript - und der verwendet keinen char. Von daher ist die Warnmeldung einfach nur rätselhaft. Hast du mal ausprobiert, ob (und welcher) einer der beiden Testcodes diese Warnung produziert?
-
#include <stdio.h>
#include <ctype.h>int main(int argc, char *argv[]){
char line[100];if(isdigit('0')){
printf("Fall 1\n");
}if(line[0]=='0'){
printf("Fall 2\n");
}if(isdigit(line[0])){
printf("Fall 3\n");
}return 0;
}Nur der dritte Fall produziert die Warnung.
warning: subscript has type `char'
-
> Nur der dritte Fall produziert die Warnung.
> warning: subscript has type `char'der doofe 'GCC' weiss nicht, ob 'signed' oder 'unsigned' -char gemeint ist und meckert deshalb. in den beiden vorherigen codes ist alles 'int' (int ist immer signed, auch der typ eines character literals ist 'int'), deshalb mault er dabei nicht.
-
Ist isdigit hier möglicherweise ein Makro?
-
Wie kriege ich das raus, ob es ein Makro ist?
-
Indem du die <ctype.h> einmal nach dem Bezeichner "isdigit" durchsuchst
-
habe da sowas drin gefunden
#ifdef _PROTOTYPES
...
extern int _isdigit(int);
...
# else /* not _PROTOTYPES /
...
extern int _isdigit();
...
#endif / _PROTOTYPES */# define isdigit(__c) (__SB_masks ? (int)__SB_masks[__c] & _ISDIGIT \
: _isdigit(__c))
-
skoll1 schrieb:
# define isdigit(__c) (__SB_masks ? (int)__SB_masks[__c] & _ISDIGIT \
: _isdigit(__c))Da habe wir es doch - es ist ein Makro - und dort haben wir auch den Subscript, der dem Compiler auf den Magen geschlagen ist.
-
Hätte nicht ein Bibliothekshersteller, der den Standard int isdigit(int) erfüllen möchte, das Subscript auf int casten müssen um diese Warnung zu unterbinden? Sprich, kann man das als Fehler in der Implementierung betrachten?
-
Die Warnung ist schon berechtigt. Das Argument soll laut Standard ein int mit dem Wert eines unsigned char oder EOF sein. Mit einem char, der signed ist, können hier unerlaubte Werte auftreten.
-
Kann euch jetzt nicht mehr so ganz folgen. Was koennte ich machen, um 100% warnungsfreien Code zu erzeugen selbst mit der Compileroption -Wall? Der Compiler stoert sich nur noch an dieser Sache und an einer prinft Formatierung.
Die Zeile:
fprintf(nasbulk,"%+6x",*contic);
liefert folgende Meldung:
xpdset.c:36: warning:+' flag used with
%x' printf format
Ich vermute aber, das + bei %+6x ist einfach ueberfluessig, oder was koennte die Absicht gewesen sein.
-
skoll1 schrieb:
Kann euch jetzt nicht mehr so ganz folgen. Was koennte ich machen, um 100% warnungsfreien Code zu erzeugen selbst mit der Compileroption -Wall? Der Compiler stoert sich nur noch an dieser Sache und an einer prinft Formatierung.
Du könntest deine Variable definieren als [c]unsigned char line[256];[/c]
Die Zeile:
fprintf(nasbulk,"%+6x",*contic);
liefert folgende Meldung:
xpdset.c:36: warning:+' flag used with
%x' printf format
Ich vermute aber, das + bei %+6x ist einfach ueberfluessig, oder was koennte die Absicht gewesen sein.Eigentlich schreibt %x vorzeichenlose Zahlenwerte, da sind irgendwelche Vorzeichenkennungen überflüssig - %6x sollte ausreichen.