Newsgroup: it.comp.lang.c
Titolo: AIUTO per questa routine!

Devo leggere un file in cui è contenuta un immagine in bianco e nero . Devo
quindi andare a leggere con la fread dei blocchi di unsigned short int(2
byte) che contengono solo valori da 0 a 255 (normalmente ogni pixel è
descritto da 8 bit ma io ho dovuto "allargare" a 16 bit per le mie
esigenze).
Dopo aver letto devo stampare su file o su stdout un insieme di record (uno
per ogni valore letto nel file quindi 256) cosi composti:
-nel primo campo il valore letto (0-255)
-nel secondo campo quante volte esso appare nel file letto.
Io ho implementato la seguente routine:
cont=0;
for(valore=0; valore<256; valore++)
{
    for(j=0; j<dimy; j++)
    {
        for(i=0; i<dimx; i++)
        {
            fread(&dato,sizeof(unsigned short int),1,fp)
            figura[j][i]=dato;
            if(dato==valore)
                cont++;
        }
    }
printf("\nNel file %s il numero %d compare %d
volte.\n",nomefile,valore,cont);
cont=0;
}
Le variabili usate sono cosi definite:
int cont, i, j;
unsigned short int valore,dato;
unsigned short int ** figura;
FILE * fp;
char * nomefile;
Purtroppo il ciclo funziona solo per il valore 0, di cui il programma
fornisce il numero giusto di occorrenze; mentre per tutti gli altri valori
stampa sempre 0 come numero di occorrenze.
Vorrei sapere perchè il ciclo non funziona oppure che mi diate una soluzione
voi , visto che questa soluzione non è neanche intelligente(ne ho in mente
un altra in cui la matrice immagine viene letta una sola volta risparmiando
un sacco di tempo).
Grazie , Luca.

Devi riposizionarti all'inizio del file dopo ogni ciclo.
In ogni caso, secondo me, dovresti adottare una tecnica come nel programma
d'esempio che ti riporto di seguito :
#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp ;
    unsigned long * occorrenze ; /* vettore delle occorrenze */
    short i ;
    occorrenze = calloc ( 256, sizeof ( unsigned long ) ) ;
    /* inizializzazione a zero automatica */
    fp = fopen("image.img", "rb");
    while (! feof( fp ) )
    {
          fread(&i, sizeof( short ), 1, fp);
          ++occorrenze[i] ;
    }
    fclose( fp ) ;
    for (i = 0; i <= 255; i++)
        printf("il carattere %3d compare %lu volte\n", i, occorrenze[i]);
    free ( occorrenze ) ;
    return 0 ;
}
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

 
Dopo il primo ciclo (valore=0), il puntatore in lettura e' posizionato dopo
l'ultimo elemento della matrice e al ciclo sucessivo leggi i dati
successivi (o niente se sei alla fine del file) invece della matrice. Devi
riposizionarti all'inizio della matrice con ftell()/fseek() o semplicemente
con rewind() (da mettere al posto di fseek() e togliendo ftell()) se i dati
sono all'inizio del file.
E' sicuramente meglio leggere una volta sola (del resto memorizzi gia'
quello che ti serve in figura) e poi fare il conteggio su figura, oppure
potresti contare le occorrente semplicemente con:
unsigned int frequenza[256];
memset(frequenza, 0, sizeof(frequenza));	// azzera il vettore delle
frequenze
for(j=0; j<dimy; j++)
  for(i=0; i<dimx; i++)
    {
      if (fread(&dato,sizeof(unsigned short int),1,fp)<1)
        {
	    /* Read error o EOF prematuro */
	    if (feof(fp))
	      {
		  /* EOF */
		  printf("%s: EOF\n", nomefile);
		  exit(0);
            }
	    perror(nomefile);
	    exit(0);
        }
      figura[j][i]=dato;
      if (dato<256)
        frequenza[dato]++;
      else
        { /* Errore: out of range ? */ }
    }
/* Stampa le frequenza: */
printf("File: %s\n", nomefile); 
for(i=0; i<256; i++)
  printf("  %3.3d: %d\n", i, frequenza[i]);

Andrea Laforgia (
andrea_...@bigfoot.com
) wrote:
[ snip ]
:     while (! feof( fp ) )
:     {
:           fread(&i, sizeof( short ), 1, fp);
:           ++occorrenze[i] ;
:     }
Ma feof() ritorna (true) solo /dopo/ che e' stata raggiunta la fine 
del file.
In tal caso, '++occorrenze[i]' viene ripetuto una volta di troppo.
Suggerisco:
while(fread(&i, sizeof( short ), 1, fp))
	++occorrenze[i];
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

mat_pos; */
int mat_pos ?
Non sarebbe meglio "long mat_pos" ?
