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

Langage C++ Discussion :

Portée des variables


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Portée des variables
    Bonjour,

    J'ai un problème concernant la portée des variables. Je ne comprends pas pourquoi, dans mon programme, je ne peux pas afficher les variables physiques (y,v,a) en dehors du IF.

    À l'extérieur du IF, les variables prennent toutes des valeurs nulles sauf la variable n. Voici un exemple de lignes affichees.

    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Exterieur : t[29]= 0.00000 delta t= 0.00000 y= 0.00000 v= 0.00000 a= 0.00000
    Interieur : t[29]= 0.96012 delta t= 0.03510 y= 1.58867 v= 3.56652 a= 3.85883

    Pourtant, les variables sont déclarées de façon globale au début.

    Voici le code:

    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
    #include <iomanip>
    #include <iostream>
    #include <math.h>
    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
    #include <SFML/Graphics/RenderWindow.hpp>
     
    using namespace std;
     
    int main()
     
    {
    // Paramètres physiques.
     
       const int MF=3037000;       // Masse totale de la fusée [kg].
       const int DMAS=5200;        // Débit massique [kg/s].
       const int VEJECT=2250;      // Vitesse d'éjection des gaz [m/s].
       double MT;                  // Masse de la Terre [kg].
       MT=5,98*pow(10,24);
       const long RT=6378000;      // Rayon de la Terre [m].
       double G;
       G=6,67*pow(10,-11);         // Constante de gravitation universelle [m^3/s^2*kg].
     
    // Compteurs.
     
       int i=0;                    // Compteur.
       int n;                      // Numéro de l'élément échantillonné.
       int N=10000;                // Nombre d'éléments dans les tableaux.
     
    // Variables physiques.
     
       double temps;              // Temps actuel [s].
       double t[N];               // Tableau des temps [s].
       double delta_t[N];         // Tableau des différences de temps [s].
       double y[N];               // Altitude de la fusée [m].
       double v[N];               // Vitesse de la fusée [m/s].
       double a[N];               // Accélération de la fusée [m/s^2].
     
    // Création de la fenêtre.
     
       sf::RenderWindow App(sf::VideoMode(800, 600), "Lancement d'une fusee");
       sf::Font Arial;
       if (!Arial.LoadFromFile("arial.ttf"))
       return EXIT_FAILURE;
     
    // Initialisation des variables.
     
       sf::Clock Clock;
       t[0] = 0;
       delta_t[0] = 0;
       y[0] = 0;
       v[0] = 0;
       a[0] = (DMAS*VEJECT)/(MF-DMAS*t[0])-((G*MT)/pow((RT+y[0]),2));
       n = 1;
     
    // Début de la simulation.
     
       while (App.IsOpened())
       {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
         if (Event.Type == sf::Event::Closed)
         App.Close();
        }
     
        App.Clear();
        temps = Clock.GetElapsedTime();  // Mesure du temps.
        if (i==9)  // Échantillonnage des données (1:10).
        {
         t[n] = temps;
         delta_t[n] = t[n] - t[n-1];
         y[n] = v[n-1]*delta_t[n-1] + y[n-1];
         v[n] = a[n-1]*delta_t[n-1] + v[n-1];
         a[n] = (DMAS*VEJECT)/(MF-DMAS*t[n])-((G*MT)/pow((RT+y[n]),2));
         cout << "Interieur : t["<< std::fixed << setprecision (5) << n<<"]= "<<t[n]<<"  delta t= "<<delta_t[n]<< "   y= " << y[n] <<"   v= "<<v[n]<<"   a= "<<a[n]<< endl<<endl;
         n++;
         i=0;
        }
     
        i=i++;
     
        // Test : Les valeurs affichées ici ne sont pas les mêmes que celles qui sont affichées dans le IF.
        cout << "Exterieur : t["<< std::fixed << setprecision (5) << n<<"]= "<<t[n]<<"  delta t= "<<delta_t[n]<< "   y= " << y[n] <<"   v= "<<v[n]<<"   a= "<<a[n]<< endl;
     
     // Réafficher la fenêtre entière.
     
        App.Display();
    }
      return 0;
    }
    J'aimerais donc savoir, si possible, ce qui ne va pas dans ce programme.

    Merci

  2. #2
    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
    Attention, i=i++;, ça sent mauvais (comportement indéterminé).
    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    OK. J'ai fait la correction. C'est vrai, c'est juste i++.

    J'ai exécuté le programme mais malheureusement ça donne toujours le même résultat.

    Merci.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    ce code compile ?
    rien que l'utilisation de VLA est à bannir.
    des index de tableau jamais checkés, la porte ouvert au crash
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    En fait tu incrémentes n à la sortie de IF, du coup à l'extérieur c'est l'indice n+1, qui n'est pas encore initialisé, qui est affiché...

  6. #6
    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
    Citation Envoyé par Bousk Voir le message
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int N=10000;                // Nombre d'éléments dans les tableaux.
    <snip>
    double t[N];               // Tableau des temps [s].
    rien que l'utilisation de VLA est à bannir.
    Est-il possible que le compilo considère N comme constante connue à la compilation malgré le fait qu'elle ne soit déclarée ni const, ni constexpr?
    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.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses. Je vais les analyser.

    En attendant, je voudrais corriger d'autres erreurs que j'ai commises. Dans l'intialisation des variables, ce n'est pas la virgule que je dois utiliser dans les nombres flottants mais le point.




    MT=5,98*pow(10,24); mais plutôt MT=5.98*pow(10,24);

    G=6,67*pow(10,-11); mais plutôt G=6.67*pow(10,-11);

    Je ne sais pas pourquoi le compilateur n'a pas signalé d'erreur.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Salut,

    ce code compile ?
    rien que l'utilisation de VLA est à bannir.
    des index de tableau jamais checkés, la porte ouvert au crash

    Oui, le programme s'exécute. Bousk, tu mentionnes que l'utilisation de VLA est à bannir. Que signifie VLA?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    ... du coup à l'extérieur c'est l'indice n+1, qui n'est pas encore initialisé, qui est affiché...
    stendahl666, tu avais raison. Merci.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Est-il possible que le compilo considère N comme constante connue à la compilation malgré le fait qu'elle ne soit déclarée ni const, ni constexpr?
    ca doit être ça, mais sans au moins un warning j'ai du mal à le croire

    Dans l'intialisation des variables, ce n'est pas la virgule que je dois utiliser dans les nombres flottants mais le point.
    la virgule est un opérateur qui existe, et qui n'a rien à voir, donc, oui, le code compile et est valide

    http://lmgtfy.com/?q=C%2B%2B+VLA Variable Length Arrays


    il manque de sérieuses bases de connaissance du langage amha
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/02/2005, 09h05
  2. [FLASH MX] Portée des variables ???
    Par mic79 dans le forum Flash
    Réponses: 2
    Dernier message: 08/02/2005, 10h21
  3. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 10h14
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  5. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05

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