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 :

pour pointer une matrice


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Par défaut pour pointer une matrice
    double** matriceCarree(int n)
    {
    double** D;
    D=new double[n][n];

    Bonjour je veux declarer un pointeur de matrice et cette ecriture m'affiche cette erreur sur la ligne "D=new double[n][n];"

    cannot convert `double*' to `double**' in assignment

    Pouvez vous m'aider,merci d'avance.

  2. #2
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double **D;
    *D = new double*[n];
    for int(i(0);i<n;i++) D[i] = new double[n];

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Par défaut
    moi je veux un pointeur de matrice D[i] [j]
    pour pouvoir faire
    for(int j=0;j<n;j++)
    {
    for (int i=0;i<n;i++)
    {
    cout<<"saisissez l'element "<<i+1<<" du vecteur numero "<<j+1<<"de la matrice "<<n<<"/"<<n<<endl;
    cin>>D[i][j];
    }
    }
    return D;

    apres la declaration
    peux tu m'expliquer le code que tu m'as filé.

  4. #4
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    bah tu créer un pointeur de pointeur pour un double.

    Tu alloue donc une première dimension en faisant le new double*[n];

    Ensuite, pour chaques "case" tu alloue ta deuxiemme dimension.

    Tu obtient dont ton tableau a deux dimension.

    PS : Idem pour la destruction mais tu doit détruire dabord ta deuxiemme dimention avant la première.

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Ton problème vient du fait que double** déclare en fait un pointeur de pointeur sur des doubles.
    C'est pour cela qu'en choisissant cette structure, tu es obligé d'allouer (puis de désallouer) séparemment chaque ligne de ta matrice, comme le fait Higestromm.
    Les seuls avantages de cette structure sont:
    -la syntaxe d'un acces: p[i][j], mais 2 accès mémoire (pour les 2 pointeurs)
    -la rapidité pour échanger les lignes, qui nécessite en fait d'interchanger des pointeurs.

    On croise souvent la structure précédente (dans les mauvais programmes en C), mais il faut préférer l'allocation suivante, qui alloue d'un seul coup la matrice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double *p=new double[M*N] ;
    Il faut accéder aux éléments de la manière suivante un peu moins intuitive mais plus rapide pour le processeur (1 seul accès mémoire + instructions spéciales du processeur)
    Le mieux consiste néanmoins à manipuler les matrices par une classe dédiée, que tu peux écrire toi même ou trouver dans une bibliothèque. Tu n'auras plus alors à t'occuper des détails tels que l'allocation.
    Le choix de la bibliothèque dépendera de tes besoins.

  6. #6
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Citation Envoyé par Charlemagne
    Ton problème vient du fait que double** déclare en fait un pointeur de pointeur sur des doubles.
    C'est pour cela qu'en choisissant cette structure, tu es obligé d'allouer (puis de désallouer) séparemment chaque ligne de ta matrice, comme le fait Higestromm.
    Les seuls avantages de cette structure sont:
    -la syntaxe d'un acces: p[i][j], mais 2 accès mémoire (pour les 2 pointeurs)
    -la rapidité pour échanger les lignes, qui nécessite en fait d'interchanger des pointeurs.

    On croise souvent la structure précédente, mais il faut préférer l'allocation suivante, qui alloue d'un seul coup la matrice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double *p=new double[M*N] ;
    Il faut accéder aux éléments de la manière suivante un peu moins intuitive mais plus rapide pour le processeur (1 seul accès mémoire + instructions spéciales du processeur)
    Le mieux consiste néanmoins à manipuler les matrices par une classe dédiée, que tu peux écrire toi même ou trouver dans une bibliothèque. Tu n'auras plus alors à t'occuper des détails tels que l'allocation.
    Le choix de la bibliothèque dépendera de tes besoins.
    +1

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Par défaut
    merci a tous infiniment car j'ai enfin resolu mon probleme.
    probleme resolu.

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Bien que cela cela un excellente exercice pour tous les niveaux, je ne peux que te conseiller d'utiliser une des nombreuses classes de matrices qui fourmillent sur le net.
    Les meilleures (boost.uBlas, Blitz++, newmat, ...) gèreront correctement et efficacement la mémoire sans risquer les fuites en cas d'erreur comme c'est le cas dans ton code.

    Ceci dit, c'est un excellent exercice pour tous les niveaux.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre éclairé Avatar de elghadi_mohamed
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Citation Envoyé par Higestromm
    bah tu créer un pointeur de pointeur pour un double.

    Tu alloue donc une première dimension en faisant le new double*[n];

    Ensuite, pour chaques "case" tu alloue ta deuxiemme dimension.

    Tu obtient dont ton tableau a deux dimension.

    PS : Idem pour la destruction mais tu doit détruire dabord ta deuxiemme dimention avant la première.

    il faut l'allocation pour un pointeur

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/03/2008, 15h29
  2. Quelle composante utiliser pour lire une matrice
    Par Layla dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/02/2008, 12h31
  3. Lire fichier pour creer une matrice
    Par PKO06 dans le forum Langage
    Réponses: 8
    Dernier message: 27/04/2007, 16h53
  4. Réponses: 18
    Dernier message: 24/07/2006, 19h30
  5. [LG] Problème pour afficher une matrice
    Par phoebee dans le forum Langage
    Réponses: 4
    Dernier message: 11/08/2005, 21h41

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