|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
[C] GCC Warning inspiegabile [RISOLTO]
il seguente programmino compilato con il comando:
~$ gcc -Wconversion bool.c -o bool.x bool.c: In function ‘main’: bool.c:23: warning: passing argument 1 of ‘isTrue’ with different width due to prototype Codice:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#define BSIZE 10
const char* isTrue(bool test) {
return test?"True":"False";
}
int main(void) {
bool yes = 1;
bool no = 0;
bool * iseven = (bool *) malloc (BSIZE*sizeof(bool));
size_t i;
for (i=0; i<BSIZE; ++i) {
if (i%2==0) {
iseven[i]=yes;
} else {
iseven[i]=no;
}
}
for (i=0; i<BSIZE; ++i) {
printf("%d is even: %s\n",i, isTrue(iseven[i]));
}
free(iseven);
return 0;
}
(Non mi dite di togliere la flag -Wconversion perché non vale...) EDIT: ma porc#@! alla fine l' unica soluzione possibile è *NON* usare -Wconversion ![]() EDIT_2: -Wconversion potrà essere usata con gcc --version >= 4.3 (in sviluppo)
__________________
Xbox360+BenQT2200HDA Ultima modifica di sheijtan : 20-02-2007 alle 17:52. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
trovato googlando:
Don't use -Wconversion. It is useless with ISO-C code. It is only usefull if you want to add prototypes to K&R-C code, and want to know about cases where `foo (char)' is actually `foo (int)' in absense of prototypes. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
Quote:
. Voglio dire: -Wconversion dovrebbe avvertire se ci sono delle conversioni implicite, ma nel mio esempio non ce ne dovrebbero essere, o no?!
__________________
Xbox360+BenQT2200HDA |
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
a me pare di si... bool ha la stessa dimensione di char, quindi...
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
Quindi cosa? lascia perdere la risposta di vizzz. Nel mio es. che è anche il mio problema io passo un bool ad una funzione che si aspetta un bool e gcc dice che avviene una conversione. Perché?
__________________
Xbox360+BenQT2200HDA |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
nessuno ne sa niente? Sto scrivendo codice numerico e quella flag del compilatore mi serve:
__________________
Xbox360+BenQT2200HDA |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
|
Se ricordo bene ( ho avuto tale problema anta anni fà
-Wconversion il compilatore si aspetta "old like" stile per le funzioni, ovvero invece di : const char* isTrue(bool test) { return test?"True":"False"; } dovresti scrivere : const char* isTrue(test) bool test; { return test?"True":"False"; } cosi dovrebbe compilare, nell'altro caso non compila perchè suppongo che il compilatore non trovi il prototipo di bool ( anche con char è uguale ) è faccia automaticamente la promozione a int e di li il warning per il tipo diverso di dati ( bool <-> int ) prova e fammi sapere
__________________
Puffo Programmatore su Puffolandia Groups Il Software è come il Sesso, è meglio quando è Libero |
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
@CoreDump
Ho provato ma non funziona: ~$ gcc -Wconversion bool.c -o bool.x bool.c: In function ‘isTrue’: bool.c:7: error: ‘test’ redeclared as different kind of symbol bool.c:6: error: previous definition of ‘test’ was here credo che la dichiarazione old-style sia troppo ...@71104 però, seguendo il tuo ragionamento, anche un char andrebbe incontro a problemi analoghi, o no? cmq, grazie ragazzi per i vari suggerimenti, alla fine si impara sempre qualcosa .
__________________
Xbox360+BenQT2200HDA |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
@71104
la tua osservazione mi suggerito di provare a definire il tipo bool in due modi: Codice:
typedef unsigned int bool Codice:
typedef unsigned short int bool
__________________
Xbox360+BenQT2200HDA |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
|
Quote:
non mi ritrovo sotto mano Edit: Ho provato con il gcc 3.3.5 su una Unix/Solaris ( la prima che mi trovavo sottomano problemi
__________________
Puffo Programmatore su Puffolandia Groups Il Software è come il Sesso, è meglio quando è Libero Ultima modifica di CoreDump : 20-02-2007 alle 13:07. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
|
Quote:
__________________
Puffo Programmatore su Puffolandia Groups Il Software è come il Sesso, è meglio quando è Libero |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
é la prima volta che vedo questo errore e se ti interessa puoi risolverlo cosí:
Codice:
#undef bool typedef int bool; Codice:
printf("bool <%i>\n", sizeof(bool));
![]() EDIT: ho provato anche la ol-style (che aborro) e compila senza problemi, su Linux.
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve Ultima modifica di trallallero : 20-02-2007 alle 13:48. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
c' hai ragione così funziona! Avevo sbagliato io a digitare il tuo esempio:
invece di Codice:
char*
isTrue (test)
bool test;
{
/*body*/
}
Codice:
char*
isTrue (test)
{
bool test;
/*body*/
}
Grazie mille! Ehm, un' ultima cosa: perché dichiarando la funzione nel modo da te suggerito funziona? Il codice prodotto nei due casi dal compilatore sarà diverso?
__________________
Xbox360+BenQT2200HDA |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
Quote:
sì con la dichiarazione old-style tutto va liscio, però vorrei evitare di usarla. Probabilmente userò una mia definizione di bool: stavo pensando a un Codice:
typedef unsigned int bool;
__________________
Xbox360+BenQT2200HDA |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
|
Quote:
non riesca a risalire al tipo di dato ( bool ) e per default promuova il tipo di dato da bool a int ( che è quello di default ) e da li il "warning: passing argument 1 of ‘isTrue’ with different width due to prototype" nel secondo esempio invece con la funzione dichiarata in old-like style il compilatore riesce a risalire al tipo di dato e quindi non genera l'errore, questo spiega anche perchè usando una nuova definizione come hai proposto tu la cosa funzioni
__________________
Puffo Programmatore su Puffolandia Groups Il Software è come il Sesso, è meglio quando è Libero Ultima modifica di CoreDump : 20-02-2007 alle 14:45. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
#define true 1 #define false 0
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
|
Quote:
funzioncina e come tipo di dati passato prova a usare char o float
__________________
Puffo Programmatore su Puffolandia Groups Il Software è come il Sesso, è meglio quando è Libero |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 380
|
Quote:
Codice:
typedef unsigned short int bool; Sembra che sia importante il sizeof() dell' intero usato per definire il bool e questo in effetti tornerebbe con la tua spiegazione.
__________________
Xbox360+BenQT2200HDA |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
a me andava con l'unsigned int perché avevo lasciato la old-style
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:55.













. Voglio dire: -Wconversion dovrebbe avvertire se ci sono delle conversioni implicite, ma nel mio esempio non ce ne dovrebbero essere, o no?!

aborro) e compila senza problemi, su Linux.








