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 :

fonctions, pointeurs et matrices C++


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 18
    Points
    18
    Par défaut fonctions, pointeurs et matrices C++
    Bonjour,
    J'ai un problème dans un programme en C++.
    J'ai une matrice A à laquelle je souhaite appliquer la fonction carre. Le problème vient peut être de l'argument de la fonction carre qui est un double pointeur. Je ne vois pas comment corriger mon erreur.
    Merci de m'aider.
    Je vous copie le code que j'ai écrit :
    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
     
     
    int main(){
        int i, j, n, m;
        int A[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        carre(3,4,A);
      return 0;
    }
     
    void carre1(int nblignes, int nbcols, int **M){
         int i, j;
         for(i=0;i<nblignes;i++){
              for(j=0;j<nbcols;j++){
                   M[i][j]=M[i][j]*M[i][j];
              }
         }
    }

  2. #2
    screetch
    Invité(e)
    Par défaut
    un double tableau n'est pas pareil qu'un tableau de pointeurs. tu dois donner a la fonction un tableau de pointeurs, ou la fonction doit prendre en parametre un tableau de tableau

    une solution possible est de convertir ta fonction en template, avec nblignes et nbcols les arguments template et la matrice etant l'argument de la fonction

    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
     
     
     
    template< int nblignes, int nbcols >
    void carre(int (&M)[nblignes][nbcols]){ // reference sur un tableau de tableau d'entiers
         int i, j;
         for(i=0;i<nblignes;i++){
              for(j=0;j<nbcols;j++){
                   M[i][j]=M[i][j]*M[i][j];
              }
         }
    }
     
    int main(){
        int i, j, n, m;
        int A[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        carre<3,4>(A);
      return 0;
    }

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    plusieurs solutions


    la plus explicite
    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
     
    #include <iostream>
    void carre(int nblignes, int nbcols, int M[3][4]){
         int i, j;
         for(i=0;i<nblignes;i++){
              for(j=0;j<nbcols;j++){
    	    M[i][j]=M[i][j]*M[i][j];
    	       std::cout << M[i][j] << "  ";
              }
    	  std::cout << std::endl;
         }
    }
     
    int main(int argc ,char * argv[]){
        int i, j, n, m;
        int A[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        carre(3,4,A);
      return 0;
    }

    la moins claire, elle nécéssite de savoir que l'on doit passer un tableau en argument et implique de calculer les indices soit même...
    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
     
    #include <iostream>
    void carre(int nblignes, int nbcols, int *M){
         int i, j;
         for(i=0;i<nblignes;i++){
           int index_x= i * nbcols;
              for(j=0;j<nbcols;j++){
    	    M[index_x +j]=M[index_x+j]*M[index_x+j];
    	       std::cout << M[index_x+j] << "  ";
              }
    	  std::cout << std::endl;
         }
    }
     
    int main(int argc ,char * argv[]){
        int i, j, n, m;
        int A[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        carre(3,4,&A[0][0]);
      return 0;
    }
    autre solution utiliser des vector, developper une classe spécifique.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Merci, pour ces réponses. Comme je veux pouvoir utiliser cette fonction sur d'autres matrices, j'ai utiliser un pointeur pour l'argument de la fonction. Mais exite-t-il une solution pour pouvoir encore utiliser M[i][j] dans la fonction sans utiliser la fonction template, ni changer la déclaration de A ?
    Sinon, j'ai alors écrit :
    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
     
    void carre(int nblignes, int nbcols, int *M){
         int i, j;
         for(i=0;i<nblignes;i++){
                for(j=0;j<nbcols;j++){
    	    M[i * nbcols +j]=M[i * nbcols+j]*M[i * nbcols+j];
     
              }
         }
    }
     
     
    int main(){
        int i, j;
        int A[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
     
        carre(3,4,&A[0][0]);
     
        // Affichage
         for(i=0;i<3;i++){
             for(j=0;j<4;j++){
                  cout << "A[" << i << "][" << j << "] =" << &A[i][j] << ",";
             }
             cout << endl;
        }
     
        return 0;
    }
    Cependant, je n'arrive pas à faire l'affichage, j'ai dû me tromper ... Je ne comprends pas comment faire.
    Encore merci à vous deux pour votre aide.

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par inforum Voir le message
    Merci, pour ces réponses. Comme je veux pouvoir utiliser cette fonction sur d'autres matrices, j'ai utiliser un pointeur pour l'argument de la fonction. Mais exite-t-il une solution pour pouvoir encore utiliser M[i][j] dans la fonction sans utiliser la fonction template, ni changer la déclaration de A ?
    Non.
    M[i][j] ne sera calculable par le compilateur que si les bornes sont connues du compilateur. Ce n'est pas ce que tu souhaites.

    Citation Envoyé par inforum Voir le message
    Cependant, je n'arrive pas à faire l'affichage, j'ai dû me tromper ... Je ne comprends pas comment faire.
    Encore merci à vous deux pour votre aide.
    cout << "A[" << i << "][" << j << "] =" << A[i][j] << ",";

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Cependant, je n'arrive pas à faire l'affichage, j'ai dû me tromper ... Je ne comprends pas comment faire.
    Encore merci à vous deux pour votre aide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                 cout << "A[" << i << "][" << j << "] =" << A[i][j] << ",";
    sans le &

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup !

  8. #8
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Au passage, micro amélioration qui peu avoir son importance si les matrices sont grandes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void carre(int nblignes, int nbcols, int *M){
      int i;
      int nbElement = nblignes * nbCols;
         for(i=0;i<nbElement;i++){
                 M[i]=M[i]*M[i];   
              }
         }
    }

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/05/2010, 18h18
  2. Transposer une matrice avec fonctions, pointeurs
    Par bpascal123 dans le forum Débuter
    Réponses: 5
    Dernier message: 06/04/2010, 10h55
  3. Fonctions manipulant des matrices
    Par panda31 dans le forum C
    Réponses: 24
    Dernier message: 14/06/2006, 11h28
  4. Pointeurs de matrices ??
    Par Invité dans le forum C
    Réponses: 17
    Dernier message: 04/04/2006, 22h42
  5. Paramètres de fonction : pointeurs ou valeurs ?
    Par Xandar dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/11/2005, 17h50

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