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 ...