Repository 32bit  Forum
Repository 64bit  Wiki

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.

gcc e quesito importante

Messaggioda Sari » gio mag 05, 2005 17:53

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
Sari
Linux 2.6
Linux 2.6
 
Messaggi: 584
Iscritto il: mer feb 16, 2005 0:00
Località: Verona
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome

gcc e quesito importante

Messaggioda useless » gio mag 05, 2005 20:15

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
useless
Staff
Staff
 
Messaggi: 3896
Iscritto il: sab ott 11, 2003 23:00
Località: A place where the streets have no name

gcc e quesito importante

Messaggioda Sari » gio mag 05, 2005 21:15

sisi errore di trascrizione :)<br /><br>
Avatar utente
Sari
Linux 2.6
Linux 2.6
 
Messaggi: 584
Iscritto il: mer feb 16, 2005 0:00
Località: Verona
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome

gcc e quesito importante

Messaggioda rob » gio mag 05, 2005 23:14

prova ch->count -= 1<br /> <BR><br /> <BR>ciao, rob<br /> <BR><br /><br>
Avatar utente
rob
Linux 2.6
Linux 2.6
 
Messaggi: 924
Iscritto il: lun nov 22, 2004 0:00
Località: Roma

gcc e quesito importante

Messaggioda Sari » ven mag 06, 2005 6:54

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
Sari
Linux 2.6
Linux 2.6
 
Messaggi: 584
Iscritto il: mer feb 16, 2005 0:00
Località: Verona
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome

gcc e quesito importante

Messaggioda useless » ven mag 06, 2005 8:36

<!-- 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
useless
Staff
Staff
 
Messaggi: 3896
Iscritto il: sab ott 11, 2003 23:00
Località: A place where the streets have no name

gcc e quesito importante

Messaggioda rob » ven mag 06, 2005 8:44

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
rob
Linux 2.6
Linux 2.6
 
Messaggi: 924
Iscritto il: lun nov 22, 2004 0:00
Località: Roma

gcc e quesito importante

Messaggioda Sari » sab mag 07, 2005 13:30

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>
Avatar utente
Sari
Linux 2.6
Linux 2.6
 
Messaggi: 584
Iscritto il: mer feb 16, 2005 0:00
Località: Verona
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome


Torna a Libera

Chi c’è in linea

Visitano il forum: Bing [Bot] e 3 ospiti