gcc e quesito importante

Area di discussione libera.

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.
Rispondi
Avatar utente
Sari
Linux 3.x
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

Messaggio da Sari »

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>

Avatar utente
useless
Staff
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

Messaggio da useless »

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>

Avatar utente
Sari
Linux 3.x
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

Messaggio da Sari »

sisi errore di trascrizione :)<br /><br>

Avatar utente
rob
Linux 3.x
Linux 3.x
Messaggi: 924
Iscritto il: lun 22 nov 2004, 0:00
Località: Roma

gcc e quesito importante

Messaggio da rob »

prova ch->count -= 1<br />
<BR><br />
<BR>ciao, rob<br />
<BR><br /><br>

Avatar utente
Sari
Linux 3.x
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

Messaggio da Sari »

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>

Avatar utente
useless
Staff
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

Messaggio da useless »

<!-- 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>

Avatar utente
rob
Linux 3.x
Linux 3.x
Messaggi: 924
Iscritto il: lun 22 nov 2004, 0:00
Località: Roma

gcc e quesito importante

Messaggio da rob »

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>

Avatar utente
Sari
Linux 3.x
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

Messaggio da Sari »

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>

Rispondi