IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Comprendre un programme existant


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut Comprendre un programme existant
    Bonjour

    Encore et toujours plongé dans la sismique jusqu'au cou, je reviens vous demander de l'aide pour me sortir d'un mauvais pas. Il s'agit cette fois de déchiffrer un programme existant pour pouvoir le bidouiller ensuite. Je mets le code avec mes questions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    // 
    // Source des conditions aux limites du cas Choc4
    //
     
    #include "stdio.h"
     
    BEGIN_NAMESPACE_MKA3D // Quelle est l'utilité de cette ligne?
     
    //
    // Particule aux limites
    //
     
    void Cond_limite_ext::init_CL() // Que veut dire cette ligne? Quelle est la signification de la syntaxe :: ?
    {
    int Nxg, Nxd, flag1, flag2, flag3, flag4;
     
    Index32u ID, ID_J;  // Quelle est la signification de cette ligne? Est ce un moyen de déclarer quelque chose?
     
    double alpha, xdist1, xdist2;
    double xx1, xx2, xx3, xx4, xmin1, xmin2, xmin3, min4;
    flag1=0;
    flag2=0;
    flag3=0;
    flag4=0;
    xmin1=1000000;
    xmin2=1000000;
    xmin3=1000000;
    xmin4=1000000;
     
    iterateur_particule_ext itpart; // Même question que précédemment: quelle est la fonction de cette ligne? Est-ce une manière de déclarer quelque chose?
                                    // Si oui, comment cela fonctionne-t-il dans la mesure où il n'y a aucun type indiqué avant le terme? D'autre part, quel
    				// est l'intérêt de rajouter itpart après le terme iterateur_particule_ext?
     
    Particule_ext* part; // Même question qu'à la ligne précédente
    //Pointeur sur le gestionnaire des messages:
    Mka3D_msg* msg=Mka3D_msg::get_ptr(); // Quelle est l'utilité d'un tel pointeur? Normalement, lorsqu'on définit un pointeur, l'astérisque est devant le
                                         // terme et non derrière. Pourquoi n'est ce pas le cas ici?
     
    //Programme:
     
    //Initialise data:
    set_Zmax_explo(-9999);
    set_Zmin_explo(9999);
    set_Rmax_explo(-9999);
    set_Zmax_cuivre(-9999);
    set_Zmin_cuivre(9999);
    set_Rmax_cuivre(-9999);
    set_Zmax_pmma(-9999);
    set_Zmin_pmma(9999);
    set_Rmax_pmma(-9999);
    set_rayon_moy(0);  // Que veulent dire ces lignes? A quoi correspondent les valeurs de -9999 et 9999?
     
    //Données locales:
    int ii;
    alpha=2.;
    Nxg=0;
    Nxd=0;
     
    //Identification des DE composants des bords
    //Initialisation des positions:
     
     for (itpart=premiere_particule(); itpart!=derniere_particule; itpart++)  // Comment peut on faire une boucle comme cela alors que les termes
                                                                              // premiere_particule() et derniere_particule() n'ont jamais été définis?
         {
          part=(*itpart);
          ID=part->get_ID();
          part->set_cl_boundx(-1);
          part->set_cl_boundy(-1);   // Quelle est la signification de ces 3 lignes? Que signifie la syntaxe ->? Dans mon bouquin de C, j'ai quelque chose sur getc, mais rien sur get.
                                     // A quoi corredpond cette notation? Quelle est sa fonction? Comment l'utiliser? Que signifient boundx(-1) et boundy(-1)?      
     
          //Condition sur le radier plus le sol:
          xx1=part->get(pos(1);
          if(xx1==-1048.0)
            {
    	 cout <<"On releve pour source" <<part->get_pos(0)<< " "<<part->get_pos(1) <<end1; // Quelle est la signification de cette ligne? Quelle est cette syntaxe?
          // cout <<"On releve pour source" <<part->get_pos(2)<<end1;
             part-set_cl_boundx(1);
    	}
          if(xx1==-1036)
            {
    	 cout <<"On releve pour source" <<part->get_pos(0)<< " "<<part->get_pos(1) <<end1;
          // cout <<"On releve pour source" <<part->get_pos(2)<<end1;
             part-set_cl_boundx(2);
    	}
    	 part->set_vel(0, 0);
    	 part->set_vel(1, 0);
    	 part->set_vel(2, 0); // Que veulent dire ces lignes? Quel est leur but dans le programme?
          }
           cout<<"valeur xmin1"<<xmin1<<end1; // Même question que quelques lignes plus haut? Que veut dire la syntaxe << ?
    }
     
    // Info sur l'essai:
     
    void Cond_limite_ext::init_array_tool()
    {
    //Initialisation des données utilisateur (tableaux et scalaires)
    // Ces données sont utilisables dans l'ensemble des méthodes présentes dans ce fichier
    //
    //Procedure appelée en début de simulation (avant init_CL()) et a chaque reprise de calcul:
     
    string nom_fic; // Dans mon bouquin de C, la notation string n'intervient que sous la forme de string.h, un petit fichier à inclure dans le cadre de la copie de chaînes
    ifstream fic_don;
    int int_temp, ndatz;
    Kflo reel_temp; // Pour être honnête, je ne comprends strictement rien à la signification de ces 4 lignes.
     
    // set_nb_scal_int(1);
    set_nb_tab_reel(2);  // Quelle est cette syntaxe?
    // Nombre de valeurs à lire
    int_temp=19684; // 19684 pas de temps pour courbeI1 en 2D
    // int_temp=14264; // 14264 pas de temps pour courbeI2 en 2D
     
    // On lit 31 points (y, x), plus le temps, soit 63 valeurs
     
    nom_fic="./courbeI1";
    //nom_fic="./courbeI2";
    // D'après le terminal que j'utilise, utiliser une syntaxe du type ./fichier revient à donner l'ordre de faire tourner un exécutable. Est-ce le cas ici? Si oui, d'où vient ce
    // fichier exécutable? Les notations courbeI1 et courbe I2 n'ont jamais été utilisée avant dans le programme, donc je ne vois pas comment il pourrait les reconnaître.
    fic_don.open(nom_fic.c_str());
     
    // Lecture du nombre d'éléments et dimensionnement du tableau correspondant: (Ligne 119 du programme)
    for (int i=0; i<2; i++)
        {
     set_dim_tab_reel(i, int_temp); //Encore une question de syntaxe: je ne comprends pas à quoi correspond cette ligne....
        }
     
    //cout<<int_temp<<end1;
    //Lecure des données:
    //for(int i=0;i<get_scal_int(0); i++)
    //   {
       for (int i=0; i<int_temp; i++)
           {
            fic_don>>reer_temp; // temps
    	// cout<<"i"<<i<<" "<<reel_temp<<end1;
    	set_tab_reel(0, i, reel_temps);
    	fic_don>>reel_temp; // Lecture variable
    	//cout<<"i"<<1<<" "<<i<<" "<<reel_temp<<end1;
    	set_tab_reel(1, i, reel_temp);
     
    	//Fermeture du fichier:
    	  fic_don.close();
    	}
     
    // ------------------------------------------------------------------------------
     
    void Cond_limite_ext::perturbation_Force(Particule_ext* part,Kflo time)
    {
    Kflo wt, vit, fmax;
    Kflo wt2, fmax2;
    Kflo wt3, fmax3;
    Kflo xpi;
    Kflo yy;
    fmax=2.;
    fmax2=2.;
    fmax=0.5;
    xpi=4.*atan(1.);
    wt=2.*xpi*fmax;
    wt2=2*xpi*fmax2;
    wt3=2*xpi*fmax3;
    //attention
    // wt*=1.8;
    int i;
    Kflo ftot[3]; // Quelle est la justification des crochets à cet endroit?
    Kflo ver[3];
    Kflo ft[3];
    Kflo fn[3];
    Kflo xn[3];
    Kflo xx, xfact;
    Kflo xx1;
    Kflo xvel1;
    int i1, i2, ijk, nn;
    Kflo dal, xvalue;
    int iflag;
     
    Kflo ua, xcs, xdt;
    if(part!=NULL)
      {
       if(part->get_cl_boundx()>0)
         {
          //xcs=sqrt(4.392046e10/(1.25*2.*2600.));
          //Calcul de ua à partir de la courbe
          //Evaluation en fonction de la courbe
          //Recherche du pas de temps:
          xvalue=0;
          nn=19684;
          //19684: pas de temps pour courbeI1 en 2D
          //On change avec un while pour gagner du tps cpu
          for(ijk=0; ijk<nn-1;ijk++)
             {
              ijk=0;
              iflag=0;
    	  do
    	    {
    	     if(get_tab_reel(0, ijk) <= time && time < get_tab_reel(0, ijk+1)) // Que signifie la notation get_tab_reel (..., ...)?
    	       {
    	        i1=ijk;
    		i2=ijk+1;
    		da1=(time-get_tab_reel(0, ijk+1))/(get_tab_reel(0, ijk+1)-get_tab_reel(0, ijk));
    		xvalue:(1.-da1)*get_tab_reel(1, i1)+da1*get_tab_reel(1, i2);
    		iflag=1;
    		}
    	     else
    	       {
    	        ijk =ijk+1;
    	       }
    	       }
    	   while(iflag==0);
    	     }
      }
    // Fin d'évaluation en fonction de la courbe
    ua=xvalue;
    // Calcul de ua à partir de la courbe
    vit=(2.*ua)*4.392046e8/(1.25);
       if(part->get_c1_boundx()==1)
         {
          vit *= -1;
         }
     
    // Onde S
    yy=part->get_pos_init(0);
    yy=yy-4500.;
    yy=sqrt(yy*yy);
    if(yy>3000.)
      {
       vit=0.;
      }
       part->set_Ftot(0, part->get_Ftot(0)+vit);
       part->set_Mrm(2, 0.);
      }
      }
    };
     
    //-----------------------------------------------------------
    void Cond_limite_ext::perturbation_velocity(Particule_ext* part,Kflo time)
    {
     if(part!=NULL)
       {
       // Mouvement de translation pour le projectile:
        if (part->get_cl_boundx()>0)
           {
            part->set_velrot(2, 0.);
    	part->set-e(2, 0.);
           }
        }
    };
     
    // Enregistrement des données:
     
    void Cond_limite_ext::save_cont(double time)
    {
     int ID, ID_J;
     int indice;
     int nb;
     double hug, sx, sy;
     double DIJ, DIJ_init;
     double fi;
     double f2;
     double pression_pmma, pression_cuivre, v_moy_cuivre, v_moy_quartz, v_moy_pmma, v_couple;
     int ind_cuivre, ind_quartz, ind_pmma;
     
     iterateur_particule_ext itpart;
     Particule_ext* part;
     Metre position [3];
     // Pointeur sur le gestionnaire de messages
     Mka3D_msg* msg=Mka3D_msg::get_ptr();
     
     pression_cuivre=0;
     pression_pmma=0;
     v_moy_cuivre=0;
     v_moy_quartz=0;
     v_moy_pmma=0;
     ind_cuivre=0;
     ind_pmma=0;
     ind_quartz=0;
     v_couple=0;
     nb=0;
     hug=0;
     sx=0;
     sy=0;
     fi=0;
     f2=0;
     indice=1;
     }
     // Enregistrement des valeurs:
     void Cond_limite_ext::oerturbation_Disp(Particule_ext* part, Kflo time)
     {
     };
     
     
     END_NAMESPACE_MKA3D
    Alors, mon premier souci est le suivant: quand je le compile, j'obtiens un message d'erreur du type:
    cond_limite_ext.C:13: error: expected constructor, destructor, or type conversion before 'void'

    Je ne comprends absolument pas ce que ça veut dire.
    Dans un premier temps, si vous pouviez éclairer ma lanterne sur les différents points que je ne comprends pas, ce serait super sympa.

    Une fois que je l'aurai bien en main, j'essaierai de le bidouiller pour obtenir ce que je souhaite.

    À bientôt tout le monde

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    Ton code a l'air d'être du C++...
    Bien le bonjour chez vous
    Jowo

  3. #3
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Bonjour,

    Je te conseille de lire un bon tutorial de C/C++ pour commencer. Ce n'est jamais plaisant de lire des bouquins de 400 pages mais ça répondrait à beaucoup de tes questions.

    Ensuite entraîne-toi à faire divers exercices avant de t'attaquer à un code comme celui-ci.

    http://cpp.developpez.com/cours/

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Où as-tu trouvé ce code ?

    Ce n'est pas du C++ standard pur: Il y a ici utilisation d'une bibliothèque...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est effectivement du C++, pas du C.
    Quelques explications malgré tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Cond_limite_ext::init_CL() // Que veut dire cette ligne? Quelle est la signification de la syntaxe :: ?
    Ceci est la définition d'une fonction init_CL() membre d'une classe Cond_limite_ext

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Index32u ID, ID_J;  // Quelle est la signification de cette ligne? Est ce un moyen de déclarer quelque chose?
    Ceci, comme en C, déclare deux variables ID et ID_J du type Index32u ( qui peut être une classe (en C++) ou défini par un typedef dans un fichier d'en-tête (.h))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iterateur_particule_ext itpart; // Même question que précédemment: quelle est la fonction de cette ligne? Est-ce une manière de déclarer quelque chose?
                                    // Si oui, comment cela fonctionne-t-il dans la mesure où il n'y a aucun type indiqué avant le terme? D'autre part, quel
    				// est l'intérêt de rajouter itpart après le terme iterateur_particule_ext?
    Même réponse que ci-dessus : Ceci, comme en C, déclare une variable itpart du type iterateur_particule_ext ( qui peut être une classe en C++ ou défini par un typedef)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Mka3D_msg* msg=Mka3D_msg::get_ptr(); // Quelle est l'utilité d'un tel pointeur? Normalement, lorsqu'on définit un pointeur, l'astérisque est devant le
                                         // terme et non derrière. Pourquoi n'est ce pas le cas ici?
    l'astérisque est à sa place habituelle : msg est un pointeur sur un type Mka3D_msg.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set_Zmax_explo(-9999);
    set_Zmin_explo(9999);
    ....
    Vu le nom des fonctions, je pense que -9999 est la valeur minimum d'un Zmax_explo et 9999 sa valeur maximum. Cette initialisation semble être faite pour rechercher les valeurs minimum et maximum d'une série de Zmax_explo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     for (itpart=premiere_particule(); itpart!=derniere_particule; itpart++)  // Comment peut on faire une boucle comme cela alors que les termes
                                                                              // premiere_particule() et derniere_particule() n'ont jamais été définis?
    premiere_particule est une fonction et derniere_particule une variable probablement membres de la classe Cond_limite_ext ( C'est du C++ !)

    .......
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Merci à tous pour vos réponses.

    Pour répondre à Médinoc, c'est mon boss qui m'a passé ce code, mais comme je suis loin d'être une expert en la matière, je n'ai pas su faire la différence entre C et C++.

    Je vais à présent passer à la seconde partie de ce topic, à savoir la manière de bisouiller ce code.
    Dans la mesure où je suis débutant en C, je ne suis pas parvenu à interpréter la signification exacte de ce programme. Cela dit, je sais qu' il traite d'un profil rectangulaire maillé et qu'il se focalise sur 2 rangées horizontales de cellules.
    Mes questions sont au nombre de 3:
    1) J'aimerais imposer au programme les dimensions 13000 et 2000 respectivement en longueur et hauteur à mon profil, mais je ne sais concrètement pas où je dois entrer ces renseignements
    2) Je souhaiterais transformer le code pour qu'il ne traite pas deux rangées de cellules horizontales, mais verticales. Là encore, je ne suis pas sûr de savoir comment il faut faire.
    3) Et enfin, le but est d'arriver à simuler des mouvements sismiques dans le sol. J'aimerais donc arriver à imposer un déplacement (vertical, horizontal ou même oblique, ce n'est pas important) quelque part dans le profil. Le but est de voir ce que ça génère sur mes deux séries de cellules (mais ça, le code s'en charge, du moins je pense. Ce qu'il me faudrait, c'est l'endroit et la manière d'entrer un déplacement).

    Une dernière remarque générale: on m'avait dit que ce site était vraiment génial pour les gens dans mon cas. J'en suis maintenant convaincu . Sans votre aide, je serais vraiment dans la m.... Merci beaucoup

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Flo Flo Voir le message
    Je vais à présent passer à la seconde partie de ce topic, à savoir la manière de bisouiller ce code.
    Bonjour,
    J'ai peur que pour cette second partie ce ne soit que trop aventurier d'essayer de répondre. Il faudrait auparavant savoir quel est le but du code, quels sont ses spécifs, les algos mis en œuvre, quelle conception traduit ces spécifications. Même si je doute que le projet soit complètement documenté, partir à l'aveugle avec quelques dizaines de lignes de code ne permet pas vraiment d'en comprendre l'entière logique. Je crains que cela ne relève de ton boulot d'apprentissage du logiciel que tu es en train de modifier .

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    C'est vrai que ce que je souhaite obtenir n'est pas forcément limpide

    Je vais essayer autre chose. Je dispose d'un code qui a été tiré de celui que j'ai posté un peu plus haut et qui a été adapté pour qu'il corresponde à une poutre en béton (en 2D, ça s'apparente à un profil rectangulaire, comme le mien). On m'a prêté ce code pour m'aider dans mes déboires
    Il est nettement simplifié par rapport à celui que j'ai posté. Je vais essayer d'en faire quelque chose pour qu'il colle à ce que je souhaite et je le posterai ensuite pour que vous puissiez me dire ce que vous en pensez.

    À tout à l'heure

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Hello

    Alors voilà. Comme je le disais dans mon dernier post d'hier, j'ai repris un code simplifié qu'on m'a passé pour m'aider. Ce code était lui même issu de celui que j'ai posté plus haut et avait pour but de traiter un cas de flexion sur une poutre en béton. J'ai essayé de le modifier pour l'adapter à ce que je voulais.

    Je vais poster les deux codes. Tout d'abord l'original et puis ensuite le mien, afin que les différences soient clairement visibles. Dans le mien, j'ai mis des questions pour clarifier certains points.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    // 
    // Source des conditions aux limites flexion 3 points sur poutre_1
    //
     
    #include "cond_limite_ext.h"
     
    BEGIN_NAMESPACE_MKA3D
     
    //		------------------------------------------------------------ 
    //		PARTICULE		AUX		LIMITES
    //		------------------------------------------------------------
     
    void Cond_limite_ext::init_CL()
    {
     
    //longueur de la poutre
    float L = 1.100 ;
    //hauteur de la poutre
    float H = 0.250 ;
    //  largeur des appuis
    float A = 0.015 ;
    //  pour deplacement imposé
    float l = 0.400 ;
    //  distance des centres des elts du bord au bord
    float B = 0.015 ;  
     
     
    iterateur_particule_ext itpart;
    Particule_ext* part;  
     
      for (itpart  = premiere_particule() ; 
           itpart != derniere_particule() ; itpart++ ) 
        { 
          part = (*itpart);
     
    //  reperage des groupes
     
          part->set_cl_boundx(-1);
          part->set_cl_boundy(-1);
     
    //  symetrie : reperage des particules à droite-----> x 1      
    	if ( part->get_pos(0) > L - B ) 
    		{ part->set_cl_boundx(1); } 
     
    //  appui : A mm de large, B mm de haut, a 100mm du bord gauche -----> x 2      
    	else if ( (part->get_pos(0) > 0.100 - A/2 ) && (part->get_pos(0) < 0.100 + A/2 ) && (part->get_pos(1) < B))
    		{ part->set_cl_boundx(2); } 
     
    //  deplacement imposé : A mm de large, Bmm de haut, a l mm du bord droit -----> x 3      
    	else if ( (part->get_pos(0) > L - l - A/2 ) && (part->get_pos(0) < L - l + A/2 ) && (part->get_pos(1) > H - B)) 
    		{ part->set_cl_boundx(3); } 
     
     
     
    //  condition initiale de vitesse nulle
     
              part->set_vel(0, 0.) ; 
              part->set_vel(1, 0.) ; 
              part->set_vel(2, 0.) ; 
     
        } 
     
      // Info sur l'essai 
     
    } 
     
    void Cond_limite_ext::init_array_tool(){} 
     
    //------------------------------------------------------------  
     
    void Cond_limite_ext::perturbation_Force(Particule_ext* part,Kflo time) 
    { 
     
    //  pas de forces imposées
     
    };
     
    //------------------------------------------------------------ 
    //------------------------------------------------------------ 
    void Cond_limite_ext::perturbation_velocity(Particule_ext* part,Kflo time)
    {  
     
      if ( part != NULL )
        {
          //  vitesse verticale bloquée pour les particules de l'appui
          if (  part->get_cl_boundx()  == 2 )		
            {
                part->set_vel(1, 0.) ;
            }
          // vitesse horizontale bloquée pour la symétrie	
          if (  part->get_cl_boundx()  == 1 )		
            {
                part->set_vel(0, 0.) ;
            }       
        }
    };
     
    //-----------------------------------------------
    // ENREGISTREMENT DONNEE
    //-------------------------------------------------
     
    void Cond_limite_ext::save_cont(double time){}
     
    // fonction de déplacement
    float depla(double time) 
    {return(0.05*time);}
     
    void Cond_limite_ext::perturbation_Disp(Particule_ext* part,Kflo time) 
    { 
     
      if ( part != NULL )
        {
        // deplacement imposé 
     
          if ( part->get_cl_boundx() == 3 )		
            {
    	  part->set_pos(1, part->get_pos_init(1) - depla(time)) ;
    	}
        }
    };
     
     
    END_NAMESPACE_MKA3D
    Maintenant, je poste le mien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    // 
    // Source des conditions aux limites, déplacement vertical
    //
     
    #include "cond_limite_ext.h"
     
    BEGIN_NAMESPACE_MKA3D
     
    //		------------------------------------------------------------ 
    //		PARTICULE		AUX		LIMITES
    //		------------------------------------------------------------
     
    void Cond_limite_ext::init_CL()
    {
     
    // Longueur du profil
    float L = 13000 ;
    // Hauteur du profil
    float H = 2000 ;
    // Déplacement imposé
    float l = 500 ;
    //  Distance entre les centres des éléments du bord au bord
    float B = 10 ;  
     
     
    iterateur_particule_ext itpart;
    Particule_ext* part;  
     
      for (itpart  = premiere_particule() ; 
           itpart != derniere_particule() ; itpart++ ) 
        { 
          part = (*itpart);
     
    // Repérage des groupes
     
          part->set_cl_boundx(-1);
          part->set_cl_boundy(-1);  // Je ne comprends pas la signification de ces 2 lignes. Que veut dire la notation part->set_cl_boundx?
                                    // De même, quelle est la signification du -1, qui se trouve à l'intérieur des parenthèses?
    				// D'après vous, est-ce à cet endroit que je dois définir deux rangées de particules verticales? Si oui, quelle est la syntaxe à utiliser?
     
    // Symetrie : repérage des particules en haut -----> x 1      
    	if ( part->get_pos(0) > H - B ) 
    		{ part->set_cl_boundy(1); } // Que fait exactement cette instruction conditionnelle? 
     
    // Symetrie : repérage des particules en bas -----> x 2      
    	if ( part->get_pos(0) < B ) 
    		{ part->set_cl_boundy(2); } // Même question qu'à la ligne précédente 
     
     
    // Déplacement imposé : Bmm de haut, à l mm du bord inférieur -----> x 3      
    	else if ( (part->get_pos(0) > B ) && (part->get_pos(0) < H - B ) && (part->get_pos(1) > L - B)) // D'après vous quelle est la signification des valeurs 0 ou 1 dans
    	                                                                                                         // les get_pos()?
    		{ part->set_cl_boundy(3); } // Même question concernant la signification de la valeur 3 dans le boundx()
     
     
     
    // Condition initiale de vitesse nulle
     
              part->set_vel(0, 0.) ; 
              part->set_vel(0, 1.) ; // Que veulent dire les 2 valeurs entre parenthèses? D'après ce que je crois, il me semble que ce sont des vitesses suivant x et y.
              part->set_vel(0, 2.) ; // Je pense donc qu'ici, les vitesses suivant "y" sont nulles à chaque fois (??). 
    				 // A votre avis, les valeurs entre parenthèses correspondent elles à des valeurs de vitesse (genre la vitesse suivant x du 3ème serait de 
    				 // 2 alors que celle du 2nd serait de 1) ?
        } 
     
    // Info sur l'essai 
     
    } 
     
    void Cond_limite_ext::init_array_tool(){} 
     
    //------------------------------------------------------------  
     
    void Cond_limite_ext::perturbation_Force(Particule_ext* part,Kflo time) 
    { 
     
    // Pas de forces imposées
     
    };
     
    //------------------------------------------------------------ 
    //------------------------------------------------------------ 
    void Cond_limite_ext::perturbation_velocity(Particule_ext* part,Kflo time)
    {  
     
      if ( part != NULL )
        {
    // Vitesse horizontale bloquée
          if (  part->get_cl_boundy() == 2 )		
            {
                part->set_vel(0, 1.) ;
            }       
        }
    } ;
     
    //-----------------------------------------------
    // ENREGISTREMENT DONNEES
    //-------------------------------------------------
     
    void Cond_limite_ext::save_cont(double time){}
     
    // Fonction de déplacement
    float depla(double time) 
    {return(0.05*time);}
     
    void Cond_limite_ext::perturbation_Disp(Particule_ext* part,Kflo time) 
    { 
     
      if ( part != NULL )
        {
        // Déplacement imposé 
     
          if ( part->get_cl_boundy() == 3 )		
            {
    	  part->set_pos(1, part->get_pos_init(1) - depla(time)) ;
    	}
        }
    };
     
     
    END_NAMESPACE_MKA3D
    Voilà.

    En plus des questions que j'ai posées le long du programme que j'ai modifié, je vous en pose 2 de plus: à votre avis, les manipulations que j'ai effectuées me permettent elles de considérer 2 lignes de cellules verticales et non horizontales (Et sinon, que dois-je faire d'après vous)? Et la seconde question est: ce que j'ai fait correspond il à un mouvement vertical de source sismique comme je le souhaite, ou bien me suis-je complètement planté (Et si je me suis planté, qu'y a-t-il selon vous à modifier)?

  10. #10
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void Cond_limite_ext::init_CL()
    {
       iterateur_particule_ext itpart;
       Particule_ext* part;  
     
         for (itpart  = premiere_particule() ; 
              itpart != derniere_particule() ; itpart++ ) 
           { 
              part = (*itpart);
              // ...
              // initialise ce particule_ext (part)
              // ...
           }
    }
    Ce code itère sur un ensemble d'objet de type Particule_ext et les initialise un par un. Si tu veux comprendre le détail des opérations set_cl_boundx, set_cl_boundy et set_vel, qui sont des fonctions membres de Particule_ext, alors tu dois examiner la définition et l'implémentation de la classe Particule_ext.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Hello

    Bon, alors j'ai eu des explications supplémentaires de la part de mon boss quant à l'emploi de ces mystérieuses fonctions qui parsèment le code. Je pense savoir comment m'en sortir. Éventuellement, je posterai le résultat final sur ce forum pour en discuter avec vous, après avoir expliqué en détails leur fonctionnement, pour que vous ayaez toutes les cartes en main.

    À plus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comprendre un programme Matlab?
    Par nejm59 dans le forum MATLAB
    Réponses: 22
    Dernier message: 12/12/2008, 20h32
  2. Comprendre un programme
    Par Konala dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 27/10/2008, 12h21
  3. Comprendre un programme C simple décompilé
    Par _jeez_ dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 07/10/2007, 16h06
  4. Réponses: 1
    Dernier message: 25/08/2007, 23h14
  5. Créer un installateur de programme existant
    Par maxoudu328 dans le forum Langage
    Réponses: 14
    Dernier message: 24/12/2005, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo