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 :

matrice + pointeur


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut matrice + pointeur
    salut tous ,
    c'est ma 1 disccusion sur ce forum et j'éspére que ça passe bien
    bon j'ai un exercice qui consiste à faire les fcts suivantes:
    1.ecrire une fct qui permet d'allouer la mémoire pour une matrice(en utisant biensûr les pointeurs ).
    2.reçoit en argument deux pointeurs (qui pointent sur deux matricle ) et renvoit la multiplication de ces deux matrices .
    nb:je ne sius pas encore bien assimulker la notion des tableausx de pointeur .
    mais voilà mon essai:
    voici la structure matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef  struct {
     int lignes,colonnes;
    double  **coefficient;
    }mat;
    mat m;
    }
    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
    mat *alloue_matrice(int ligne,int colonne)
    {
    mat *m;
    m->ligne=ligne;
    m->colonne =colonne ;
    int i;
    //on va aloeur la mémoire pour chaque case qui contient un tab de pointeur 
    for (i=0;i< m->ligne;i++)
    {
    m->cefficient[i]=(double*)malloc(m->colonne *sizeof(double));
    }
    return m;
    }
    mat *produit_matrice(mat *a,mat *b)
    {
    mat pr;
    int i,j,k;
    //calcule le produit
    if(a->ligne==b->colonne)// est ce que c'est possible d'effectuer la multiplication 
            {
    for(i=0;i<ligne;i++)
       for(j=0;j<colonne;j++)
          **(pr.coefficient[i][j])=0;
                for(k=0;k<a->colonne;k++)
                      {
                    **(pr.coefficient[i][j])=**(a.coefficient[i][k])+**(a.coefficient[k][j])
                    }
            }
    return pr;
    }
    svp j'ai besion de votre aide car j'ai un examen demain

    merci d'avance

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut
    Bonjour,
    Quelle est la question ?

    S'il te plait, essaye de te relire, y'a plein de fautes , d'orthographe, de frappe dans le code et tu as posté ton code en double. C'est vraiment dur de se plonger dedans. N'hésite pas à modifier et corriger ton premier post, tu obtiendras plus de réponses. Et pense à faire une indentation précise.

    Ce que j'ai vu pour l'instant :
    * Dans alloue_matrice, tu n'alloues pas de place pour ta matrice, tu le fais uniquement pour les coefficients. Ton programme doit certainement faire une segfault. dès la ligne m->ligne = ligne, ce n'est plus licite (ce qui ne veut pas dire pour autant que ça plante immédiatement).
    * Ton champ coefficient est un pointeur sur pointeur sur doubles, ce qui veut dire que tu as deux solutions pour créer dedans un tableau à deux dimensions :
    * * soit tu alloue n * m doubles et tu doit te taper de l'arithmétique pour retrouver les valeurs dans ton tableau. C'est la solution la plus simple à mon avis.
    * * soit tu alloue ligne fois la place pour une colonne (ce que tu as fait) mais à ce moment là, il faut voir le champ coefficient comme un tableau à une dimension contenant des pointeurs sur double et il faut allouer la mémoire pour ce tableau.

    c'est plus clair avec un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // On réserve la place pour stocker un pointeur sur chaque ligne du tableau
    coefficient = malloc(colonne * sizeof(double *));
    for (i = 0; i < colonne; i++) {
        // On alloue la place pour chaque ligne
        coefficient[i] = malloc(ligne * sizeof(double));
    }
    dans le premier on alloue de la place pour des double * et dans le deuxième pour des doubles.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    ok merci pour cette riche réponse
    nb:je n'ai pas bien assimiler la notion des tableaux de pointeur .
    j'étais entraine d'écrire n'importe quoi je m'excuse
    bon si j'ai compris ce que vous avez dit :
    je dois premièrement allouer la mémoire pour un tableau de *double (c'est le nbre de ligne dans la matrice ) et ensuite pour chaque case j'alloue la mémoire pour un tableau de double (c'est le nbre de colonne ).
    si ce que j'ai dit est correcte ,vous devez inverser les collone et les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    coefficient = malloc(ligne * sizeof(double *));
    for (i = 0; i < colonne; i++) {
        // On alloue la place pour chaque ligne
        coefficient[i] = malloc(colonne  * sizeof(double));
    }

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    coefficient = malloc(ligne * sizeof(double *));
    for (i = 0; i < ligne; i++) {
        // On alloue la place pour chaque ligne
        coefficient[i] = malloc(colonne  * sizeof(double));
    }

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    oui vous avez raison !
    diogene ->est ce que le code est corrécte ?
    please répond moi je doute de ça

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Si tu veux allouer un tableau 2D (via un tableau de pointeurs), le code est correct excepté pour les tests d'échec d'allocation qui manquent.

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    ok
    bon ,lorsque je veux lire un coefficient(avec une boucle ) ,j'écris **((coefficient+i)+j) n'est ce pas ?
    i=ligne.
    j=colonne .

    merci à l'avance

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    non...j'ai une structure:
    **((m->coefficient+i)+j) !

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Si m est un pointeur sur la structure, tu fais très simplement


  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    mais si je veux travailler avec des pointeur ,qu'est ce que j'écris ?
    je vous remercie énormément pour vos réponses .

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Si tu ne veux que les opérateurs "de base" : * . et +, c'est plus compliqué.

    coefficient[i] => *(coefficient+i)
    Alors
    coefficient[i][j] => *(coefficient[i]+j)~ *(*(coefficient+i)+j)

    Comme m-> x => (*m).x

    Au total m->coefficient[i][j] => *(*((*m).coefficient+i)+j)

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut

    donc :*(*(m->coefficeint+i)+j)
    maitenant que les choses sont claires je peut récrire mes fonctions
    thank

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

Discussions similaires

  1. pointeur matrice bulle
    Par futur-injen dans le forum C
    Réponses: 9
    Dernier message: 04/12/2008, 13h52
  2. structure, matrice et pointeurs
    Par Margatthieu dans le forum C
    Réponses: 15
    Dernier message: 13/01/2008, 23h17
  3. Pointeur sur le membre d'une matrice
    Par Linu6 dans le forum C
    Réponses: 7
    Dernier message: 13/01/2008, 20h40
  4. Pointeurs de matrices ??
    Par Invité dans le forum C
    Réponses: 17
    Dernier message: 04/04/2006, 21h42
  5. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03

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