Allocation de memoire en langage C:suite
alexandre Volatier
-
Utilisateur anonyme -
Utilisateur anonyme -
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
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:
- Allocation de memoire en langage C:suite
- Mémoire vive - Guide
- Langage ascii - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Langage binaire - Guide
- Nettoyer memoire iphone - Guide
1 réponse
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)
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)