Jump to content

aide debutante en programmation


laroche1

Recommended Posts

Bonjour,

J'ai un petit soucis avec mon programme, en fait j'ai l'impression qu'il ne finit jamais et comme je ne suis qu'une simple débutante en programmation j'aurais besoin de votre aide;

Je vous explique brievement mon programme: je travaille sur le champ magnétique d'une zone sur Mars, et j'avais pensé creer un petit programme me permettant de prédire le champ magnétique crée par une source dont on connait sa position pour une zone donnée. Dans la fenetre de commande, j'aimerai rentrer tous mes parametres type: calcul.exe <prof_source> <latitude_source> <long_source> <lat_min de ma zone d'etude> <lat_max> <lon_min> <lon_max> <altitide du satellite qui est constante> <Mr moment magnétique r > <Mt> <Mp> <resolution> <fichier de sortie ou je vais stocker mes valeurs Br BT bp>

en fait je veux rentrer tous ces parametres afin qu'il puisse me calculer Br BT et Bp à la fin, or quand je lance ce programme, il ne finit jamais , j'ai surement une erreur de formulation dans ma boucle ou dans le fait d'afficher mes parametres mais je ne vois pas et je vous demande une petite aide!!!! je vous remercie par avance

//*Calcul_champ_mag.exe*/
/*on va entrer plusieurs parametres afin de calculer le champ magnetique */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <malloc.h>

#define M_PI   3.14159265358979323846
#define PI_180 (M_PI / 180.0)
#define rp 3393.5


#define WRITEl1 "%lf %lf %lf %lf %lf %lf %lf \n"



int main(argc, argv)
int argc;
char *argv[];
{
FILE   *fout, *f;
char   str[200];
double r, theta, phi;   //*parametres d'observation */
double alt, lat, lon;
double lat_min, lat_max;
double lon_min, lon_max;
double r_d, theta_d, phi_d;  //*parametres du dipole */
double prof_d, lat_d, lon_d;
double Mr_d, Mt_d ,Mp_d;
double l;
double A1, A2, A3;
double B1, B2, B3;
double C1, C2, C3;
double F1, F2, F3;
double Br, Btheta, Bphi;
double x;
double resol;
int i;
double D1,D2,D3;
double prod1, prod2, prod3;
double prod11, prod21, prod31;
double prod111,prod211, prod311;
double F;
double inc;
double l3;

printf("############################################################\n");
printf("Calcul_champ_mag.exe\n\n");
/*printf("\tEntrez les parametres necessaires :\n");*/
printf("Calcul_champ_mag.exe <prof_d> <lat_d> <lon_d> <lat_min> <lat_max> <lon_min> <lon_max> <alt> <Mr_d> <Mt_d> <Mp_d> <inc> <fout> \n");
/* lire les inputs */
prof_d=atof(argv[1]);
scanf("%lf", &prof_d);
lat_d=atof(argv[2]);
scanf("%lf", &lat_d);
lon_d=atof(argv[3]);
scanf("%lf", &lon_d);
lat_min = atof(argv[4]);
scanf("%lf", &lat_min);
lat_max = atof(argv[5]);
scanf("%lf", &lat_max);
lon_min=atof(argv[6]);
scanf("%lf", &lon_min);
lon_max=atof(argv[7]);
scanf("%lf", &lon_max);
alt=atof(argv[8]);
scanf("%lf", &alt);
Mr_d=atof(argv[9]);
scanf("%lf", &Mr_d);
Mt_d=atof(argv[10]);
scanf("%lf", &Mt_d);
Mp_d=atof(argv[11]);
scanf("%lf", &Mp_d);
inc = atof(argv[12]);
scanf("%lf", &inc);






/*modification pour avoir des degres --- a changer*/
/*lat_d = 90.-thetad/PI_180;*/
/*lon_d = phid/PI_180;*/
/*prof_d = rd - rp;*/


theta_d = 90.-(lat_d*PI_180);
phi_d = lon_d*PI_180;
r_d = prof_d+rp;

/* calcul */
for (lat=lat_min; lat<lat_max; lat += inc)
	for(lon=lon_min; lon<lon_max; lon +=inc)
  {

theta = 90.-(lat*PI_180);
	phi = lon*PI_180;
	r = alt+rp;



/* calcul des parametres A*/

A1=cos(theta)*cos(theta_d)+sin(theta)*sin(theta_d)*cos(phi-phi_d);
A2=-sin(theta)*cos(theta_d)+cos(theta)*sin(theta_d)*cos(phi-phi_d);
A3=-sin(theta_d)*sin(phi-phi_d);

/*calcul des parametres B*/

B1=cos(theta)*sin(theta_d)-sin(theta)*cos(theta_d)*cos(phi-phi_d);
B2=-sin(theta)*sin(theta_d)-cos(theta)*cos(theta_d)*cos(phi-phi_d);
B3=cos(theta)*sin(phi-phi_d);

/*calcul des parametres C*/

C1=sin(theta)*sin(phi-phi_d);
C2=cos(theta)*sin(phi-phi_d);
C3=cos(phi-phi_d);

/*calcul de l*/
x=acos(cos(theta)*cos(theta_d)+sin(theta)*sin(theta_d)*cos(phi-phi_d));
l=sqrt((r_d*r_d)+(r*r)-2*r_d*r*cos(x));

/*calcul des parametres D*/
D1=r-r_d*A1;
D2=-r_d*A2;
D3=-r_d*A3;

/*calcul des parametres F*/
F1=r*A1-r_d;
F2=-r*B1;
F3=r*C1;

/*calcul prod1 prod2 prod3 pour Br*/
prod1=((3*D1*F1)/(l*l))-A1;
prod2=((3*D1*F2)/(l*l))+B1;
prod3=((3*D1*F3)/(l*l))-C1;

/*calcul prod11 prod21 prod31 pour Btheta*/
prod11=((3*D2*F1)/(l*l))-A2;
prod21=((3*D2*F2)/(l*l))+B2;
prod31=((3*D2*F3)/(l*l))-C2;

/*calcul prod111 prod211 prod311 pour Bphi*/
prod111=((3*D3*F1)/(l*l))-A3;
prod211=((3*D3*F2)/(l*l))+B3;
prod311=((3*D3*F3)/(l*l))-C3;


/*Calcul des composantes du champ magnetique*/
l3=l*l*l;
Br=Mr_d*(prod1/(l3))+Mt_d*(prod2/(l3))+Mp_d*(prod3/(l3));
Btheta=Mr_d*(prod11/(l3))+Mt_d*(prod21/(l3))+Mp_d*(prod31/(l3));
Bphi=Mr_d*(prod111/(l3))+Mt_d*(prod211/(l3))+Mp_d*(prod311/(l3));

/*calcul du champ*/

/* sortie vers fichier */

fprintf(fout, WRITEl1,prof_d,lat_d,lon_d,alt,Br,Btheta,Bphi);

}
}

