Allocation de memoire en langage C:suite

Fermé
alexandre Volatier - 15 juil. 2002 à 10:40
 Utilisateur anonyme - 17 juil. 2002 à 11:39
Bonjour,

Tout d'abord un grand merci a Joshua42 et frickiss pout m'avoir
repondu si rapidement. Suite a leurs demandes et en esperant que
le programme n'est pas trop long, voici mon programme:
En resume il est cense remettre en place une liste de donnees, afin
de calculer des angles theta[i][j], pour faire une somme deltaV
suivant i puis j de ces angles ponderes par des parametres du probleme
entres dans la fonction saisie!!

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define Pi 3.1415

/*definition d'une structure contenant les x,y,z,hx,hy en fonction des
couples (i,j)*/

typedef struct toto {


int imax;
int jmax;

float **hx_tab;
float **hy_tab;

float **x;
float **y;
float **z;

float **theta;

} sw_model;

/*ecriture d'un fichier test H.dat*/

void write_H_dat(sw_model *pmodel)
{


float i;

FILE *Hdat;
Hdat=fopen("/home/perso/fbernard/alex_volatier/Essais/fabrice/H.dat","w");
for(i=0;i<pmodel->imax*pmodel->jmax;i++)
{
fprintf(Hdat,"%f %f %f %f %f\n",2*i, i+1, i+2, i+3, i+4);
}
printf("\necriture de fichier test terminee\n");
fclose(Hdat);
}

/*definition et lecture du tableau des x,y,z,hx et hy*/

int definition_model(sw_model *pmodel)
{
FILE *Hdat;
int i,j;
int flag;



printf("Allocation de memoire pour les tableaux deux entrees...\n");


pmodel->hx_tab= (float ** ) (flag= calloc( pmodel->jmax, sizeof( float* )));
pmodel->hy_tab= (float ** ) (flag= calloc( pmodel->jmax, sizeof(float* )));
pmodel->x= (float ** ) (flag= calloc( pmodel->jmax, sizeof( float* )));
pmodel->y= (float ** ) (flag= calloc( pmodel->jmax, sizeof(float* )));
pmodel->z= (float ** ) (flag= calloc( pmodel->jmax, sizeof( float* )));
pmodel->theta= (float ** ) (flag= calloc( pmodel->jmax, sizeof(float* )));

for( i=0; i<pmodel->imax; i++ )
{
pmodel->hx_tab[i]= ( float * ) (flag= calloc( pmodel->imax, sizeof( float )));
pmodel->hy_tab[i]= ( float * ) (flag= calloc( pmodel->imax, sizeof( float )));
pmodel->x[i]= ( float * ) (flag= calloc( pmodel->imax, sizeof( float )));
pmodel->y[i]= ( float * ) (flag= calloc( pmodel->imax, sizeof( float )));
pmodel->z[i]= ( float * ) (flag= calloc( pmodel->imax, sizeof( float )));
pmodel->theta[i]= ( float * ) (flag= calloc( pmodel->imax, sizeof( float )));

}

if ( flag == NULL )
{
printf("Not enough memory !\n");
return(0);
}

/*ouverture du fichier H.dat*/

printf("Looking for H.dat file...\n");

Hdat= fopen("/home/perso/fbernard/alex_volatier/Essais/fabrice/data/H.dat","r");


/*lecture du fichier H.dat*/

printf("reading in H.dat file...\n");

for( i=0; i<pmodel->imax; i++ )
{



for( j=0; j<pmodel->jmax; j++ )
{
fflush( stdout );
fscanf( Hdat,"%f %f %f %f %f ",&pmodel->x[i][j],&pmodel->y[i][j],&pmodel->z[i][j],&pmodel->hx_tab[i][j], &pmodel->hy_tab[i][j]);
/*printf("\n...lecture effectuee\n\n");*/
/*printf("%f
%f\n",pmodel->hx_tab[i][j],pmodel->hy_tab[i][j]);*/
}

}
printf("\n...done\n\n");
printf("Hdat:%f\n",Hdat);

/*probleme de memoire*/

if ( Hdat == NULL ) return(0);

fclose( Hdat );




printf("\n...lecture effectuee\n\n");



}

/* saisie des donnees ksi1,ksi2,dx,dy,deltaR,Rcarre,I */

