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 :

probleme de débutant [Débutant(e)]


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 226
    Par défaut probleme de débutant
    Bonjour mon code ne fonctionne pas bien je sais qu'il y a des probleme au niveau des pointeurs dans le main
    si quelqu'un peut m'aider merci d'avance

    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
    #include <iostream>
     
    using namespace std; 
     
    int saisirtab(int* tab, int n)
    {
        int i;
        cout << "Veuillez remplir le tableau \n";
        for (i=0; i<n; i++)
        {
            cin >> tab[i];
        }   
    }
     
    int affichetab(int* tab, int n)
    {
        int i;
        for (i=0;i<n; i++)
        {
            cout << tab[i] << " " ;
        }
     
        cout << endl;
     
    }
     
    int echange(int *i, int *j)
    {
        int temp;
        temp=*i;
        *i=*j;
        *j=temp;
    }
     
    int echange(int &i,int &j)
    {
        int temp;
        temp=i;
        i=j;
        j=temp;
    }
     
    namespace valeur{
        int echange(int i, int j)
        {
            int temp;
            temp=i;
            i=j;
            j=temp;
        }
     
    }
     
     
    int main ()
    {
        //par pointeur
        int* a;
        int* b;
        int x = 2;
        int y = 4;
     
        int *tabi;
        tabi = new int [5];
        saisirtab(tabi, 5);
        affichetab(tabi, 5);
        *a = x;
        *b = y;
        echange(*a, *b);
        cout << "a=" << a << " b=" << b << " ";
        &a = &x;
        &b = &y;
        echange(&a, &b);
        cout << "a=" << a << " b=" << b << " ";
        valeur::echange(a,b);
        cout << "a=" << a << " b=" << b << " ";   
    }

  2. #2
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Bienvenue sur le forum C++ !

    1) ton message n'a rien à faire dans la section SL/STL (bibliothèque standard du C++), la prochaine fois met le dans C++ directement

    2) tu vois qu'il y a une problème, mais indique nous les erreurs de compilation ! : je met celles que j'obtiens car tu as au moins indiqué un code assez clair et complet :


    Building target “test” — (7 errors, 5 warnings)
    cd /Users/lioobayoyo/test
    /usr/bin/gcc-4.0 -x c++ -arch ppc -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -g -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 -mtune=G5 -mfix-and-continue -fvisibility-inlines-hidden -I/Users/lioobayoyo/test/build/test.build/test.build/test.hmap -F/Users/lioobayoyo/test/build -I/Users/lioobayoyo/test/build/include -I/Users/lioobayoyo/test/build/test.build/test.build/DerivedSources -c /Users/lioobayoyo/test/main.cpp -o /Users/lioobayoyo/test/build/test.build/test.build/Objects-normal/ppc/main.o
    /Users/lioobayoyo/test/main.cpp: In function `int main()':
    /Users/lioobayoyo/test/main.cpp:71: error: non-lvalue in assignment
    /Users/lioobayoyo/test/main.cpp:72: error: non-lvalue in assignment
    /Users/lioobayoyo/test/main.cpp:73: error: no matching function for call to 'echange(int**, int**)'
    /Users/lioobayoyo/test/main.cpp:27: note: candidates are: int echange(int*, int*)
    /Users/lioobayoyo/test/main.cpp:35: note: int echange(int&, int&)
    /Users/lioobayoyo/test/main.cpp:75: error: invalid conversion from 'int*' to 'int'
    /Users/lioobayoyo/test/main.cpp:75: error: initializing argument 1 of 'int valeur::echange(int, int)'
    /Users/lioobayoyo/test/main.cpp:75: error: invalid conversion from 'int*' to 'int'
    /Users/lioobayoyo/test/main.cpp:75: error: initializing argument 2 of 'int valeur::echange(int, int)'
    /Users/lioobayoyo/test/main.cpp: In function `int saisirtab(int*, int)':
    /Users/lioobayoyo/test/main.cpp:13: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int affichetab(int*, int)':
    /Users/lioobayoyo/test/main.cpp:25: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int echange(int*, int*)':
    /Users/lioobayoyo/test/main.cpp:33: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int echange(int&, int&)':
    /Users/lioobayoyo/test/main.cpp:41: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int valeur::echange(int, int)':
    /Users/lioobayoyo/test/main.cpp:50: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int main()':
    /Users/lioobayoyo/test/main.cpp:71: error: non-lvalue in assignment
    /Users/lioobayoyo/test/main.cpp:72: error: non-lvalue in assignment
    /Users/lioobayoyo/test/main.cpp:73: error: no matching function for call to 'echange(int**, int**)'
    /Users/lioobayoyo/test/main.cpp:27: note: candidates are: int echange(int*, int*)
    /Users/lioobayoyo/test/main.cpp:35: note: int echange(int&, int&)
    /Users/lioobayoyo/test/main.cpp:75: error: invalid conversion from 'int*' to 'int'
    /Users/lioobayoyo/test/main.cpp:75: error: initializing argument 1 of 'int valeur::echange(int, int)'
    /Users/lioobayoyo/test/main.cpp:75: error: invalid conversion from 'int*' to 'int'
    /Users/lioobayoyo/test/main.cpp:75: error: initializing argument 2 of 'int valeur::echange(int, int)'
    /Users/lioobayoyo/test/main.cpp: In function `int saisirtab(int*, int)':
    /Users/lioobayoyo/test/main.cpp:13: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int affichetab(int*, int)':
    /Users/lioobayoyo/test/main.cpp:25: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int echange(int*, int*)':
    /Users/lioobayoyo/test/main.cpp:33: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int echange(int&, int&)':
    /Users/lioobayoyo/test/main.cpp:41: warning: control reaches end of non-void function
    /Users/lioobayoyo/test/main.cpp: In function `int valeur::echange(int, int)':
    /Users/lioobayoyo/test/main.cpp:50: warning: control reaches end of non-void function
    Build failed for target "test" using build style "Development" (7 errors, 5 warnings)

  3. #3
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    En résumant grosso modo il y a deux types d'erreurs :

    tu as des fonctions qui ne renvoient pas de valeur (echange, affiche....). Ces fonctions doivent donc etre void et non int. (les warning le montrent : il n'y a aucun "return" dans le corps de la fonction, le compilo le voit et te prévient que si par malheur tu faisais "comme si" tes fonctions retournaient qqchose, alors il y aurait un comportement indéterminé. Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int a= 5;
    int b= 3;
    int c;
     
    c = echange(a, b); // ici le compilateur accepte car echange() est de type int et non void. Pourtant ça ne veut rien dire. (et impossible de savoir ce qu'il y aura dans c après cet appel car aucun return dans la fonction echange() )


    Le deuxième type d'erreurs concerne comme tu l'as dit les pointeurs.

    ça fait beaucoup de choses, mais j'aimerai en relever rapidement certaines.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int *a;
    int *b;
     
    // ou int *a, *b;
    Ces instructions définissent en effet 2 variables (avec leur propre adresse) de type "pointeur sur un int".

    Néanmoins sur quel int pointent-elles ? Aucun car tu ne les a pas initialisées. Les adresses mémoire &a et &b existent (c'est l'adresse des pointeurs), mais leur contenu, leur valeur, est indéterminé (c'est à dire l'adresse pointée n'est a priori pas valide).

    Jusque là ce n'est pas un problème, tant que tu ne les utilises pas.

    Revoici le début de ton main() : (j'ai changé la place de la partie sur les tableaux, on s'en occupera plus tard)

    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
     
    int main ()
    {
        //par pointeur
        int* a;
        int* b;
        int x = 2;
        int y = 4;
     
        *a = x;
        *b = y;
     
        echange(*a, *b);
        cout << "a=" << a << " b=" << b << " ";
        &a = &x;
        &b = &y;
        echange(&a, &b);
        cout << "a=" << a << " b=" << b << " ";
        valeur::echange(a,b);
        cout << "a=" << a << " b=" << b << " ";  
     
        // j'ai mis les tableaux a la fin... car ils n'ont aucun lien avec le reste, pour la lisibilité :
           int *tabi;
        tabi = new int [5];
        saisirtab(tabi, 5);
        affichetab(tabi, 5);
    }

    Tu vois les lignes *a = x et *b = y ?

    Il y a un problème car tu n'as pas dit vers quoi pointaient a et b ! donc changer la valeur pointée est absurde : on ne sait pas ou l'ecrire. Cette instruction ne fait pas pointer a et b ailleurs, par ex. vers x ou y, ou une zone mémoire où leur valeur serait écrite. Non.
    Cette instruction dit : Hey, tu sais, là où a et b pointent, il y a un des int, c'est ça ? et bien change la valeur qui se trouve là bas par celle de x et de y.

    Le problème c'est que à ce niveau a et b ne sont pas initialisés donc ne pointent pas vers grand chose. il faudrait au moins, avant cette instruction, faire a = new int; et b = new int; et vérifier si a et b ne sont pas NULL (car allouer de la mémoire peut rater, s'il n'y en a plus assez pour le système par exemple) avec un if(a==NULL) ... . Enfin bien sur c'est un "programme exemple pour comprendre", donc je comprend que tu ne l'ai pas fait.


    Et pourquoi est-ce que je voulais parler de cette erreur avant tout ?

    D'une part c'est la première dans l'ordre du main(), et surtout car elle NE FAIT PAS partie des erreurs que le compilateur remarque à première vue. Elle pourrait donner un warning, mais la syntaxe *a = x; est JUSTE, donc compile. Le problème est "logique" comme on dit : ça ne fera pas ce que tu voulais faire. (à moins que tu voulais faire crasher ton programme, voire peut-être ton OS bien sur )

    Voila, ensuite je laisse le soin à d'autres (ou moi, mais pas maintenant ) d'expliquer les prochaines erreurs (il y en a pas mal), ou à toi de nous expliquer les points précis qui te posent problème. N'hésite pas à faire un tour dans la FAQ C++ et C pour les pointeurs / références.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 226
    Par défaut
    Merci grace a tes explication plus des recherches j'ai réussi a résoudre mon souci j'ai en effet mis des void a mes fonctions et j'ai alloué le contenu de a et b directement

  5. #5
    Nouveau candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut Incompréhension
    Bonjour à tous, je suis débutant en C++
    j'ai déjà pas de base en C, mais compte tenue de mon programme académique je suis contraint de bosser avec le C++.
    j'ai des cours dessus mais le problème que je rencontre actuellement est:
    ---après ma compilation et que je lance mon exécution , je ne vois rien à l'écran juste que la fenêtre de mon éditeur s'abaisse et se réaffiche, mais je ne vois rien au programme.
    -- et quelqu'un pourrait m'expliquer clairement à quoi sert le return ainsi que ses différentes valeurs possible?
    Merci d'avance

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    1. Sans doute un problème lié à ton éditeur. Lequel utilises-tu ?
    2. Pareil qu'en C.
    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
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    pour le return c'est assez simple

    par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int Fonction()
    {
      int A;
        A=2;
        return A;
    }
     
    main()
    {
      int B;
         B=Fonction(); // B contiendra la valeur retourné par la fonction
    }
    tu pe retourné a peu pré tous type , int char, bool, unsigned char etc
    Moi perso je retourne toujours un bool (true ou false) pour savoir si ma fonction c'est bien passé

    cordialement baxter

  8. #8
    Nouveau candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut pb sémantique
    en fait Medinoc, j'utilise dev c++ comme environnement de travail;
    je crois que j'ai encore des problèmes de sémantique dans mes programmes,
    la syntaxe passe à la compilation, mais la sémantique de donne pas le résultat escompté.
    je vais déposé ici demain, mon programme ( rien de spécial du B-A BA) qui compil parfaitement mais donc l'exécution flanche à mon goût.

  9. #9
    Nouveau candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut
    Citation Envoyé par Baxter67 Voir le message
    pour le return c'est assez simple

    par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int Fonction()
    {
      int A;
        A=2;
        return A;
    }
     
    main()
    {
      int B;
         B=Fonction(); // B contiendra la valeur retourné par la fonction
    }
    tu pe retourné a peu pré tous type , int char, bool, unsigned char etc
    Moi perso je retourne toujours un bool (true ou false) pour savoir si ma fonction c'est bien passé

    cordialement baxter
    merci pour cet éclaircie baxter,j'ai juste un peu de mal à me familiariser avec la philosophie très contraignante du c++, comparé au pascal que j'ai fait il y'a environ 6 ans

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

Discussions similaires

  1. Probleme de débutant
    Par Oxygan dans le forum Débuter
    Réponses: 4
    Dernier message: 18/05/2007, 10h13
  2. Probleme Flash + Débutant
    Par ganjaaw dans le forum Flash
    Réponses: 2
    Dernier message: 25/04/2007, 20h55
  3. probleme de débutant
    Par hachdotnet dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/03/2007, 15h17
  4. un probleme de débutant
    Par adel25 dans le forum MFC
    Réponses: 7
    Dernier message: 27/07/2005, 01h08
  5. probleme de débutant avec D3DXVECTOR3
    Par airseb dans le forum DirectX
    Réponses: 6
    Dernier message: 16/08/2003, 21h03

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