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 :

pointeur de tableau pour fonction void


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 22
    Par défaut pointeur de tableau pour fonction void
    Bonjour,

    Ma question est la suivante : si je veux passer un tableau en paramètre d'une fonction et modifier ce tableau dans cette fonction, dois je utiliser un pointeur sur ce tableau ? ou je peux directement modifier ce tableau ?
    Est ce que le fonctionnement pour les tableaux de caractères est le même ?

    Voici mon code d'exemple qui donne une segmentation fault...

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int *** allocationdynamique(int nbniveau, int nbligne, int nbcolonne)
    {
        int *** Matrice;
        int i, j;
        Matrice = (int ***) malloc (sizeof(*Matrice) * nbniveau);
        for (i = 0; i < nbniveau; ++i)
        {
            Matrice[i] = (int **) malloc (sizeof(**Matrice) * nbligne);
            for (j = 0; j < nbligne; ++j)
            {
                Matrice[i][j] = (int *) malloc (sizeof(***Matrice) * nbcolonne);
            } 
        }
        return Matrice;
    }
     
     
     
    void recuperationmatricegroupesgeneralisants(int** matricegroupegeneralisantA)
    {
        matricegroupegeneralisantA[0][1]=1;
    }
     
    void recuperationinfoFich(int*** matricegroupegeneralisantA)
    {
       matricegroupegeneralisantA=allocationdynamique(3, 3, 7);
        recuperationmatricegroupesgeneralisants(matricegroupegeneralisantA[1]);
    }
     
     
     
    void main(int args, char **argv)
    {
     
        int*** matricegroupegeneralisantA;
     
        recuperationinfoFich(matricegroupegeneralisantA);
    }
    Merci !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Par défaut
    Quand tu passes un tableau en paramètre d'une fonction, il est converti en une adresse sur son premier élément.

    FAQ => http://c.developpez.com/faq/?page=ta...leau_parametre

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Utilises un débogueur ou des printf pour savoir à quelle ligne est lancé le SEGFAULT.

  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
    Je ne vois pas pourquoi ce code, tel qu'il est, provoque une erreur (si les allocations ont réussi évidemment).
    Par contre, le code est mal foutu et ça se voit ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void recuperationinfoFich(int*** matricegroupegeneralisantA)
    {
       matricegroupegeneralisantA=allocationdynamique(3, 3, 7);
    ....
    matricegroupegeneralisantA est en paramètre. Cela signfie qu'il transmet une information à la fonction. Mais à la ligne suivante, cette information est écrasée sans avoir été utilisée. Ce code est donc fonctionnellement identique à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void recuperationinfoFich(void)
    {
       int*** matricegroupegeneralisantA=allocationdynamique(3, 3, 7);
    ....
    Anomalie également ici dans main()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        int*** matricegroupegeneralisantA;
        recuperationinfoFich(matricegroupegeneralisantA);
    on transmet à recuperationinfoFich() la valeur de matricegroupegeneralisantA qui n'a jamais été initialisé et qui restera initialisé.

    Je suppose que tu voulais faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ....
    void recuperationinfoFich(int**** matricegroupegeneralisantA)
    {
       *matricegroupegeneralisantA=allocationdynamique(3, 3, 7);
        recuperationmatricegroupesgeneralisants((*matricegroupegeneralisantA)[1]);
    }
    int main(int args, char **argv)
    {
        int*** matricegroupegeneralisantA;
        recuperationinfoFich(&matricegroupegeneralisantA);
    // ici matricegroupegeneralisantA permet d'accéder au tableau créé
        return 0;
    }

  5. #5
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 22
    Par défaut
    La fonction qui servait pour les allocations était mal définie !

    Merci pour vos avis !

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

Discussions similaires

  1. [POO] Récuperer tableau php pour fonction js
    Par clara1 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/05/2008, 14h59
  2. pointeur tableau et fonction
    Par tenderstoune dans le forum C
    Réponses: 15
    Dernier message: 02/11/2007, 13h45
  3. Passage de tableau à une fonction par pointeur
    Par progfou dans le forum C++
    Réponses: 15
    Dernier message: 23/02/2007, 11h45
  4. utiliser une fonction VOID pour des blocs relationnels ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/09/2006, 16h16
  5. Réponses: 8
    Dernier message: 10/03/2006, 17h28

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