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 :

allocation **pointeur NULL via fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut allocation **pointeur NULL via fonction
    Bonjour à tous,

    Pour mon projet, je dois récupérer des valeurs X et Y dans un fichier. A savoir, X et Y sont tout deux des tableaux (de double) situés sur une même ligne (par exemple x,x,x,x;y,y\n).
    Aussi, la première ligne de ce fichier nous indique combien de ligne sont présentes, combien nous avons de valeurs x par ligne et combien de valeurs y par ligne.

    Le fichier peut faire plusieurs milliers de lignes, et, je souhaiterais récupérer tout ça dans des tableaux (genre X[i][j] et Y[i][w]), via une fonction.
    Cependant, mes tableaux sont initialisés à NULL dans la fonction principale, mais alloués dans une autre fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    double **Xtab = NULL;
    double **Ytab = NULL;
     
    get_file_vals(&Xtab, &Ytab);  // les '&' sont là car la fonction attends un pointeur vers ces tableaux ; voir la fonction plus bas
    J'ai réussi à trouver une partie de la solution ici : https://www.developpez.net/forums/d1...null-fonction/
    mais là où je galère, c'est pour les malloc / calloc :

    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
     
     
    void get_file_vals(double ***Xtab, double ***Ytab)
    {
     
      // [...]
      // nb_lignes = nombre de lignes à analyser
      // x_nb = nombre de valeurs du vecteur X sur une ligne
      // y_nb = nombre de valeurs du vecteur Y sur une ligne
     
      *Xtab = calloc(nb_lignes, sizeof(double*));
      *Ytab = calloc(nb_lignes, sizeof(double*));
     
      for (int i = 0; i < x_nb; i++)
      {
         Xtab[i] = calloc(x_nb, sizeof(double));
         Ytab[i] = calloc(y_nb, sizeof(double));
      }
     
      // [...]
    Pour info, je n'ai volontairement pas mis les tests d'allocation pour faciliter la lecture sur le forum.

    Ce code me renvoie une erreur de segmentation, mais je suis incapable de savoir d'où vient l'erreur ; je ne vois pas trop comment manipuler une allocation dynamique sur un pointeur de tableau multiple...
    Évidement, j'ai essayé plusieurs syntaxes au petit bonheur la chance, mais rien n'y fait.

    Quelqu'un saurait m’orienter ?


    Merci d'avance !

  2. #2
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir effectivement vous avez une erreur cela est dû à la mauvaise utilisation de la fonction calloc. Pour pouvoir allouer dynamiquement vos tableaux, il faut faire ceci.
    Code C : 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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( void ){
     
        size_t i = 0;
        int **p = NULL;
     
        const size_t NB_LIGNE = 10;
        const size_t NB_COLON = 20;
     
        /*
         *  Allocation mémoire des lignes
         */
        if( NULL ==
           (p = calloc(NB_LIGNE, sizeof(int*)) ) ){
            /*
             *  faire quelque choses en cas
             *  d'erreurs
             */
            return  EXIT_FAILURE;
        }
     
        /*
         *  Allocation mémoire des colonne
         */
        for( i = 0; i < NB_LIGNE; i++ ){
            p[i] = calloc( NB_COLON, sizeof(int));
            if( NULL == p[i] )
                /*
                 *  faire quelque choses en cas
                 *  d'erreurs
                 */
                return EXIT_FAILURE;
        }
     
     
        /*
         *  Désalocation de la mémoire.
         */
        for( i = 0; i < NB_LIGNE; i++ )
            free( p[i] );
        free( p );
     
        p = NULL;
     
        return EXIT_SUCCESS;
    }

    La première allocation dynamique est faite pour réserver l’espace nécessaire pour les lignes et la seconde allocation dynamique réserve pour chaque entier p[i] l’espace nécessaire pour stocker les données de la colonne.
    à bientôt

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Tu as ici 2 pointeurs sur des tableaux de tableaux, ce sont (*Xtab) et (*Ytab) qui sont les tableaux de pointeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         (*Xtab)[i] = calloc(x_nb, sizeof(double));
         (*Ytab)[i] = calloc(y_nb, sizeof(double));

  4. #4
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut
    Merci pour ces retours ;

    J'ai essayé la dernière méthode (*Xtab)[i] = calloc(... pour les colonnes, mais le problème persiste :/ ""Erreur de segmentation"".

    Quant à la remarque de sambia39, je conçois que ton code soit monté de manière plus "intelligente" que moi, mais je ne comprends pas vraiment pourquoi ma manière de faire n'est pas la bonne. de plus, je n'ai jamais utilisé "size_t" ; mais je vais me pencher dessus du coup. Aussi, étant donné que le fichier doit être traité en une fois (je n'ai pas envie d'avoir à l'ouvrir plus d'une fois), je dois donc "absolument" (à moins que quelqu'un ait une autre solution à me proposer), allouer mes tableaux via une fonction ; je ne tiens pas à mettre tout ce bloc "secondaire" dans ma fonction principale...

    Merci encore !

    EDIT : pour la suite d'ailleurs, étant donné que je récupère ensuite des valeurs avec ces tableaux, l'appel doit se faire ainsi : &(*Xtab)[i][j] où je me trompe ?

    EDIT 2 : ok Résolu, c'est bien sur l'affectation que j'avais un bug ; je n'avais pas changé la version initiale car elle marchais, mais avec l'arrivée d'une "*" en plus.....

    Merci à vous !

  5. #5
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    +1 Super si tu as réussi sinon : pour faire simple size_test un entier non signé qui est assez grand pour contenir en byte la taille d’un objet.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2017, 13h00
  2. Réponses: 8
    Dernier message: 16/12/2015, 17h08
  3. Retour de fonction pour allocation pointeur
    Par Tenshock dans le forum C
    Réponses: 8
    Dernier message: 26/12/2014, 21h44
  4. passage pointeur NULL dans une fonction
    Par reptils dans le forum C
    Réponses: 4
    Dernier message: 11/05/2006, 23h12
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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