laroche1 Posté(e) le 24 février 2007 Partager Posté(e) le 24 février 2007 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 - Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 24 février 2007 Partager Posté(e) le 24 février 2007 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
magnig Posté(e) le 24 février 2007 Partager Posté(e) le 24 février 2007 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
gotier47 Posté(e) le 25 février 2007 Partager Posté(e) le 25 février 2007 C'est tout à fait ça, vire tes scanff et passe tes paramètres quand tu lances l'executable. Et pour ecrire dans ton fichier de sortie, utilise plutot fopen et fwrite (ou un printf avec une redirection quand tu appelles ton executable) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.