- edit de Quarky : Ajout des balises codes :incline: -

Link to comment
Share on other sites

euh, deja, n'hesite pas a diviser tout ca en differentes fonctions, et a reutiliser des variables (quit a ne pas afficher tous les resultats a la fin, mais a les afficher au fur et a mesure des operations)

ensuite, pas non plus la peine de faire le define M_PI, il est deja dans ta libmath

pour savoir d'ou vient ton erreur, write est ton ami

tu fais write(1, "test1\n", 6); un peu partout dans ton code pour voire exactement d'ou vient ton erreur

sinon, pour le main, en principe, on fait

int main(int argc, char **argv) (ou char *argv[] pour reprendre ta notation)

pense egalement a controlle les arguments passes en entree, ton probleme pourrait venir d'un nombre insuffisants de parametres en entree, par exemple.

bonne chance :p

Link to comment
Share on other sites

Moi ce que je ne comprends pas trop, c'est pourquoi, en premier tu lis la valeur de tes variables dans la ligne de commande

 prof_d=atof(argv[1]); 

en ensuite tu les redemande à l'utilsateur en lisant sur l'entrée standard

 scanf("%lf", &prof_d); 

Le mieux à mon avis c'est de faire soit l'un, soit l'autre, et si tu tiens absolument à utiliser scanf, faire d'abord un truc du genre :

 printf( "entrez la valeur de la latitude") 

pour que l'utilisateur sache quelle valeur il doit entrer.

En fait je me demande si tu ne fais pas une confusion entre paramètre de la ligne de commande et l'entrée standard : en utilisant argv, tu utilises les valeurs passées à la suite du nom de ton programme, avec scanf, tu demande à l'utilisateur de d'entrer la valeur, une fois le programme lancé.

En fait que crois pas que ton programme bloque, mais plutôt qu'il est en attente d'une entrée au clavier.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...