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 :

Pointeurs + Fonction + Débutant = Error


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 54
    Points
    54
    Par défaut Pointeurs + Fonction + Débutant = Error
    Bien le bonjour, ça fait une vingtaine de minutes que je bloque et je n'arrive pas à trouver la solution ... peut-être que j'ai mal compris l'utilisation des pointeurs (ça doit être courant dans le coin ).

    Bref, j'essaye d'insérer une valeur dans un tableau composé d'autre chiffres.
    J'insère une valeur précis à une position précise.

    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
     
    #include <iostream>
    using namespace std;
     
    //Fonction permettant d'insérer une valeur "val" à une position "pos" 
    dans un tableau "tab" de taille "tai"
    void insertValeur( int* pos, int* val , int* tai, int* tab[]){
        int i;
        *tai += 1;
        for ( i = *tail ; i > *pos ; i--){
            *tab[i] = *tab[i-1];
        }
        *tab[*pos] = *val;
     
    }
     
    int main()
    {
        // Definition du tableau
        int taille,i;
        taille = 5;
        int tableau[taille];
     
        for (i=0 ; i<taille ; i++ )
        {
            tableau[i] = i;
            cout << tableau[i] << endl;
        }
     
        // Insertion de valeur à l'aide de la fonction insertValeur
        int position = 3;
        int valeur = 42;
     
        insertValeur(&position , &valeur , &taille , &tableau);
     
     
        {
     
            cout << "nouvelles valeurs  : " << tableau[i] << endl;
        }
        return(0);
    }

    Il me retourne une erreur qui me parait bizarre avec des int** ( pointeur de pointeur ? ).


    Merci d'avance pour votre aide, je sais que je peux utiliser la classe vector et ses insert, push_front et push_back mais pourquoi faire simple lorsque l'on peut faire compliqué ?

  2. #2
    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
    Salut,
    Une variable tableau coincide avec l'adresse du premier élément. Inutile de prendre son adresse pour la passer en argument d'une fonction pour en modifier les éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void insertValeur( int* pos, int* val , int* tai, int tab[])
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insertValeur(&position , &valeur , &taille , tableau);
    Ceci dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    taille = 5;
    int tableau[taille];
    Ceci n'est pas standard en C++. Les tableaux doivent avoir une taille connu à la compilation. Cela peut avoir l'air d'être le cas avec ton code, mais le fait que taille ne soit pas constant signifie que taille pourrait très bien changer de valeur entre temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        // Definition du tableau
        int i;
        int const taille = 5;
        int tableau[taille];
    Et là tu verras une belle surprise dans ton code .

    Je ne comprend pas non plus le passage systématique par pointeur de tous les arguments de ta fonction : ce n'est pas pertinent dans tous les cas, voire carrément inefficace. Les types natifs (int, double, char, etc.) se passe en général plutôt par valeur lorsqu'ils n'ont pas besoin d'être modifiés dans la fonction. Lorsqu'on veut modifier un paramètre, on le passe plutôt par référence. Je ne passe des arguments par pointeurs que si la valeur nul est pertinente dans la fonction. Sinon, je privilégie systématiquement les références. Voilà le genre de signature à laquelle je me serais attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void insertValeur( int pos, int val , int& tai, int tab[])
    voire carrément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace
    {
        const int taille_tableau = 5;
    }
     
    //Fonction permettant d'insérer une valeur "val" à une position "pos"
    //dans un tableau "tab" de taille "tai"
    void insertValeur( int pos, int val , int& tai, int tab[taille_tableau])
    Citation Envoyé par Kiwii Voir le message
    Merci d'avance pour votre aide, je sais que je peux utiliser la classe vector et ses insert, push_front et push_back mais pourquoi faire simple lorsque l'on peut faire compliqué ?
    A l'école, tu as appris la division avant d'apprendre à compter ? Ben pourquoi ce serait différent avec le C++ : apprend à bien programmer avec des vecteurs et quand tu maîtriseras un certain nombre de notions de base, alors va vers des notions plus complexes comme les pointeurs.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Sans vouloir être indiscret, je pense que dans le cas présent, il serait intéressant de connaitre le contexte, ce qui provoque le besoin.
    Par exemple, que veut dire "insérer un élément à telle position dans un tableau"?
    Ca veut dire écrire et remplacer la valeur qui s'y trouvait et insérer dans la liste, c'est dire décaler vers le haut les valeurs existantes, pour faire de la place.

    Si c'est un exercice, là il est indispensable de connaitre le contexte, c'est à dire le libellé exact de l'exercice, le titre du chapitre étudié etc.

    Soit une classe dans laquelle les élèves sont assis devant leur table.
    Arrive un nouveau, le professeur lui dit de s'installer à la table N° 5. Résoudre le problème.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 54
    Points
    54
    Par défaut
    Merci de vos réponses.

    Le contexte c'est simple : je fais du C en classe et du C++ chez moi tout simplement parce que ça m'amuse.
    Pour apprendre le C++ je suis le livre "Penser en C++" et approfondi les passages qui m'intéressent ( j'avais regardé de plus près les vecteurs, compris comment ça marchait mais pas compris le code car c'est une classe et je ne sais pas utiliser une classe ni en créer une ).

    Dans un exo en cours on nous avais demandé de trouver le moyen d'insérer une valeur à une certaine position d'un tableau, après avoir réussi sans fabriquer de fonction j'ai décidé d'en faire une et comme j'étais à la partie pointeurs dans le bouquin je me suis tout de suite orienté vers cette manière de faire
    Simple comme contexte non ?


    Pour en revenir au sujet, j'ai pas encore vu les références ( mais ça a l'air plutôt utile comme truc ) et je débute dans les pointeurs ( c'est pour cela que je bute quand j'essaye de pointer un tableau ).

    Quand je parle d'insérer une valeur c'est décaler les valeurs du tableau pour faire de la place à une nouvelle qui s'y glisse

    Certes, il faut commencer par le commencement et ne pas griller les étapes, mais pour savoir utiliser à fond les vecteurs il faut savoir manipuler les classes et les pointeurs . Or, je ne sais pas utiliser correctement ni l'un ni l'autre : autant commencer par étudier la première notion que me propose le livre, les pointeurs avant les classes !


    Mon problème est bientôt résolu, en lisant la bible du C le dieu du C est en route pour me venir en aide .
    Je ne met pas encore [Résolu] devant mon post donc


    PS : J'aurais du mettre le const devant l'int, c'est une valeur qui n'allait pas bouger de toute façon et qui me permettait de clarifier le code dans ma tête
    La bible marche bien mais j'ai des surprises à l'exécution .

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

Discussions similaires

  1. Fonction Récursive --> error '80020009'
    Par mattyeux dans le forum ASP
    Réponses: 1
    Dernier message: 19/06/2007, 12h35
  2. pb fonction parse error!!
    Par freija dans le forum Langage
    Réponses: 1
    Dernier message: 06/07/2006, 17h30
  3. pointeurs, fonctions et modifications...
    Par kw1k dans le forum C
    Réponses: 2
    Dernier message: 01/04/2006, 17h42
  4. aide sur les fonctions (débutant)
    Par tregont dans le forum Débuter
    Réponses: 4
    Dernier message: 22/01/2006, 21h03
  5. [PRO*C] pointeur + fonctions
    Par Fabouney dans le forum Interfaces de programmation
    Réponses: 9
    Dernier message: 18/01/2006, 14h05

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