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 :

type def struct et quelques fonctions


Sujet :

C

  1. #1
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut type def struct et quelques fonctions
    Bonjour,

    Soit la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct matrice *matrice ;
    struct matrice {
        int l ;
        int c ;
        double *m;
    }
    l étant le nbre de ligne et c le nbre de colonnes de la matrice. m est un tableau qui contient les coefficient de celle-ci.

    mamatrice est donc un pointeur sur une matrice et non une matrice ?

    Si c'est un pointeur alors une fonction qui créerai une matrice pourrait se coder ainsi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    matrice creeMatrice(int  l ,  int c ){
     
        matrice mamatrice;
        mamatrice = malloc(sizeof(matrice));
        mamatrice->m = malloc( sizeof(int) * l * c);
        return mamatrice;
     
    }
    Donc cette fonction renverrai un pointeur de matrice.

    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    Oui, tu as compris. C'est tout-à-fait cela, à ceci près qu'il faudra utiliser sizeof(double) plutôt que sizeof(int). Et bien sûr, dans l'absolu, il faudrait aussi vérifier que les deux malloc() n'ont pas échoué.

    On en profite pour signaler que masquer un pointeur dans un typedef est une très mauvaise pratique, même si elle est répandue dans les écoles et dans certains frameworks objet.

  3. #3
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Merci à toi pour cette réponse ultra rapide

    Si je crée une fonction qui supprime une matrice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void detruitMatrice ( matrice m){
        free(m->m);
        free(m);
    }
    je suppose que le premier free est utile ? Car sinon seul le pointeur m est supprimé mais pas le tableau correspondant ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par guitz Voir le message
    Si je crée une fonction qui supprime une matrice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void detruitMatrice ( matrice m){
        free(m->m);
        free(m);
    }
    je suppose que le premier free est utile ? Car sinon seul le pointeur m est supprimé mais pas le tableau correspondant ?
    Absolument. Et c'est pour cela aussi qu'il est important de le faire dans cet ordre.

    Si on veut être puriste, on met quand même « m->m » à NULL pour être sûr que le pointeur ne référence plus rien. A priori, ça ne sert à rien puisque le pointeur lui-même va être désalloué, mais c'est salvateur lorsque l'on débugue de gros projets et c'est pratique aussi lorsqu'on libère une telle structure en oubliant qu'elle est référencée ailleurs. Ça limite les dégâts au moins pour quelques temps.

  5. #5
    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
    Et en plus, masquer les pointeurs empêche que ce genre de faute ne saute aux yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        matrice mamatrice;
        mamatrice = malloc(sizeof(matrice));
    qui devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       mamatrice = malloc(sizeof(struct matrice));
    // ou
       mamatrice = malloc(sizeof *mamatrice);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par diogene Voir le message
    Et en plus, masquer les pointeurs empêche que ce genre de faute ne saute aux yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        matrice mamatrice;
        mamatrice = malloc(sizeof(matrice));
    Oh, misère ! Je sors me cacher immédiatement.

  7. #7
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Merci Obsidian et Dioxidedoxigene.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/02/2010, 23h59
  2. Fonctionnement de map et de quelques fonctions
    Par benja507 dans le forum Scheme
    Réponses: 1
    Dernier message: 17/08/2007, 14h10
  3. [.NET2.0][C#]Passage type de classe dans une fonction
    Par SLE dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/06/2006, 15h48
  4. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54
  5. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 22h50

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