PDA

View Full Version : [C] Allocazione dinamica della memoria


salvodel
14-12-2007, 14:33
Siccome devo leggere dei dati da un file ed inserirli in una matrice pensavo di utilizzare l'allocazione della memoria. Vedendo alcuni esempi ho scritto il seguente file(se ci sno altri tipi errori è perche ho fatto un taglio qua e la per mettere solo il succo visto che con le dimensioni fisse il tutto gira)
#include <stdio.h>
#include <stdlib.h>

#define stringa "OUTPUT.DAT"

int legge(int lung, double t[],double X[],double Y[],double Z[],double TT[],double W[],double B[])
{
FILE *fp;
int i=0;

printf("Quanti secondi di acquisizione");

if((fp=fopen(stringa,"r"))==NULL)
printf("Impossibile aprire il file");
else
{
printf("Dati letti:\n");
while(fscanf(fp,"%LE %LE %LE %LE %LE %LE %LE",&t[i],&X[i],&Y[i],&Z[i],&TT[i],&W[i],&B)>0)
{
printf(".");
i++;
if(i>lung)
{
printf("\n");
break;
}
}
}

fclose(fp);

return i;
}

int main(void)
{
double *time;
double *MAT1, *MAT2, *MAT3;
double *MAT4, *MAT5, *MAT6;
int j,t;
int tacq;

printf("Quanti secondi di acquisizione: ");
scanf("%d",&tacq);

t=tacq%fsamp;

time=malloc(t*sizeof(double));
MAT1=malloc(t*sizeof(double));
MAT2=malloc(t*sizeof(double));
MAT3=malloc(t*sizeof(double));
MAT4=malloc(t*sizeof(double));
MAT5=malloc(t*sizeof(double));
MAT6=malloc(t*sizeof(double));


if(time==NULL || MAT1==NULL || MAT2==NULL || MAT3==NULL || MAT4==NULL || MAT5==NULL || MAT6==NULL)
{
printf("Memoria esaurita\n");
exit(1);
}

j=legge(time,MAT1,MAT2,MAT3,MAT4,MAT5);

for(t=0;t<j;t++)
printf("time= %LE\tX= %LE\tW= %LE\n",time[t],MAT1[t],MAT3[t]);


system("PAUSE");
return 0;
}
Quando lo lancio ottengo il seguente errore relativo alle righe dove utilizzo la funzione malloc
c:\main.cpp(67) : error C2440: '=' : cannot convert from 'void *' to 'double *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
Se invece faccio
VEDERE=(double *)malloc(10*sizeof(double));
come ho visto fare per un esempio "anacolo" mi da altri tipi di errore.:confused:
Grazie a tutti per un aiutino intanto cerco in rete altri esempi.
grazie

RaouL_BennetH
14-12-2007, 14:44
ciao :) sto sudiando anche io un pò di C a fini didattici.

Credo comunque che la malloc debba essere utilizzata come hai scritto nel secondo esempio:


char *c;
c = malloc(50);

int *max;
max = (int *)malloc(max*syzeof(int));

Ziosilvio
14-12-2007, 15:01
Quando lo lancio ottengo il seguente errore relativo alle righe dove utilizzo la funzione malloc
c:\main.cpp(67) : error C2440: '=' : cannot convert from 'void *' to 'double *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
malloc, di per sé, restituisce un puntatore a void; e i puntatori a void vanno sempre convertiti esplicitamente, prima di essere riutilizzati.
Se invece faccio
VEDERE=(double *)malloc(10*sizeof(double));
come ho visto fare per un esempio "anacolo" mi da altri tipi di errore.:confused:
Quali tipi? Perché, questa porzione sembra corretta...
Credo comunque che la malloc debba essere utilizzata come hai scritto nel secondo esempio:


char *c;
c = malloc(50);

int *max;
max = (int *)malloc(max*syzeof(int));


Sì, conversioni sempre esplicite; anche se c è un puntatore a char.

salvodel
14-12-2007, 15:12
ciao :) sto sudiando anche io un pò di C a fini didattici.

Credo comunque che la malloc debba essere utilizzata come hai scritto nel secondo esempio:


char *c;
c = malloc(50);

int *max;
max = (int *)malloc(max*sizeof(int));



Purtroppo io non sto studiando il C :D ma lo devo utilizzare :mad: e sto facendo quello che posso ritirando fuori vecchi ricordi con infiltrazioni dannose di Matlab
Cmq andava OVVIAMENTE utilizza in quel modo poiche malloc mi da un void. Ora l'ho scritta cosi:
time=(double *)calloc(dim,sizeof(double));
Inoltre il grave problema era nell'intestazione della funzione
int legge(double []t,double X[])
Mi ostino a "pensare":mbe: e non ad aprire gli occhi.:doh:
Grazie lo stesso

salvodel
14-12-2007, 15:13
Quali tipi? Perché, questa porzione sembra corretta...

Era un errore nell'intestazione della funzione banale.
Grazie mille.