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 :

Utilisation de tableau de pointeurs de taille variable


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Utilisation de tableau de pointeurs de taille variable
    Bonjour à tous !

    J'ai un petit soucis sur l'utilisation de tableau entre 2 fichiers (je suppose que le problème vient de là... (ou alors j'ai fait une grosse bourde que le compilo voit pas !) :

    Je souhaite créer une fonction qui alloue un tableau 2D et retourne un pointeur vers ce tableau (le tableau n'a pas de taille fixe et je passe les dimensions du tableau dans les arguments de ma fonction.) Cette fonctions peut être appelée depuis différents fichier. J'ai crées 2 fonctions mais aucune des 2 ne marche, dès que j’exécute ca crash !

    Le main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdlib.h>
    #include "tab.h"
     
    int main(void)
    {
    int height = 10;
    int width = 10;
    int **montableau1 = NULL;
    int **montableau2 = NULL;
    montableau1 = InitTabRet(height, width);
    InitTab(montableau2, height, width);
    return 0;
    }
    Le fichier ou se trouvent les fonctions (tab.c) :
    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
     
    #include <malloc.h>
     
    int** InitTabRet(int height, int width)
    {
    int** newtab = malloc(height*width*sizeof(int));
    int i,j;
    for(i=0;i<height;i++)
    	{
    	for(j=0;j<width;j++)
    	newtab[height][width] = 0;
    	}
    return newtab;
    }
     
    void InitTab(int **ptab, int height, int width)
    {
    int **newtab = malloc(height*width*sizeof(int));
    int i,j;
    for(i=0;i<height;i++)
    	{
    	for(j=0;j<width;j++)
    	newtab[height][width] = 0;
    	}
    ptab = newtab;
    }
    le tab.h prototypant les 2 fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifndef TAB_H_INCLUDED
    #define TAB_H_INCLUDED
    int** InitTabRet(int height, int width);
    void InitTab(int **ptab, int height, int width);
    #endif // TAB_H_INCLUDED
    J'ai cru comprendre que les variables étaient locales au fichier, j'ai essayé de mettre un "extern" pour que la variable soit accessible de partout. Comme en fait il y aura plusieurs tableaux générés par la fonction j'ai du mal a penser le concept de rentre une variable qui sera dynamique et multiple (du coup pas unique...) accessible... Mais de toute façon ca marche pas !

    Merci pour votre aide !

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    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 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Avec les malloc tu dois toujours avoir le format suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type * = malloc(nbElement*sizeof(Type) )
    Pour un tableau à deux dimensions, tu as plusieurs choix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int** newtab = malloc(height*sizeof(int *));
    for(int i=0; i != height; ++i) newTab[i] = malloc(widht*sizeof(int) );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int** newtab = malloc(height*sizeof(int *));
    int * donnees = malloc(widht*height*sizeof(int));
    for(int i=0; i != height; ++i, donnees += widht) newTab[i] = donnees;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int * donnees = malloc(widht*height*sizeof(int));
    donnees[i+j*widht];//accéder à un élément.

    EDIT : ensuite les paramètres sont envoyés par copies dans les fonctions (sauf tableaux [] ) donc si tu veux modifier une variable dans ta fonction et l'avoir à jour une fois sortie de ta fonction, il faut utiliser des pointeurs.
    Si ta variables est un int ** il faut alors mettre un int *** en paramètre de ta fonction.
    Ainsi : *ptab = newtab;

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    OK, j'ai compris le problème !
    En fait je créé un tableau 1D de taille height+width et je "délaisse" la 2e dimension...
    Me semble que dans ton 2e exemple il faut enlever "widht*" à la 2e ligne ?
    Par contre je peux accéder au tableau sous la forme tab[x][y] pour les 2 premiers exemples ?
    Ou obligatoirement tab[x*ligne+y] (ou tab[x+y*colonne]) ?
    Sinon, autant faire un tableau 1D et de le réindexer ...
    Et la je me rend compte que je vais devoir me souvenir des tailles de mes tableaux pour y accéder...

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    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 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Citation Envoyé par TheChyld Voir le message
    Me semble que dans ton 2e exemple il faut enlever "widht*" à la 2e ligne ?
    Non, le 2ème exemple consiste à allouer un tableau de pointeur ainsi qu'un tableau d'int.
    A chaque élément du tableau de pointeur, on lui attribut l'adresse du premier élément de la ligne.
    Ainsi tu sur un tableau de 9x9 tu pourra accéder à un élément comme ceci : tab[2][2] mais tab[1][11] marchera aussi.

    Citation Envoyé par TheChyld Voir le message
    Par contre je peux accéder au tableau sous la forme tab[x][y] pour les 2 premiers exemples ?
    Oui.

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci ca marche !
    J'ai opté pour la première solution comme j'ai du mal à comprendre la seconde (meme si les 2 semblent s'utiliser de la même façon...)
    Du coup j'ai éditer le titre, pas de rapport avec le fait que les variables soient dans différents fichiers...

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    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 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Dans la deuxième solution, toutes tes cases seront consécutives dans la mémoire, ainsi tab[0][9] est à côté de tab[1][0].

    Alors que dans la première solution, seule les cases d'une même ligne sont consécutives, pour les autres ont ne sais pas, ainsi tab[0][9] n'est pas forcément à côté de tab[1][0].

    EDIT : tout n'est pas très bien passé sur l'image, mais je pense que ça reste compréhensible.
    Images attachées Images attachées  

Discussions similaires

  1. Tableau à deux dimensions de taille variable
    Par rolls dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 10/10/2013, 10h03
  2. [PDO] PDO requêtes paramétrées avec tableau de paramètres de taille variable
    Par disciplined dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/08/2012, 08h41
  3. utiliser un tableau de pointeur
    Par pepsister dans le forum GTK+ avec C & C++
    Réponses: 30
    Dernier message: 27/04/2007, 23h17
  4. Réponses: 4
    Dernier message: 28/11/2006, 09h50
  5. Comment obtenir un tableau à taille variable ?
    Par marsupilami34 dans le forum Langage
    Réponses: 6
    Dernier message: 27/06/2005, 15h03

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