Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/02/2007, à 18:37

laroche1

aide debutante programmation

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);

    }
}

Hors ligne

#2 Le 24/02/2007, à 18:54

best_friend_fr

Re : aide debutante programmation

Bonjour,

Les scanf que tu fais vont lire l'entrée standard. Ton programme attend donc que tu tappes quelque chose au clavier.


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#3 Le 24/02/2007, à 19:00

laroche1

Re : aide debutante programmation

Bonjour, il faut donc que j'enleve les scanf mais il faut que je mettes quoi pour qu'il comprenne que je veux lui rentrer des valeurs?

Hors ligne

#4 Le 24/02/2007, à 19:02

best_friend_fr

Re : aide debutante programmation

Quand tu fais

prof_d=atof(argv[1]);

il va chercher le premier argument et le convertit en long

scanf("%lf", &prof_d);

est donc inutile. Supprime tous les scanf.


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#5 Le 24/02/2007, à 19:07

any

Re : aide debutante programmation

oui deja pourquoi mettre des scanfs si tu envois les parametres par des arguments et que tu les recuperes deja avec atof(argv[n]);

sinon big_smile

le style de la declaration de la fct est un peu obselete !
int main(int argc,char ** argv) c'est plus courrant  smile

tu ne verifies pas le nombre de tes parametres , c dangereux !
fait au moins une verif avec argc

tu fwrite dans fout et tu n'as  meme pas ouvert ( et recuper en argument )  fout ,
fout=fopen(argv[13],"w");

et moi j'utiliserais plus un fichier de conf qu'un  programme a N milles parametres.

#6 Le 24/02/2007, à 19:13

best_friend_fr

Re : aide debutante programmation

Ouais, enfin tappes pas trop dessus any... tu as vu le titre de la question.

Par contre, après avoir fait le fopen et écrit, n'oublie pas le fclose.

En, gros, ton programme peut ressembler à ca

//*Calcul_champ_mag*/
/*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(int argc,char** argv)
{
    FILE   *fout;
    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\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]);
    lat_d=atof(argv[2]);
    lon_d=atof(argv[3]);
    lat_min = atof(argv[4]);
    lat_max = atof(argv[5]);
    lon_min=atof(argv[6]);
    lon_max=atof(argv[7]);
    alt=atof(argv[8]);
    Mr_d=atof(argv[9]);
    Mt_d=atof(argv[10]);
    Mp_d=atof(argv[11]);
    inc = atof(argv[12]);


    fout = fopen(argv[13],"w");

/*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);
	
    }
   fclose(fout);
}

Je t'ai aussi enlevé le .exe wink inutile sous Linux

Dernière modification par best_friend_fr (Le 24/02/2007, à 19:26)


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#7 Le 24/02/2007, à 19:23

any

Re : aide debutante programmation

je tappe pas je tappe pas big_smile

le  fopen et le fclose dans le for c pas une bonne idee smile

plutot fopen juste apres le 12 arg

fout=fopen(argv[13],"w");
if(fout==NULL)return 0;

et le fclose apres la boucle for !

et un petit  if(argc!=14 )return 0 ; au minimum au debut du prog

#8 Le 24/02/2007, à 19:27

best_friend_fr

Re : aide debutante programmation

Exact pour la position du fopen et du fclose, c'était très mal


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#9 Le 24/02/2007, à 19:40

laroche1

Re : aide debutante programmation

RE, j
'ai donc essayé vos conseils et ça me donne un fichier, merci beaucoup je suis donc dans la bonne voie!!!
mais le probleme maintenant ce sont mes boucles for , je sens qu'elles sont pas bonnes;  dans mon fichier final je devrait avoir une colonne de valeurs Br, Bt,Bp correspondant à chaque valeur de lat et long, or ça ne corresond qu'a un point! (apres vos modif , g des colonnes!!!!!youpppi or c'est bizard j'ai que des 0 pour les valeurs que je cherche Br , Bt, Bp. c'est pas un probleme de boucle et de theta???vous auriez pas une idée de où ça pourrait venir?
en tout cas je vous remercie beaucoup

Dernière modification par laroche1 (Le 24/02/2007, à 19:47)

Hors ligne

#10 Le 24/02/2007, à 19:51

best_friend_fr

Re : aide debutante programmation

Chez moi

./a.out 1 2 3 0 10 0 10 8 9 0 1 1 toto

marche (avec la version corrigée pour les fopen et fclose)
Ce qui est etonnant, c'est ce que tu affiche (tu affiche lat_d et lon_d), des valeurs qui ne varient pas. Tu es sure que c'est pas lat et lon qui comptent (d'ailleurs, c'est quoi lon_d et lat_d?)


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#11 Le 24/02/2007, à 19:58

laroche1

Re : aide debutante programmation

Oui ça marche ,
Non en fait j'ai modifié , j'ai rajouté 2 colonnes tres importantes effectivement lat et lon pour savoir où je calcul mes composantes B
les 3 premieres colonnes ne sont pas necessaires effectivement , c'est juste la position en profondeur de ma source ou dipole d'ou le _d, et sa position en lat et long;
Par contre tu as des valeurs pour les 3 dernieres valeurs? car moi g des colonnes de 0 ce qui est par normal à mon avis

Hors ligne

#12 Le 24/02/2007, à 19:59

best_friend_fr

Re : aide debutante programmation

J'ai des valeurs faibles, mais pas toutes nulles.

Après, il faut revoir tes calculs...


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#13 Le 24/02/2007, à 20:06

laroche1

Re : aide debutante programmation

Ok ça vient peut etre des valeurs qui sont trop faibles....je vais verifier....
merci , j'avais une derniere question c'est à propose des tests par if , il faut ouvrir des accolades?

Hors ligne

#14 Le 24/02/2007, à 20:09

best_friend_fr

Re : aide debutante programmation

Ca dépend

if (condition)
       instruction;

fonctionne.

Mais si tu as plusieurs instructions, tu dois faire
if (condition) {
     inst1;
     inst2;
}
c'est pareil pour les for d'ailleurs


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#15 Le 24/02/2007, à 20:11

laroche1

Re : aide debutante programmation

OK merci beaucoup pour toutes ces informations et votre aide
Je vais jouer à faire varier mes valeurs maintenant ....
A bientot

Hors ligne