C - problema con float

di il
2 risposte

C - problema con float

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:
#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:
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
float temp;
subito prima di
printf("%f",numeri[k]);
(Nel punto con il commento //aggiungo qui)

mi stampa:
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 ...

2 Risposte

  • Re: C - problema con float

    Il problema in realtà era a monte: avevo x sbaglio commentato la linea per tornare all'inizio del file:
    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!!!
  • Re: C - problema con float

    He compilatore usi?
    int numero_elementi = size/sizeof(float);
          printf("Numero di elementi float nel file: %d\n", numero_elementi);
          
    
          float numeri[numero_elementi];
    Non tutti accettano il VLA

    perche apri un file in binario e l'altro in testo?
    perche usi unarray di un solo elemento quando ne puoi fare a meno?
    ecc....
Devi accedere o registrarti per scrivere nel forum
2 risposte