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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 728
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    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 très actif Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 728
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    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 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
    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);

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    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 très actif Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 728
    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