RISOLTO C - problema con float

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

lifedj

Nuovo Utente
Messaggi
2
Reazioni
0
Punteggio
24
Ciao ragazzi, ho ripreso dopo un bel pò di anni a programmare in C e sto riscontrando non pochi problemi!
Intanto mi scuso x la lunghezza del codice ma visto che il problema è molto strano devo per forza copiarlo tutto!

Devo leggere da file binario dei valori float e calcolare media e varianza!
Il problema è che il programma si comporta in modo molto strano!
Se infatti inserisco una dichiarazione di variabile in più, il comportamento cambia!

Cerco di spiegarmi meglio:

Ho questo pezzo di codice:

Codice:
#include<stdio.h>
#include<string.h>

// -filename
int main(int argc, char *argv[])
{
    char name[100];
    char nameBin[100];
    float media[12] = {0.0};
    float varianza[12] = {0.0};
    strcpy(name, argv[2]); 
    strcpy(nameBin,name);
    strcat(nameBin,".txt");

    int dim;
    FILE *ptr_read, *ptr_write;

    ptr_read=fopen(name,"rb");
    ptr_write=fopen(nameBin,"w");
    
    float d[1];
        //acquisisco il numero di elementi nel file
        fseek(ptr_read, 0, SEEK_END);
        int size=ftell(ptr_read);
        printf("Numero di byte su file: %d\n", size);
        int numero_elementi = size/sizeof(float);
        printf("Numero di elementi float nel file: %d\n", numero_elementi);
        

        float numeri[numero_elementi];
        //fseek(ptr_read, 0, 0);
    int i=0;
    int k=0;
    //acquisisco tutti gli elementi e li memorizzo in un vettore
    //l'ultimo elemento float è stato inserito erroneamente: è in più
    while(k<numero_elementi-1){
        //fscanf(ptr_read, "%f", &d);
        int quantita = fread(d, sizeof(float), 1, ptr_read);
        //printf("quantita = %d",quantita);
        //fwrite(&d, sizeof(float), 1, ptr_write); //scrive il valore sul file
        fprintf(ptr_write,"%f ",d[0]);
        media[i]=media[i]+d[0];
        
        numeri[k]=d[0];
        if (i<11)
        {
            i++;
        }
        else
        {
            i=0;
        }
        k++;
    }
    int j=0;
    for (j=0;j<12;j++)
    {
        media[j]=media[j]/(numero_elementi/12);
        printf("media %f \n",media[j]);
    }
    k=0;
    i=0;
    while(k<numero_elementi-1){
                                         //aggiungo qui
                printf("%f",numeri[k]);
        k++;
    }
    
    fclose(ptr_read);
    fclose(ptr_write);
    return 0;
}

che mi stampa correttamente questo:

Codice:
Numero di byte su file: 705604
Numero di elementi float nel file: 176401
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000 
media -4893207450193381540664180668891136.000000

-5015284121802420924367739281211392.000000
-5015284121802420924367739281211392.000000
-5015284121802420924367739281211392.000000
.....
-5015284121802420924367739281211392.000000

Se però aggiungo
Codice:
float temp;
subito prima di
Codice:
printf("%f",numeri[k]);
(Nel punto con il commento //aggiungo qui)

mi stampa:

Codice:
Numero di byte su file: 705604
Numero di elementi float nel file: 176401
media -nan 
media -nan 
media -nan 
media -nan 
media -nan 
media -nan 
media -nan 
media -nan 
media -nan 
media -nan 
media -nan 
media -nan 

-nan
-nan
-nan
.....
-nan

Sapreste dirmi come mai??? Eppure ho solo dichiarato una semplice variabile!!! Lo stesso vale se dichiaro la variabile all'inizio!!! Mah ...

- - - Updated - - -

Il problema in realtà era a monte: avevo x sbaglio commentato la linea per tornare all'inizio del file:

Codice:
fseek(ptr_read, 0, 0);

Quindi i risultati che sembravano validi in realtà non lo erano!!!
Questi sono i soliti problemi che si risolvono mollando e tornando sul programma dopo un'oretta!!!
;-)
 
Ciao, sono nuovo del forum, però credo che se hai risolto il problema sarebbe utile aggiungere il testo [Risolto] nel titolo del topic, perché così si evita che l'argomento venga aperto inutilmente dagli altri utenti. :)
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top