Newsgroup: it.comp.lang.c
Titolo: E' UN ASSURDITA'... AIUTO!

Salve a tutti. Mi č capitata per la prima volta una cosa in C della quale,
nonostante giorni e giorni di tentativi e verifiche, non riesco comunque a
capacitarmi.
Allora, io creo
typedef struct {
        unsigned char caratteri[257];
        long occorrenze;
} elementi;
e poi un array di queste struct, cosě:
elementi ordinata[256];
Questa roba č tutta globale, sopra il main. Lo so che č sporco... per ora
non mi interessa.
Poi nel main ad un certo punto ci sono queste istruzioni:
        printf("Primo elemento matrice ordinata: %d occorrenze:
%d\n",ordinata[0].caratteri[0],ordinata[0].occorrenze);
        printf("Matrice prima del riordino:\n"); //va beh questa č
inutile...
        stampamatrice();
Ed ecco qua la funzione stampamatrice:
void stampamatrice() {
        int i,j;
        int conta=0;
        char ciccio;
        for (i=0;i<256;i++) {
        for (j=0;j<strlen(ordinata[i].caratteri);j++) {
        if ((i==0) && (j==0)) printf("LO ZERO ORA C'E'!\n");
                printf("Caratteri: %d ha %d
occorrenze\n",ordinata[i].caratteri[j],ordinata[i].occorrenze);
        }
        if (ordinata[i].occorrenze<=0) return;
                conta++;
                if (conta==5) {scanf("%c",&ciccio); conta=0; }
        }
}
Un tempo era ovviamente con un parametro, cioč passavo alla funzione la
matrice da stampare, poi per cercare di capire il problema l'ho fatta cosě,
in modo che agisca solo sulla variabile globale da me creata.
Ebbene: l'assurditŕ: la riga di stampamatrice dove scrive: LO ZERO ORA C'E'
dovrebbe essere COMUNQUE stampata, a prescindere dal contenuto della
struttura "ordinata", dico bene? Per quale motivo non dovrebbe? Sono due
cicli annidati!
E INVECE NO!
Se in ordinata il primo char del campo caratteri, nella prima posizione
dell'array, vale 0 (cioč il char unsigned 0), all'esecuzione NON mi stampa
quella stringa, e passa direttamente sotto. Naturalmente tutto questo l'ho
fatto perchč avrei desiderato che mi stampasse la mia ordinata anche se
questa conteneva degli 0 come char nel campo caratteri. Invece in quel caso,
e solo in quello, annulla la riga della "matrice", salta direttamente
avanti, e non solo, ma tutto il programma, che vorrebbe essere un
compressore, fa come se non ci fosse il char 0, con esiti disastrosi. Se
invece in ordinata lo 0 non c'č funziona come dovrebbe.
Notare che l'istruzione che nel main fa stampare l'elemento INCRIMINATO lo
stampa invece sempre CORRETTAMENTE! Nella prima locazione c'č 0 e me lo
stampa, con le occorrenze giuste! Ho provato col gcc sotto Linux e poi con
DJGPP, uguali risultati!
Alle anime buone che mi risponderanno, AIUTO!

 capacitarmi.
 > Naturalmente tutto questo l'ho fatto perchè avrei desiderato che mi
 > stampasse la mia ordinata anche se questa conteneva degli 0 come
 > char nel campo caratteri.
   Non c'e` nulla di cui non capacitarsi: la funzione /strlen/ conta la 
lunghezza delle stringhe /nul-terminated/, ossia conta i caratteri fino 
a che non ne incontra uno di valore 0. Sicche`...
--
Alla prossima,
Marco

 quella stringa, e passa direttamente sotto.
ovvio strlen() torna 0 e il tuo for diventa:
for (j=0; j<0; j++)
ovviamente non entra nemmeno nel for...
e' chiaro ?
bye

finiva quando c'č il carattere '/0', che nella mia testa č diverso dal
'\0'
-- 
Andrea Laforgia - walkietalkie(at)
libero.it