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 :

Soucis tableau dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Par défaut Soucis tableau dynamique
    Bonjour a tous,
    voila mon soucis et que j'ai besoin de créer un tableau dynamique à double dimension.

    ensuite j'utilise une fonction pour allouer l'espace mémoire au tableau :

    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
    void partition (int x, int y, int ** tab)
    {
        int i,j;
        int c=combinaisons(x,y);
        tab=(int**)malloc(sizeof(int*)*c);
        for (i=0;i<c;i++)
        {
            tab[i]=(int*)malloc(sizeof(int)*x);
            for(j=0;j<x;j++)
            {
                tab[i][j]=1;
            }
            printf("\n ligne %d ", i);
        }
    }
    tous ça marche parfaitement(même si j'ai pas encore mis les teste ==NULL après chaque malloc) le soucis vient ensuite quand j'appelle la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    partition (x,y,tab);
       if (tab==NULL){printf("NULL");}
    le soucis c'est que il rentre bien dans le if, comme si je n'avais pas allouer d'espace mémoire au tableau.


    comment résoudre le problème?
    (je croyais qu'il suffisait de passer le nom du tableau ou pointeur dans une fonction pour que celui ci soit modifié (et nom pas comme un entier par exemple ou on doit passer son adresse en paramètre))

    merci d'avance

    Yann

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une possibilité ici: Réduire le nombre d'allocations.
    http://www.developpez.net/forums/m1803870-7/
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Par défaut
    je pense avoir compris ce que tu fais(dis moi si je me trompe^^) :
    tu créés d'un coté n*m cases, de l'autre une table n pointeur puis tu fais le liens entre chaque pointeurs et m cases.

    Par contre , je comprends pas comment fonctionne(du à mes connaissances en c certainement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ppValeurs[i] = pValeurs + (i*taille2);
    je vais tester (effectivement pour le coup je réduit le nombre d'allocations), mais je ne vois pas en quoi cela va résoudre mon soucis, et si ça le résout, pourquoi?

    EDIT: Oui je m'étais en effet mal exprimé, mais j'avais bien compris le fonctionnement des passages par copie. mais dans ce cas là, pourquoi ma solution ne marche telle pas? comme je passe l'adresse de mon tableau,si celui si est modifié dans la fonction, il devrait l'être en dehors

    EDIT2: Après quelques secondes, je pense avoir trouvé pourquoi effectivement le tableau n'est pas modifié: à l'appelle de la fonction tab=NULL, donc pas d'adresse de référence, donc je passe NULL en copie, et bien entendu à la sortie de la fonction tab vaut NULL, c'est bien cela?

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Darksnakes Voir le message
    Oui je m'étais en effet mal exprimé, mais j'avais bien compris le fonctionnement des passages par copie. mais dans ce cas là, pourquoi ma solution ne marche telle pas? comme je passe l'adresse de mon tableau,si celui si est modifié dans la fonction, il devrait l'être en dehors
    Quand on passe un tableau à une fonction, on peut modifier le contenu du tableau, mais on ne modifie pas la structure du tableau.

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ton problème c'est que quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab=(int**)malloc(sizeof(int*)*c);
    Tu ne modifie rien dans la fonction appelante. Puisque dans la fonction appelante tu as un int **, dont la valeur doit être modifiée par ton fonction d'allocation, il faut passer l'adresse de ce int ** à la fonction d'allocation. Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void
    partition (int x, int y, int ***tab)
    {
        ...
        *tab = malloc(c * sizeof(int*));
        ...
    }
    Et tu appelles cette fonction comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int **mytab;
    partition(x, y, &mytab);
    Un détail en passant : caster explicitement la valeur de retour d'une fonction void * (comme malloc), c'est mal. Ca masque le warning que tu aurais si tu oubliait de préciser le prototype de la fonction (en includant stdlib.h dans le cas de malloc).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Par défaut
    merci pour tous les éclairsissement^^

    Un détail en passant : caster explicitement la valeur de retour d'une fonction void * (comme malloc), c'est mal. Ca masque le warning que tu aurais si tu oubliait de préciser le prototype de la fonction (en includant stdlib.h dans le cas de malloc).
    je savais pas que le cast faisait taire le compilateur, mais dans ce cas disont que je cast le malloc, et que je ne mette pas stdlib.h? il me dira de toutes façon qu'il connais pas malloc non?

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Darksnakes Voir le message
    (je croyais qu'il suffisait de passer le nom du tableau ou pointeur dans une fonction pour que celui ci soit modifié (et nom pas comme un entier par exemple ou on doit passer son adresse en paramètre))
    Non, en c, le passage de paramètre se fait par copie. (Et quand on dit qu'on passe par adresse, c'est l'adresse qu'on passe par copie).

    On peut écrire le code un peu différemment pour comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef int ** ppint;
    partition(int x, int y, ppint tab);
    /* tab passé par copie : n'est pas modifié. */
    Une solution pour ne pas se tracasser avec ce problème de passage de paramètres est de changer le prototype en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int ** partition(int x, int y)
    {
        int ** tab;
        /* allocations ...*/
     
        return tab;
    }
    Sinon, quand on passe un tableau à une fonction, on passe en fait l'adresse du premier élément.... Et cette adresse ne peut être changée.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. [AC-2010] Souci Tableau Dynamique => Valeur inexistante
    Par misterlagaffe dans le forum IHM
    Réponses: 1
    Dernier message: 25/02/2014, 20h26
  3. Réponses: 3
    Dernier message: 06/01/2010, 14h11
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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