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 :

pointeur dans une fonction !


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 105
    Points : 198
    Points
    198
    Par défaut pointeur dans une fonction !
    bonjour tous le monde
    j'ai essaye d’écrire un programme qui compte les nombres des zéros dans une matrice
    le problème quand je passe un tableau statique dans la fonction le compilateur me déclare un erreur

    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
    #include<iostream>
    #include <cstdlib>
    using namespace std;
     
    void nombredesZero(int **A)
    {
        int n = 0;
     
        for (int j = 0; j < 4; j++)
        {
            for (int i = 0; i < 4; i++)
            {
                if (A[i][j] == 0)
                {
                    n++;
                }
            }
            cout << "Nombres Des Zeros Pour la Colonne n°" << j << "est: " << n << endl;
     
        }
    }
     
    int main()
    {
     
        int **A;
        int t[4][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 5 }, { 0, 1, 4, 0 }, { 0, 0, 0, 2 } };
        A = new int*[4];
        for (int i = 0; i < 4; i++)
        {
            A[i] = new int[4];
            for (int j = 0; j < 4; j++)
            {
                cout << "Donner A[" << i + 1 << "][" << j + 1 << "]" << endl;
                cin >> A[i][j];
            }
        }
        system("cls");
        cout << "\n affichage" << endl;
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                cout << A[i][j] << "\t";
            }
            cout << "\n";
        }
        nombredesZero(A);
        nombredesZero(t); // le probleme ici :(
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Quelle erreur ?

    De ce que j'ai vu, t est un nombre (int) et la fonction attend de recevoir un pointeur sur un pointeur sur un int. Du coup, les deux ne sont pas pareils, du coup, le compilateur n'aime pas et vous le dit.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Pour info, l'erreur avec MinGW est :
    error: cannot convert 'int (*)[4]' to 'int**' for argument '1' to 'void nombredesZero(int**)'


    Quand je vois le corps de la fonction de comptage des zéros, je me demande pourquoi son prototype n'est pas comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void nombredesZero(int A[4][4]);

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Un pointeur n'est pas un tableau, et vice versa.
    Le nom d'un tableau est convertible en pointeur vers son premier élément.

    Dans ton code t est un tableau de tableau. Son nom est convertible en pointeur de tableau. Mais un pointeur de tableau n'est pas un pointeur de pointeur.
    C'est précisément ce que te dis ton compilateur: impossible de convertir un pointeur de tableau (int (*)[4]) en pointeur de pointeur d'entier (int **)

    Donc, comme le dit Bktero, tu devrais changer le type d'argument de la fonction.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Hello

    t est bien un tableau de tableaux. Un tableau à une dimension peut être converti en pointeur. Mais un tableau à deux dimensions ne peut pas être converti en pointeur de pointeur.

    La première chose à faire lorsqu'on utilise des matrices c'est justement d'éviter la double dimension.

    De plus, lorsqu'on manipule des pointeurs, il faut trimbaler les tailles avec, et pas les mettre en dur dans le code. Voici du coup une version plus correcte du même 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
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    void nombredesZero(int *A, size_t nb_cols, size_t nb_rows) {
      size_t n = 0;
      for (size_t j = 0; j < nb_cols; ++j) {
        size_t n_this_col = 0;
        for (int i = 0; i < nb_rows; ++i) {
          if (A[j*nb_rows+i] == 0) {
            ++n_this_col;
          }
        }
        cout << "Nombres Des Zeros Pour la Colonne n°" << j << " est: " << n_this_col << "\n";
        n += n_this_col;
      }
     
      cout << "Nombre total de Zeros: " << n << "\n";
    }
     
    int main() {
      int t[4*4] = {0, 1, 2, 3, 0, 2, 3, 5, 0, 1, 4, 0, 0, 0, 0, 2};
      nombredesZero(t,4,4);
    }
    Find me on github

  6. #6
    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
    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. passage de pointeur dans une fonction
    Par El Manco dans le forum Débuter
    Réponses: 10
    Dernier message: 09/02/2009, 22h13
  2. Modification de pointeurs dans une fonction
    Par bluemartini dans le forum Débuter
    Réponses: 4
    Dernier message: 26/09/2008, 10h23
  3. Modifier le contenu de pointeurs dans une fonction
    Par Sol_Invictus dans le forum Débuter
    Réponses: 6
    Dernier message: 11/09/2008, 23h30
  4. Pointeur dans une fonction ?
    Par sliiim6184 dans le forum C
    Réponses: 4
    Dernier message: 28/12/2006, 11h32
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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