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 01/03/2007, à 15:30

laroche1

aide debutante programmation en c

bonjour,
J'ai un autre petit soucis cette fois avec la programmation en c

Je vous explique mon soucis

J'ai deux fichiers
Un où j'ai pleins de paramètres repartis en colonnes

et l'autre où je voudrais lui demander de lui une ligne de l'autre fichier or je ne sais pas comment lui faire comprendre

voici mon premier fichier "dipole.vec" avec par colonne la lat_d,lon_d,prof_d,M,I,D (crée sous xemacs)

0 0 40 5 90 0
0 0 40 5 60 0
0 0 40 5 30 0


et j'amerais le lire (par lignes)  dans fin quand je rentre mes diférents parametres "calcul_champ_mag_exe. <fin>...."

et voici mon code en c
//*Calcul_champ_mag1.exe*/
/*on va entrer plusieurs parametres afin de calculer le champ magnetique */
/*dans ce fichier on calcule Mr_d,Mt_d et Mp_d a partir de I et D*/

#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 READl1 "% % % %lf %lf %lf\n"
#define WRITEl2 "% % % %13.9lf %13.9lf %13.9lf\n"



int main(argc, argv)
int argc;
char *argv[];
{
    FILE   *fout, *f, *fin;
    int row;
    double M, I, D;
    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");*/
if(argc!=15 )
    {
    prinf("erreur nombre de parametres\n");
    exit(-1);
    }
    printf("Calcul_champ_mag.exe <fin> <lat_min> <lat_max> <lon_min> <lon_max> <alt> <inc> <fout> \n");
    /* lire les inputs */


    fin= fopen(argv [1],"r");

for (i=0;i<row;i++)
      {
        fscanf(fin, READl,
               &lat_d,&lon_d,&prof_d,&M,&I,&D);
    }

    lat_min = atof(argv[2]);

    lat_max = atof(argv[3]);

    lon_min=atof(argv[4]);

    lon_max=atof(argv[5]);

    alt=atof(argv[6]);

    inc = atof(argv[7]);

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

if(fout==NULL)
    {
    return 0;
    }





/*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 = rp-prof_d;

/*calcul de Mr_d, Mt_d,Mp_d dont les resultats seront ecrits dans un autre fichier */

I_rad=I*PI_180
D_rad=D*PI_180

Mr_d=M*sin(I_rad);
Mt_d=M*cos(I_rad)*cos(D_rad);
Mp_d=M*cos(I_rad)*sin(D_rad);


/* calcul  */
    for (lat=lat_min+(inc/2); lat<lat_max+(inc/2); lat += inc)
        for(lon=lon_min+(inc/2); lon<lon_max+(inc/2); 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_d)*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 en nanotesla*/
    l3=l*l*l;
    Br=(Mr_d*(prod1/(l3))+Mt_d*(prod2/(l3))+Mp_d*(prod3/(l3)))*1000000000.;
    Btheta=(Mr_d*(prod11/(l3))+Mt_d*(prod21/(l3))+Mp_d*(prod31/(l3)))*1000000000.;
    Bphi=(Mr_d*(prod111/(l3))+Mt_d*(prod211/(l3))+Mp_d*(prod311/(l3)))*1000000000.;

/*calcul du champ*/

    /* sortie vers fichier */
   
    fprintf(fout, WRITEl2,lat,lon,alt,Mr_d,Mt_d,Mp_d,Br,Btheta,Bphi);
    }
fclose(fout);
fclose(fin);
}


je vous remercie

Hors ligne

#2 Le 01/03/2007, à 16:42

best_friend_fr

Re : aide debutante programmation en c

Bonjour

La programmation demande beaucoup de rigueur. Fais attention !!

D'abord, tu as écrit un prinf au lieu de printf.
Ensuite,
#define READl1 "% % % %lf %lf %lf\n"
cette ligne devrait être
#define READl1 "%lf %lf %lf %lf %lf %lf\n"
(je ne comprends pas pourquoi tu n'as pas mis tous les lf ??????)

ensuite, dans ton fscanf, tu mets READl au lieu de READl1.

Enfin, tu es dans une boucle portant sur le nombre row, et tu ne définit nulle part sa valeurs. Donc le programme n'exécute jamais la boucle.

Fais toutes ces corrections, et ca marchera.
Et rappelle toi, l'ordinateur ne fait que ce que tu lui dis de faire. Il faut respecter la syntaxe !


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 01/03/2007, à 16:54

laroche1

Re : aide debutante programmation en c

Merci pour tes conseils, effectivement j'ai fait des étourderies!!!!!
Pour les lf, je les avais enlevé car je ne voulais pas des nombres decimaux, il faut les remplacer par ld?

En fait row fait quoi exactement? car je sais pas si c'est bien ça qu'il faut mettre pour lire ma ligne de valeurs

Dernière modification par laroche1 (Le 01/03/2007, à 16:55)

Hors ligne

#4 Le 01/03/2007, à 17:23

best_friend_fr

Re : aide debutante programmation en c

La encore, l'essentiel est d'être cohérente.

Si tu veux des entiers, il faut mettre des
%d
mais il faut aussi déclarer les variables
lat_d, lon_d et prof_d, comme des int et non des double.


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 01/03/2007, à 17:30

laroche1

Re : aide debutante programmation en c

OUlala c'est compliqué comme programme car celui que j'avais avant été plus simple.

Enfin, c'est pour gagner de l'espace....au lieu de creer x fichiers de une ligne de parametres , les rassembler en un c'est mieux!

Sinon pour mon soucis de prise en compte de ligne, c'est bien comme j'ai écrit ou c'est pas ça!!

Hors ligne

#6 Le 01/03/2007, à 17:37

best_friend_fr

Re : aide debutante programmation en c

Ce que tu fais la, c'est que tu lis toutes les lignes à la suite. Mais comme tu ne fais rien entre 2 lectures, je ne vois pas à quoi servent les lignes (sauf la dernière).

La, il lit la ligne 1
il lit la ligne 2
il lit la ligne 3
il fait le reste du programme.

Donc il ne travaille jamais sur les 2 premières lignes.

Si tu veux qu'on voit ca plus en détails, envoie moi un mail avec ton msn. Parce que tu as l'air d'avoir des lacunes... on en parlera demain.

La chose importante, c'est que tu dois comprendre ce que tu veux, et comment le dire à l'ordinateur (structurer ton algorithme). Si je te donne la réponse toute faite, tu ne progresseras pas.


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