void saisie( float *pksi1 ,float *pksi2 ,float *pL ,float *pw ,float *pdeltaR ,float *pRcarre ,float *pI )
{


printf("Entrer ksi1: \n");
scanf("%f",pksi1);
printf("Entrer ksi2 \n");
scanf("%f",pksi2);
printf("Entrer L interplots \n");
scanf("%f",pL);
printf("Entrer w \n");
scanf("%f",pw);
printf("Entrer deltaR/R \n");
scanf("%f",pdeltaR);
printf("Entrer Rcarre \n");
scanf("%f",pRcarre);
printf("Entrer courant I \n");
scanf("%f",pI);

}


/* Calcul de l'angle THETA[i][j]*/

calc_theta(sw_model *pmodel,float ksi1,float ksi2)
{
int i,j;
for(i=0;i<pmodel->imax;i++)
{
for(j=0;j<pmodel->jmax;j++)
{

pmodel->theta[i][j]=atan((ksi2*pmodel->hy_tab[i][j])/(ksi1*pmodel->hx_tab[i][j]));
/*printf("calcul de theta: OK!!\n");
printf("Theta=%f\n",pmodel->theta[i][j]);*/
}
}

}

/*calcul de deltaV*/

void calc_signal(sw_model *pmodel,float *pdeltaV,float dx,float dy,float deltaR,float Rcarre,float
I)
{
int i,j;
float s,S;
for(i=0;i<pmodel->imax;i++)
{
for(j=0;j<pmodel->jmax;j++)1
{
s+=pow(sin(pmodel->theta[i][j]),-1);
}

S+=pow(s,-1);
}
*pdeltaV=I*deltaR*Rcarre*dx/dy*S;
printf("calcul deltaV ok!!\n");
}

void main()
{
int i,j,k;
float L,w;
float ksi1 ,ksi2,dx,dy,deltaR,Rcarre,I,deltaV ;
sw_model *model;
model= (sw_model*) calloc(1,sizeof(sw_model));
printf("saisir les valeurs de imax et jmax\n");
scanf("%d %d",&model->imax, &model->jmax);
/* write_H_dat(model); */
if(definition_model(model)==0) printf("Memoire insuffisante\n"); /*appel de l'allocation des tableaux de
model*/
else printf("definition du modele termine\n");



/*test de la lecture du fichier H.dat*/
/*
for(i=0; i<MSPL;i++)
{
printf("x:%f y:%f z:%f HX:%f HY:%f\n",model->x[i],model->y[i],model-> z[i],model->hx_tab[i],model-> hy_tab[i]);
}

*/

/* saisie des donnees du modele et calcul de dx,dy*/
saisie(&ksi1 , &ksi2 , &L , &w , &deltaR , &Rcarre , &I );
dx =L/model->imax;
dy =w/model->jmax;



/* calcul de THETA */

calc_theta(model,ksi1,ksi2);

for(i=0;i<model->imax;i++)
{
for(j=0;j<model->jmax;j++)
{
printf("theta[%d][%d] vaut: %f\n",i,j,model->theta[i][j]);
}
}

/* calcul de delta V*/

calc_signal( model,&deltaV,dx,dy,deltaR,Rcarre,I);

printf("deltaV=%f\n",deltaV);
}

Merci d'avance pour les courageux qui voudront bien m'aider!

Alexandre
A voir également:

1 réponse

Utilisateur anonyme
17 juil. 2002 à 11:39
Bonjour,

Dans definition_model, il y a tout simplement intervertion de imax
et jmax.
On devrait avoir les 6 premieres lignes avec des :
calloc( pmodel->imax, sizeof( float* ))
et les 6 autres lignes (dans la boucle for) avec des :
calloc( pmodel->jmax, sizeof( float ))

Ca serait pas mal aussi de mettre un return 1;
à la fin de cette fonction.

Et de mettre le :
if ( Hdat == NULL ) return(0);
juste apres l'ouverture du fichier, plutot qu'apres utilisation de Hdat dans la boucle...

A ta place je me méfierait aussi de l'ordre de precedence des operateurs &, -> et [], en ajoutant des parentheses. Ca ne change rien dans ce code, mais ca tranquillise l'esprit. Le C necessite d'etre Zen.

Good Luck.

Joël Grondin (Galanga)
0