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 :

structure, matrice et pointeurs


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut structure, matrice et pointeurs
    Bonjour
    je n'arrive pas à me sortir d'un exo de C
    Voici le sujet et ce que j'ai essayé de faire:
    La finalité est de faire des multiplications de matrice en manipulant des pointeurs.

    Je dois utiliser la structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct MatriceStruct{
    	float **valeurs;
    	int nbreLignes;
    	int nbreColonnes;};
     
    typedef struct MaticeStruct Matrice;
    typedef Matrice* MatriceP;
    Je dois également créer (entre autre) 2 fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void intialiserLigne (float valeurInitiale, int NumLigne, MatriceP matriceP)
    MatriceP creer (float valeurInitiale, int nbreLignes, int nbreColonnes)
    Je n'arrive pas à commencer car je ne vois pas comment allouer de la mémoire pour une variable de type MatriceStruct ...
    (c'est le float **valeurs qui me perturbe)

    J'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matrice matrice = (Matrice*) calloc( nbreColonnes, sizeof(Matrice) );
    mais c'est faux ...

    si vous aviez un ou 2 conseils pour que je puisse démarrer ...

    Merci d'avance
    Matthieu

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    je ne vois pas ce que signifie le * dans:
    typedef Matrice* MatriceP;

    .. ? ..

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    tu définis juste un nouveau type MatriceP qui est un pointeur sur Matrice.

    et tu ne vois pas comme une contradiction ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Matrice matrice = (Matrice*) calloc...
    ??

    alloc retourne un void *.
    Tu le castes en Matrice *.

    ...

    Et tu l'affectes à une variable Matrice ...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Une trame pour la création d'une matrice :

    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
    MatriceP creer (float valeurInitiale, int nbreLignes, int nbreColonnes)
    {
      MatriceP matrice;
    // - allouer de la place pour la Matrice (malloc) et mettre l'adresse obtenue dans matrice
    // - Tester si la place a été allouée (matrice != NULL)
    // - Si oui :
    //    - Ranger nbreLignes dans matrice->nbreLignes et nbreColonnes dans matrice->nbreColonnes
    //    - Créer un tableau (par allocation dynamique) qui contiendra l'adresse des nbreLignes lignes  et mettre son adresse dans matrice->valeurs
    //    - Si l'allocation a échoué : détruire la Matrice déjà allouée (free) et mettre matrice à NULL
    //      - Sinon, pour chaque ligne :
    //          - Allouer nbreColonnes éléments. Mettre l'adresse obtenue dans le tableau matrice->valeurs
    //          - si les éléments sont  alloués, les initialiser avec valeurInitiale
    //          - En cas d'échec d'une des demandes d'allocation, détruire les lignes déjà allouée, détruire le tableau matrice->valeurs, détruire la Matrice et mettre matrice à NULL
    //   - retourner matrice
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    merci Diogene, je vais suivre ta trame

    Pourrais tu m'expliquer le * dans la ligne:
    typedef Matrice* MatriceP;

    ?

  6. #6
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Si tu as un type de donnée, disons int, mais ça marche pour n'importe quel type de donnée, alors int * est le type adresse de int
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef Matrice* MatriceP;
    typedef : définition d'un nouveau type de donnée nommé MatriceP. Ce type MatriceP est équivalent au type Matrice* qui signifie adresse de (à cause de *) d'un objet de type Matrice
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    ok, c plus clair.

    Juste pour bien comprendre, pourquoi je ne peux pas écrire &Matrice à la place de Matrice* ?

    (pour moi, le & veut dire "adresse de")
    (comme &ma_variable correspond à l'adresse de ma variable ...)

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Matrice * est un type de donnée : "Adresse d'un objet de type Matrice"
    &matrice permet d'obtenir l'adresse de l'objet identifié par matrice
    &matrice est une valeur du type Matrice*
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    merci Diogene, sympa les conseils

    Si tu as encore un peu de temps à m'accorder, ce serait top
    je pete les plombs !
    j'ai hate de voir le prof pour revoir tout ça ...

    j'arrive pas à poursuivre le 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
    MatriceP creer (float valeurInitiale, int nbreLignes, int nbreColonnes)
    {
    	MatriceP matrice;
    	float *tableau_lignes;
     
    	matrice = malloc (nbreLignes * nbreColonnes * sizeof(float));
    	matrice->nbreLignes = nbreLignes;
    	matrice->nbreColonnes = nbreColonnes;
     
    	tableau_lignes = malloc (nbreLignes * sizeof(float));
     
     
    	Cette ligne est fausse ... pourtant je met bien une adresse dans un pointeur, non ?
    	//matrice->valeurs = tableau_lignes;
     
    et aprés, je vois pas comment j'avance ...
    (je met de coté les verification d'allocation pour l'instant ..)	
     
    	return matrice;
    }

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MatriceP creer (float valeurInitiale, int nbreLignes, int nbreColonnes)
    {
    	MatriceP matrice;
    	float *tableau_lignes;
     
    	matrice = malloc (nbreLignes * nbreColonnes * sizeof(float));
    Non, c'est plus évident que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MatriceP creer (float valeurInitiale, int nbreLignes, int nbreColonnes)
    {
        MatriceP matrice ;
        matrice = malloc ( sizeof *matrice); // ou sizeof(Matrice)
        if(matrice != NULL)
        {
     ....
         }
         return matrice
    }
    maintenant, matrice pointe vers un bloc permettant de stocker
    - un float ** (pour valeurs)
    - un int (pour nbreLignes)
    - un int (pour nbreColonnes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	matrice->nbreLignes = nbreLignes;
    	matrice->nbreColonnes = nbreColonnes;	
    	tableau_lignes = malloc (nbreLignes * sizeof(float));
    Non, ce tableau doit contenir l'adresse des tableaux "colonnes"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    matrice->tableau_lignes = malloc (nbreLignes * sizeof(float *));
    if(matrice->tableau_lignes != NULL)
    {
    ...
    }
    else 
    {
    ...
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Symboliquement, voila ce qu'on est en train de construire en mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    matrice  --->{
                   valeurs ----> tableau d'adresses
                                     |  --|-------->   tableau de float (éléments de la ligne 0) 
                                     |  --|-------->   tableau de float (éléments de la ligne 1)
                                     |  --|-------->   tableau de float (éléments de la ligne 2)
                                     |....|
                    ....
                }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    merci Diogene, ça avance ...
    je suis plus trés loin du but

    la compilation fonctionne mais lorsque j'execute, j'ai un super message d'erreur qui m'aide pas beaucoup

    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
    MatriceP creer (float valeurInitiale, int nbreLignes, int nbreColonnes)
    {
    	MatriceP matrice;
    	float *tableau_lignes;
    	int i, j;
     
    	matrice->nbreLignes = nbreLignes;
    	matrice->nbreColonnes = nbreColonnes;
    	matrice->valeurs = malloc (nbreLignes * sizeof(float *));
     
    	for (i = 0; i < nbreLignes; i++)
    		matrice->valeurs[i] = malloc (nbreColonnes * sizeof (float));
     
    	for (i = 0; i < nbreLignes; i++)
    	{
    		for (j = 0; j < nbreColonnes; j++)
    			matrice->valeurs[i][j] = valeurInitiale;
    	}
     
    	return matrice;
    }
     
    void affiche (MatriceP matriceP)
    {
    	int i, j;
    	for (i = 0; i < matriceP->nbreLignes; i++)
    	{
    		for (j = 0; j < matriceP->nbreColonnes; j++)
    			printf ("%f", matriceP->valeurs[i][j]);
    	}
    }
     
    int main (void)
    {
    	float val_initiale = 2;
    	int nblines = 3;
    	int nbcol = 3;
     
    	affiche ( creer (val_initiale, nblines, nbcol) );
    }
    Je sais que j'abuse mais t'aurais pas une idée ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    c'est la ligne
    matrice->nbreLignes = nbreLignes;
    qui provoque l'erreur ...

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Margatthieu Voir le message
    la compilation fonctionne
    Non, la compilation ne fonctionne pas. Avec un compilateur bien réglé, ce 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
    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
    51
    52
    53
    54
     
    #include <stdlib.h>
    #include <stdio.h>
     
    struct MatriceStruct
    {
       float **valeurs;
       int nbreLignes;
       int nbreColonnes;
    };
     
    typedef struct MatriceStruct Matrice;
    typedef Matrice *MatriceP;
     
    MatriceP creer (float valeurInitiale, int nbreLignes, int nbreColonnes)
    {
       MatriceP matrice;
       float *tableau_lignes;
       int i, j;
     
       matrice->nbreLignes = nbreLignes;
       matrice->nbreColonnes = nbreColonnes;
       matrice->valeurs = malloc (nbreLignes * sizeof (float *));
     
       for (i = 0; i < nbreLignes; i++)
          matrice->valeurs[i] = malloc (nbreColonnes * sizeof (float));
     
       for (i = 0; i < nbreLignes; i++)
       {
          for (j = 0; j < nbreColonnes; j++)
             matrice->valeurs[i][j] = valeurInitiale;
       }
     
       return matrice;
    }
     
    void affiche (MatriceP matriceP)
    {
       int i, j;
       for (i = 0; i < matriceP->nbreLignes; i++)
       {
          for (j = 0; j < matriceP->nbreColonnes; j++)
             printf ("%f", matriceP->valeurs[i][j]);
       }
    }
     
    int main (void)
    {
       float val_initiale = 2;
       int nblines = 3;
       int nbcol = 3;
     
       affiche (creer (val_initiale, nblines, nbcol));
    }
    donne
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `creer':
    main.c:17: warning: unused variable `tableau_lignes'
    main.c:16: warning: 'matrice' might be used uninitialized in this function
    main.c: In function `main':
    main.c:53: warning: control reaches end of non-void function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 3 warnings
    Ce qui indique clairement que 'matrice' n'a pas été initialisée et c'est vrai. L'usage de 'matrice' entraine donc un comportement indéfini (ce qui est un des bugs les plus graves). Par exemple :
    mais lorsque j'execute, j'ai un super message d'erreur qui m'aide pas beaucoup
    Il manque un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       MatriceP matrice = malloc (sizeof *matrice);
    Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       affiche (creer (val_initiale, nblines, nbcol));
    produit une fuite mémoire (impossible de libérer le bloc alloué). De plus si la valeur retournée est NULL, c'est le drame (comportement indéfini).

    Il faut une variable intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       MatriceP p = creer (val_initiale, nblines, nbcol);
       if (p != NULL)
       {
          affiche (p);
       }
    reste à travailler l'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    2.0000002.0000002.0000002.0000002.0000002.0000002.0000002.0000002.000000
    Press ENTER to continue.
    et la libération de la mémoire allouée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SYSALLOC Err: Not-matched list:
    SYSALLOC Bloc 003D2448 (12 bytes) malloc'ed at line 22 of 'main.c' not freed
    SYSALLOC Bloc 003D2460 (12 bytes) malloc'ed at line 27 of 'main.c' not freed
    SYSALLOC Bloc 003D2478 (12 bytes) malloc'ed at line 30 of 'main.c' not freed
    SYSALLOC Bloc 003D2490 (12 bytes) malloc'ed at line 30 of 'main.c' not freed
    SYSALLOC Bloc 003D24A8 (12 bytes) malloc'ed at line 30 of 'main.c' not freed
    SYSALLOC Released Memory
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    PARFAIT !

    Merci Emmanuel et Diogene pour vos conseils
    rapides, clairs, efficaces

    Je vais regarder de ce pas la configuration du compilateur !

    et poser qques questions à mon prof ...

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Margatthieu Voir le message
    et poser qques questions à mon prof ...
    Tu peux lire ça avant...

    http://emmanuel-delahaye.developpez.....htm#tabdyn_2d
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/01/2007, 16h40
  2. Structure, union et pointeur
    Par kikoo.plop dans le forum C
    Réponses: 10
    Dernier message: 18/12/2006, 19h21
  3. structure matrice en C
    Par pedro7 dans le forum C
    Réponses: 8
    Dernier message: 17/12/2006, 15h28
  4. structure, tableau et pointeur
    Par Phil' dans le forum GTK+ avec C & C++
    Réponses: 16
    Dernier message: 26/05/2006, 17h47
  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