gcc e quesito importante
Moderatore: Staff
Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- Sari
- Linux 3.x
- Messaggi: 584
- Iscritto il: mer 16 feb 2005, 0:00
- Slackware: 12.1
- Kernel: 2.6.24
- Desktop: Gnome
- Località: Verona
gcc e quesito importante
spesso e volentieri o a che fare con questo linguaggio (ogni giorno per
<BR>ore ), e con il compilatore gcc della mia slackware 10.1.<br />
<BR>Oggi mi e´ capitata una cosa molto strana e ora ve la spiego.<br />
<BR><br />
<BR>Ho una struttura di questo genere<br />
<BR><br />
<BR>typedef struct char_data CHAR_DATA;<br />
<BR><br />
<BR>struct char_data<br />
<BR>{<br />
<BR> CHAR_DATA * next;<br />
<BR> CHAR_DATA * prev;<br />
<BR> CHAR_DATA * next_in_room;<br />
<BR> CHAR_DATA * prev_in_room;<br />
<BR> CHAR_DATA * master;<br />
<BR> CHAR_DATA * leader;<br />
<BR> FIGHT_DATA * fighting;<br />
<BR> CHAR_DATA * reply;<br />
<BR> CHAR_DATA * retell;<br />
<BR> CHAR_DATA * switched;<br />
<BR> CHAR_DATA * mount;<br />
<BR> HHF_DATA * hunting;<br />
<BR> HHF_DATA * fearing;<br />
<BR> HHF_DATA * hating;<br />
<BR> SPEC_FUN * spec_fun;<br />
<BR> MPROG_ACT_LIST * mpact;<br />
<BR> int mpactnum;<br />
<BR> sh_int mpscriptpos;<br />
<BR> MOB_INDEX_DATA * pIndexData;<br />
<BR> int mob_editor;<br />
<BR> DESCRIPTOR_DATA * desc;<br />
<BR> AFFECT_DATA * first_affect;<br />
<BR> AFFECT_DATA * last_affect;<br />
<BR> NOTE_DATA * pnote;<br />
<BR> NOTE_DATA * comments;<br />
<BR> OBJ_DATA * first_carrying;<br />
<BR> OBJ_DATA * last_carrying;<br />
<BR> ROOM_INDEX_DATA * in_room;<br />
<BR> ROOM_INDEX_DATA * was_in_room;<br />
<BR> PC_DATA * pcdata;<br />
<BR> DO_FUN * last_cmd;<br />
<BR> DO_FUN * prev_cmd; /* mapping */<br />
<BR> void * dest_buf; /* This one is to assign to differen things */<br />
<BR> <br />
<BR> eccetera eccetera eccetera <br />
<BR> <br />
<BR> sh_int count; <br />
<BR><br />
<BR>};<br />
<BR><br />
<BR>dove sh_int e´ uno short int giustamente definito.<br />
<BR><br />
<BR><br />
<BR>ed ora il bello<br />
<BR><br />
<BR>- Dichiaro e riempio una struttura di CHAR_DATA<br />
<BR>- ne tiro fuori uno con un ciclo for<br />
<BR><br />
<BR>CHAR_DATA *ch;<br />
<BR>CHAR_DATA *ch_next;<br />
<BR><br />
<BR>for ( ch = first_char; ch; ch = ch_next )<br />
<BR>{<br />
<BR>ch_next = ch->next;<br />
<BR><br />
<BR> <br />
<BR>
<BR>/* all´interno di una funzione ho questo if */<br />
<BR>
<BR>if ( ---ch->count <= 0 )<br />
<BR>
<BR>{<br />
<BR>
<BR> /* blblbl */<br />
<BR>
<BR>}<br />
<BR><br />
<BR>}<br />
<BR><br />
<BR><br />
<BR>quel --ch->count dovrebbe decrementarmi il contatore count, elemento della struttura ch ?<br />
<BR>quell´if e´ equivalente a if ( ( ( ch->count -= 1 ) + 1 ) <= 0 ) ?<br />
<BR><br />
<BR>quel --ch->count, seguendo con vari metodi il codice, va a
<BR>decrementare tutt´altro che ch->count decrementa un´altro
<BR>elemento intero ( non short int ) di un´altro elemento della struttura
<BR>CHAR_DATA, cioe´ un macello .<br />
<BR>Il fatto e´ che per il gcc quelle due forme sono equivalenti (un
<BR>semplice make non va a ricreare il file .o dal sorgente .c )....
<BR>provare per credere.<br />
<BR>Qualcuno mi spiega il motivo?<br /><br>
<BR>ore ), e con il compilatore gcc della mia slackware 10.1.<br />
<BR>Oggi mi e´ capitata una cosa molto strana e ora ve la spiego.<br />
<BR><br />
<BR>Ho una struttura di questo genere<br />
<BR><br />
<BR>typedef struct char_data CHAR_DATA;<br />
<BR><br />
<BR>struct char_data<br />
<BR>{<br />
<BR> CHAR_DATA * next;<br />
<BR> CHAR_DATA * prev;<br />
<BR> CHAR_DATA * next_in_room;<br />
<BR> CHAR_DATA * prev_in_room;<br />
<BR> CHAR_DATA * master;<br />
<BR> CHAR_DATA * leader;<br />
<BR> FIGHT_DATA * fighting;<br />
<BR> CHAR_DATA * reply;<br />
<BR> CHAR_DATA * retell;<br />
<BR> CHAR_DATA * switched;<br />
<BR> CHAR_DATA * mount;<br />
<BR> HHF_DATA * hunting;<br />
<BR> HHF_DATA * fearing;<br />
<BR> HHF_DATA * hating;<br />
<BR> SPEC_FUN * spec_fun;<br />
<BR> MPROG_ACT_LIST * mpact;<br />
<BR> int mpactnum;<br />
<BR> sh_int mpscriptpos;<br />
<BR> MOB_INDEX_DATA * pIndexData;<br />
<BR> int mob_editor;<br />
<BR> DESCRIPTOR_DATA * desc;<br />
<BR> AFFECT_DATA * first_affect;<br />
<BR> AFFECT_DATA * last_affect;<br />
<BR> NOTE_DATA * pnote;<br />
<BR> NOTE_DATA * comments;<br />
<BR> OBJ_DATA * first_carrying;<br />
<BR> OBJ_DATA * last_carrying;<br />
<BR> ROOM_INDEX_DATA * in_room;<br />
<BR> ROOM_INDEX_DATA * was_in_room;<br />
<BR> PC_DATA * pcdata;<br />
<BR> DO_FUN * last_cmd;<br />
<BR> DO_FUN * prev_cmd; /* mapping */<br />
<BR> void * dest_buf; /* This one is to assign to differen things */<br />
<BR> <br />
<BR> eccetera eccetera eccetera <br />
<BR> <br />
<BR> sh_int count; <br />
<BR><br />
<BR>};<br />
<BR><br />
<BR>dove sh_int e´ uno short int giustamente definito.<br />
<BR><br />
<BR><br />
<BR>ed ora il bello<br />
<BR><br />
<BR>- Dichiaro e riempio una struttura di CHAR_DATA<br />
<BR>- ne tiro fuori uno con un ciclo for<br />
<BR><br />
<BR>CHAR_DATA *ch;<br />
<BR>CHAR_DATA *ch_next;<br />
<BR><br />
<BR>for ( ch = first_char; ch; ch = ch_next )<br />
<BR>{<br />
<BR>ch_next = ch->next;<br />
<BR><br />
<BR> <br />
<BR>
<BR>/* all´interno di una funzione ho questo if */<br />
<BR>
<BR>if ( ---ch->count <= 0 )<br />
<BR>
<BR>{<br />
<BR>
<BR> /* blblbl */<br />
<BR>
<BR>}<br />
<BR><br />
<BR>}<br />
<BR><br />
<BR><br />
<BR>quel --ch->count dovrebbe decrementarmi il contatore count, elemento della struttura ch ?<br />
<BR>quell´if e´ equivalente a if ( ( ( ch->count -= 1 ) + 1 ) <= 0 ) ?<br />
<BR><br />
<BR>quel --ch->count, seguendo con vari metodi il codice, va a
<BR>decrementare tutt´altro che ch->count decrementa un´altro
<BR>elemento intero ( non short int ) di un´altro elemento della struttura
<BR>CHAR_DATA, cioe´ un macello .<br />
<BR>Il fatto e´ che per il gcc quelle due forme sono equivalenti (un
<BR>semplice make non va a ricreare il file .o dal sorgente .c )....
<BR>provare per credere.<br />
<BR>Qualcuno mi spiega il motivo?<br /><br>
- useless
- Staff
- Messaggi: 3896
- Iscritto il: dom 12 ott 2003, 0:00
- Località: A place where the streets have no name
- Contatta:
gcc e quesito importante
if ( ---ch->count <= 0 )
<BR>
<BR>nota che hai scritto 3 meno (---). è solo un errore di trascrizione? eventualmente prova anche a usare un po´ di parentesi: --(ch -> count); se non altro è + leggibile .<br>
<BR>
<BR>nota che hai scritto 3 meno (---). è solo un errore di trascrizione? eventualmente prova anche a usare un po´ di parentesi: --(ch -> count); se non altro è + leggibile .<br>
- Sari
- Linux 3.x
- Messaggi: 584
- Iscritto il: mer 16 feb 2005, 0:00
- Slackware: 12.1
- Kernel: 2.6.24
- Desktop: Gnome
- Località: Verona
gcc e quesito importante
sisi errore di trascrizione <br /><br>
gcc e quesito importante
prova ch->count -= 1<br />
<BR><br />
<BR>ciao, rob<br />
<BR><br /><br>
<BR><br />
<BR>ciao, rob<br />
<BR><br /><br>
- Sari
- Linux 3.x
- Messaggi: 584
- Iscritto il: mer 16 feb 2005, 0:00
- Slackware: 12.1
- Kernel: 2.6.24
- Desktop: Gnome
- Località: Verona
gcc e quesito importante
si lo so che con ch->count -= 1 funziona tutto, ma perche´ il gcc mi
<BR>deve riconoscere entrambe le forme (quella sbagliata e quella giusta)
<BR>come uguali?<br /><br>
<BR>deve riconoscere entrambe le forme (quella sbagliata e quella giusta)
<BR>come uguali?<br /><br>
- useless
- Staff
- Messaggi: 3896
- Iscritto il: dom 12 ott 2003, 0:00
- Località: A place where the streets have no name
- Contatta:
gcc e quesito importante
<!-- BBCode Quote Start --><TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD><font size=-1>Quote:</font><HR></TD></TR><TR><TD><FONT SIZE=-1><BLOCKQUOTE>
<BR>sukko@ccl10 ~ $ pico test.c
<BR>#include <stdio.h>
<BR>
<BR>typedef struct test_s {
<BR> short int sint;
<BR>} test;
<BR>
<BR>int main (void) {
<BR> test *t;
<BR>
<BR> t = (test *) malloc (sizeof (test));
<BR> t -> sint = 99;
<BR> printf ("Ora t -> sint vale %d\n", t -> sint);
<BR> --t -> sint;
<BR> printf ("Dopo il decremento t -> sint vale %d\n", t -> sint);
<BR>
<BR> free (t);
<BR> return (0);
<BR>}
<BR>
<BR>sukko@ccl10 ~ $ gcc test.c
<BR>sukko@ccl10 ~ $ ./a.out
<BR>Ora t -> sint vale 99
<BR>Dopo il decremento t -> sint vale 98
<BR></BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode Quote End -->
<BR>
<BR>non capisco dove sia il problema!<br>
<BR>sukko@ccl10 ~ $ pico test.c
<BR>#include <stdio.h>
<BR>
<BR>typedef struct test_s {
<BR> short int sint;
<BR>} test;
<BR>
<BR>int main (void) {
<BR> test *t;
<BR>
<BR> t = (test *) malloc (sizeof (test));
<BR> t -> sint = 99;
<BR> printf ("Ora t -> sint vale %d\n", t -> sint);
<BR> --t -> sint;
<BR> printf ("Dopo il decremento t -> sint vale %d\n", t -> sint);
<BR>
<BR> free (t);
<BR> return (0);
<BR>}
<BR>
<BR>sukko@ccl10 ~ $ gcc test.c
<BR>sukko@ccl10 ~ $ ./a.out
<BR>Ora t -> sint vale 99
<BR>Dopo il decremento t -> sint vale 98
<BR></BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode Quote End -->
<BR>
<BR>non capisco dove sia il problema!<br>
gcc e quesito importante
azz, scusa ma non avevo visto che nel primo post già avevi provato con ch->count -= 1.<br />
<BR>sinceramente non so perchè hai quel comportamento, ma ho provato con il
<BR>suggerimento di useless e (ovviamente funziona. funziona anche
<BR>ch->count--.<br />
<BR>io l´if lo scriverei così:<br />
<BR>if( ch->count-- ) { blablabla }<br />
<BR><br />
<BR>ciao, rob<br />
<BR><br />
<BR>edit: ooops, post (semi)contemporaneo<br />
<BR><br />
<BR><br />
<BR> "L´esperto lo si riconosce dal fatto che contraddice il dilettante anche quando quest´ultimo ha ragione." [Theo Herbst]
<BR>
<BR><BR><BR>[ Questo Messaggio è stato Modificato da: rob il 06-05-2005 09:46 ]<br>
<BR>sinceramente non so perchè hai quel comportamento, ma ho provato con il
<BR>suggerimento di useless e (ovviamente funziona. funziona anche
<BR>ch->count--.<br />
<BR>io l´if lo scriverei così:<br />
<BR>if( ch->count-- ) { blablabla }<br />
<BR><br />
<BR>ciao, rob<br />
<BR><br />
<BR>edit: ooops, post (semi)contemporaneo<br />
<BR><br />
<BR><br />
<BR> "L´esperto lo si riconosce dal fatto che contraddice il dilettante anche quando quest´ultimo ha ragione." [Theo Herbst]
<BR>
<BR><BR><BR>[ Questo Messaggio è stato Modificato da: rob il 06-05-2005 09:46 ]<br>
- Sari
- Linux 3.x
- Messaggi: 584
- Iscritto il: mer 16 feb 2005, 0:00
- Slackware: 12.1
- Kernel: 2.6.24
- Desktop: Gnome
- Località: Verona
gcc e quesito importante
mhm e´ da due giorni che provo a ricreare l´errore su un codice di
<BR>prova ma nulla, eppure sul codice dove ho riscontrato questa stranezza,
<BR>continua a rimanere.<br />
<BR>A questo punto qualcuno ha una minima idea del perche´ possa succedere?<br />
<BR><br />
<BR>Il codice e´ piu´ o meno cosi´ (anche se mooolto piu´ complesso, ma il
<BR>comportamento e´ quello classico di una lista concatenata).<br />
<BR>Al codice sotto aggiungete solo, alla struttura, dei puntatori a liste
<BR>concatenate di altro
<BR>genere, nient´altro di sconvolgente , ma il codice sotto funziona
<BR>l´altro no... perchè? Dove potrei aver sbagliato? nel dispose magari?
<BR>Insomma qualcosa manda a farsi friggere i miei puntatori ((<br />
<BR><br />
<BR>Ovviamente ho arricchito solo il codice di useless della lista.<br />
<BR><br />
<BR>/* Link */<br />
<BR>#define LINK(link, first, last, next,
<BR>prev)
<BR> \<br />
<BR>do
<BR> \<br />
<BR>{
<BR> \<br />
<BR> if ( !(first) ) \<br />
<BR>{
<BR>\<br />
<BR> (first) = (link); \<br />
<BR> (last) = (link); \<br />
<BR> }
<BR>
<BR> \<br />
<BR>
<BR>else
<BR>\<br />
<BR> (last)->next =
<BR>(link); \<br />
<BR> (link)->next = 0;
<BR> \<br />
<BR> if ((first) == (link))
<BR> \<br />
<BR> (link)->prev = 0;
<BR> \<br />
<BR> else
<BR> \<br />
<BR> (link)->prev =
<BR>(last); \<br />
<BR> (last) = (link);
<BR> \<br />
<BR>} while(0)<br />
<BR><br />
<BR><br />
<BR>typedef struct test_s TEST_S;<br />
<BR><br />
<BR>struct test_s {<br />
<BR>TEST_S *next;<br />
<BR>TEST_S *prev;<br />
<BR>short int sint;<br />
<BR>int sint_b;<br />
<BR>};<br />
<BR><br />
<BR>TEST_S *first_test = 0;<br />
<BR>TEST_S *last_test = 0;<br />
<BR><br />
<BR>int main (void) {<br />
<BR><br />
<BR>TEST_S *t;<br />
<BR>int i;<br />
<BR><br />
<BR>for ( i = 0 ; i < 10 ; i++ )<br />
<BR>{<br />
<BR><br />
<BR>TEST_S *tt;<br />
<BR><br />
<BR>tt = (TEST_S *) malloc (sizeof (TEST_S));<br />
<BR>tt->sint = 99;<br />
<BR>tt->sint_b = i;<br />
<BR>LINK(tt, first_test, last_test, next, prev);<br />
<BR><br />
<BR>}<br />
<BR><br />
<BR>for ( t = first_test; t; t = t->next )<br />
<BR>{ <br />
<BR>if (t->sint_b == 5)<br />
<BR>{<br />
<BR>printf ("Ora t->sint vale %d\n", t->sint);<br />
<BR>--t->sint;<br />
<BR>printf ("Dopo il decremento t->sint vale %d\n", t->sint);<br />
<BR>}<br />
<BR>}<br />
<BR><br />
<BR>for ( t = first_test; t; t = t->next ) <br />
<BR>printf ("t->sint_b : %d t->sint %d\n", t->sint_b, t->sint);<br />
<BR><br />
<BR>return (0);<br />
<BR>}<br />
<BR><br />
<BR><br /><br>
<BR>prova ma nulla, eppure sul codice dove ho riscontrato questa stranezza,
<BR>continua a rimanere.<br />
<BR>A questo punto qualcuno ha una minima idea del perche´ possa succedere?<br />
<BR><br />
<BR>Il codice e´ piu´ o meno cosi´ (anche se mooolto piu´ complesso, ma il
<BR>comportamento e´ quello classico di una lista concatenata).<br />
<BR>Al codice sotto aggiungete solo, alla struttura, dei puntatori a liste
<BR>concatenate di altro
<BR>genere, nient´altro di sconvolgente , ma il codice sotto funziona
<BR>l´altro no... perchè? Dove potrei aver sbagliato? nel dispose magari?
<BR>Insomma qualcosa manda a farsi friggere i miei puntatori ((<br />
<BR><br />
<BR>Ovviamente ho arricchito solo il codice di useless della lista.<br />
<BR><br />
<BR>/* Link */<br />
<BR>#define LINK(link, first, last, next,
<BR>prev)
<BR> \<br />
<BR>do
<BR> \<br />
<BR>{
<BR> \<br />
<BR> if ( !(first) ) \<br />
<BR>{
<BR>\<br />
<BR> (first) = (link); \<br />
<BR> (last) = (link); \<br />
<BR> }
<BR>
<BR> \<br />
<BR>
<BR>else
<BR>\<br />
<BR> (last)->next =
<BR>(link); \<br />
<BR> (link)->next = 0;
<BR> \<br />
<BR> if ((first) == (link))
<BR> \<br />
<BR> (link)->prev = 0;
<BR> \<br />
<BR> else
<BR> \<br />
<BR> (link)->prev =
<BR>(last); \<br />
<BR> (last) = (link);
<BR> \<br />
<BR>} while(0)<br />
<BR><br />
<BR><br />
<BR>typedef struct test_s TEST_S;<br />
<BR><br />
<BR>struct test_s {<br />
<BR>TEST_S *next;<br />
<BR>TEST_S *prev;<br />
<BR>short int sint;<br />
<BR>int sint_b;<br />
<BR>};<br />
<BR><br />
<BR>TEST_S *first_test = 0;<br />
<BR>TEST_S *last_test = 0;<br />
<BR><br />
<BR>int main (void) {<br />
<BR><br />
<BR>TEST_S *t;<br />
<BR>int i;<br />
<BR><br />
<BR>for ( i = 0 ; i < 10 ; i++ )<br />
<BR>{<br />
<BR><br />
<BR>TEST_S *tt;<br />
<BR><br />
<BR>tt = (TEST_S *) malloc (sizeof (TEST_S));<br />
<BR>tt->sint = 99;<br />
<BR>tt->sint_b = i;<br />
<BR>LINK(tt, first_test, last_test, next, prev);<br />
<BR><br />
<BR>}<br />
<BR><br />
<BR>for ( t = first_test; t; t = t->next )<br />
<BR>{ <br />
<BR>if (t->sint_b == 5)<br />
<BR>{<br />
<BR>printf ("Ora t->sint vale %d\n", t->sint);<br />
<BR>--t->sint;<br />
<BR>printf ("Dopo il decremento t->sint vale %d\n", t->sint);<br />
<BR>}<br />
<BR>}<br />
<BR><br />
<BR>for ( t = first_test; t; t = t->next ) <br />
<BR>printf ("t->sint_b : %d t->sint %d\n", t->sint_b, t->sint);<br />
<BR><br />
<BR>return (0);<br />
<BR>}<br />
<BR><br />
<BR><br /><br>