Newsgroup: it.comp.lang.c
Titolo: un'anima pia mi aiuta a capire cosa c'è che non funziona, per piacere?

Questo pezzo di codice che allego è parte un codificatore che sto
sviluppando. Non riesco a capire come mai, con un determinato tipo di
imput mi scardina non solo l'output proprio tutto il programma. Lavora
su una matrice 8x8 nel caso in questione, ma vorrei tenerlo come VLA.
Con i dati che non innescano il bug mi viene fuori
primo raggruppo coded_data
P N P Z Z Z Z Z
Z Z Z Z Z Z Z Z
T Z Z Z Z Z Z Z
T T Z Z Z Z Z Z
Z Z Z P Z Z Z Z
Z Z Z Z Z Z Z Z
Z Z Z Z Z Z Z Z
Z Z Z Z Z Z Z Z
Se uso il secondo dataset mi viene fuori
primo raggruppo coded_data
Z Z Z Z P Z Z P
Z Z Z Z Z P P Z
Z T X Z Z P N Z Z
T X N Z Z P Z Z Z
N Z Z Z P P Z Z
Z Z Z Z Z Z Z P
Z Z P N Z P Z P
P Z P P Z Z N P
come mai si allunga l'array?
Alla fine del programma ristampo la matrice con anche la coordinata
orizzontale e mi viene fuori:
coded_data
Z 0 Z 1 Z 2 Z 3 P 4 Z 5 Z 6 P 7
Z 0 Z 1 Z 2 Z 3 Z 4 P 5 P 6 Z 7
Z 0 T 1 X 1 Z 2 Z 3 P 4 N 5 Z 6 Z 7
T 0 X 0 N 1 Z 2 Z 3 P 4 Z 5 Z 6 Z 7
N 0 Z 1 Z 2 Z 3 P 4 P 5 Z 6 Z 7
Z 0 Z 1 Z 2 Z 3 Z 4 Z 5 Z 6 P 7
Z 0 Z 1 P 2 N 3 Z 4 P 5 Z 6 P 7
P 0 Z 1 P 2 P 3 Z 4 Z 5 N 6 P 7
perché nelle due righe incriminate ho due 1 o due 0?
Sto andando in fusione, se mi aiutate mi fate un grande favore.
Grazie

   int T;
[...]
Hai usato "T" per rappesentare uno dei possibili valori dell'enum
"ezw_coeff" e anche la variabile di tipi int!!!
Guarda caso, l'errore lo hai proprio solo nelle 2 righe e nelle posizioni
della matrice dove c'è T.
Quindi ad esempio qui:
        printf ("coded_data\n");
        for (i = 0; i < height; i++)
        {
            for (j = 0; j < width; j++)
            {
                if (coded_data[i][j] == N)
                    printf ("N %d ", j);
                if (coded_data[i][j] == P)
                    printf ("P %d ", j);
                if (coded_data[i][j] == Z)
                    printf ("Z %d ", j);
                if (coded_data[i][j] == T)
                    printf ("T %d ", j);
                if (coded_data[i][j] == X)
                    printf ("X %d ", j);
            }
            printf ("\n");
        }
hai 2 if che hanno la condizione vera e quindi hai una doppia stampa per uno
stesso elemento di posizione (i, j).
Sicuramente avresti avuto una stampa sola se usavi uno switch o un if ...
else if....else if...
In ogni caso cambia nome ad uno dei 2 "T".
Un'altra piccola cosa.
A volte non metti le parentesi graffe sui for e sugli if quando sono
innestati.
Es.
for (i = 0; i < height; i++)
    for (j = 0; j < width; j++)
        if (abs (data[i * width + j]) > T)
        {
            /* non va bene */
            superato = 1;
        }
Questo è un caso sempice, ma ci sono altri casi più complessi dove il corpo
del for o dell'if è molto più lungo.
Ovviamente è corretto e funziona tutto, ma secondo me sarebbe meglio
metterle, anche perchè altre volte le metti. Almeno cerca di essere
uniforme.

 "ezw_coeff" e anche la variabile di tipi int!!!
grazie!!!! veramente grazie!!!
che errore stupido!
Guarda non ne potevo piů, erano ore che cercavo il baco.
Grazie, grazie, grazie

 "ezw_coeff" e anche la variabile di tipi int!!!
effettivamente il codice ora funziona bene.
Certo è che mi aspetterei un qualche warning dal compilatore (gcc), e
invece.....

 ha scritto:

E invece dovresti RTFM.
Hint: -Wshadow
Luca
-- 
Il piu` bel momento dell'amore e` quando ci si illude che duri per 
sempre; il piu` brutto, quando ci si accorge che dura da troppo.

 Hint: -Wshadow
che risposta acida...
Solo perché -Wall non implica -Wshadow....