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 :

[C] comment retourner un tab a 2 dim dans une fonction?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Par défaut [C] comment retourner un tab a 2 dim dans une fonction?
    Bonsoir,

    J'ai un petit probleme en C je voudrais retourné un tableau a 2 dimensions en apellant par exemple cette fonction:
    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
     
    void genMat (int n, int k){
    	int i, j, nbrli, m;
    	nbrli=(n/k);
    	int tabGenMat[nbrli][n];
     
    	for (i=0;i<nbrli;i++){
    		for (j=0;j<n;j++)
    		{
    			tabGenMat[i][j]=0;
    		}
    	}
     
    	for(i=0;i<nbrli;i++){
    		for(j=0;j<n;j++){
    			m=(j+1) +k*i;
    			if (m<=k*(i+1)){
    				tabGenMat[i][m-1]=1;
    			}
    		}
    	}
     
    	for (i=0;i<nbrli;i++){
    		for (j=0;j<n;j++){
    			printf ("%d ", tabGenMat[i][j]);
    		}
    		printf("\n");
    	}
     
    }
    Bien sur avec le main qui va avec, il n'y a pas de probleme..
    Mais je voudrais bien utiliser cette meme fonction dans une autre or dans mon cas ce que je fais c'est seulement afficher le tableau tabGenMat obtenu..

    Please aidez moi.. merci d'avance..;p

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    je voudrais retourné un tableau a 2 dimensions en apellant par exemple cette fonction:
    Le C n'a jamais été mon fort (et c'est lointain), mais tu dois utiliser des pointeurs ( pfiou ça fait froid dans le dos de parler de pointeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MaFonction(int **tabGenMat, int i, int j)
    {
      // tu joues avec tabGenMat ici
    }
    Dans le main, tu fais un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void)
    {
            int i,j;
            double F[i][j];
     
            MaFonction(F,i,j);
    }
    Bien sûr c'est à confirmer hein ... moi je peux pas t'en dire plus (et puis j'ai dépassé mon quota de C pour l'année )

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par binoo Voir le message
    Le C n'a jamais été mon fort<...>
    Bien sûr c'est à confirmer hein ... moi je peux pas t'en dire plus (et puis j'ai dépassé mon quota de C pour l'année )
    Ce code est malheureusement incorrect. Le type de double F[i][j]; n'est pas int **tabGenMat, ni même double **tabGenMat

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par memo67 Voir le message
    Bonsoir,

    J'ai un petit probleme en C je voudrais retourné un tableau a 2 dimensions en apellant par exemple cette fonction:
    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
     
    void genMat (int n, int k){
    	int i, j, nbrli, m;
    	nbrli=(n/k);
    	int tabGenMat[nbrli][n];
     
    	for (i=0;i<nbrli;i++){
    		for (j=0;j<n;j++)
    		{
    			tabGenMat[i][j]=0;
    		}
    	}
     
    	for(i=0;i<nbrli;i++){
    		for(j=0;j<n;j++){
    			m=(j+1) +k*i;
    			if (m<=k*(i+1)){
    				tabGenMat[i][m-1]=1;
    			}
    		}
    	}
     
    	for (i=0;i<nbrli;i++){
    		for (j=0;j<n;j++){
    			printf ("%d ", tabGenMat[i][j]);
    		}
    		printf("\n");
    	}
     
    }
    Bien sur avec le main qui va avec, il n'y a pas de probleme..
    Mais je voudrais bien utiliser cette meme fonction dans une autre or dans mon cas ce que je fais c'est seulement afficher le tableau tabGenMat obtenu..

    Please aidez moi.. merci d'avance..;p
    Il n'est pas possible de retourner l'adresse d'une variable locale. De plus, tu utilises la technique du VLA qui n'existe qu'en C99, et qui n'est pas implémentée corectement partout (avec gcc, cette possibilité est 'broken').

    Il faut utiliser l'allocation dynamique et retourner l'adresse du tableau de base (T**). Mais il faut aussi les dimensions. Je recommande donc de définir une structure qui contient les éléments utiles à la définition du tableau 2D :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct tab2D
    {
       T **tab;
        size_t nb_lin;
        size_t nb_col;
    };
    On peut définir une telle structure, l'initaliser à 0 dans la fonction appelante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    {
       struct tab2D tab = {NULL, 0, 0};
    Puis passer son adresse à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {
       ...
       fonction (&tab);
    Ensuite, l'allocation dynamique se fait dans la fonction selon ce principe :

    http://emmanuel-delahaye.developpez.....htm#tabdyn_2d

    Voir aussi :

    http://emmanuel-delahaye.developpez.com/tad.htm

    l'exemple correspond exactement à ce que tu veux...

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Par défaut
    Le plus simple, déclarer un pointeur sur tableau à 2D dans ta fonction
    double** T;

    Lui allouer la mémoire par un malloc (le tableau sera conservé après la fermeture de la fonction)
    T = malloc(heuteur*largeur*taille d'une case)

    Et en fin de fonction tu retournes T.
    A noter que ta fonction doit être déclarée comme double**
    ___

    Nicolas Morey-Chaisemartin
    http://nicolas.morey-chaisemartin.com

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Darkfang Voir le message
    Le plus simple, déclarer un pointeur sur tableau à 2D dans ta fonction
    double** T;
    OK
    Lui allouer la mémoire par un malloc (le tableau sera conservé après la fermeture de la fonction)
    T = malloc(heuteur*largeur)
    Non, ça, c'est faux.

    La méthode a déjà été expliquée. Je redonne le lien :

    http://emmanuel-delahaye.developpez.....htm#tabdyn_2d

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Par défaut
    Effectivement j'ai oublié de préciser que l'accès se fait aps de la même manière.
    Pour y acceder avec la formule normale Tab[i][j] mon allocation ne marche pas.

    Avec mon allocation, on accede en faisant Tab[i*largeur+j] ce qui peut se faire facilement avec une macro histoire d'avoir un accès ressemblant (du genre Tab(i)(j) )

    L'avantage de cette méthode:
    - Moins de mémoire consommée. On a hauteur*largeur*taille d'une case. Alors que l'autre méthode donne la meme chose + hauteur*taille d'un pointeur.
    - Potentiellement plus rapide. Du fait que l'alloc soit fait en un coup, le tableau est contigu en mémoire et globalement ca simplifie la vie au cache
    - Gain de temps pour l'alloc/libération. Le tout se fait en une alloc et un free au lieu de hauteur+1
    ______
    Nicolas Morey-Chaisemartin
    http://nicolas.morey-chaisemartin.com

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    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.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Darkfang Voir le message
    Effectivement j'ai oublié de préciser que l'accès se fait aps de la même manière.
    Pas seulement ça. Le type est faux. C'est pas T**a, mais T*a (tableau 1D linéaire à accès en 2 dimensions calculées).

Discussions similaires

  1. [XL-2010] Comment prendre en compte un tableau (Array) dans une fonction vba?
    Par statista dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/04/2011, 15h16
  2. Réponses: 4
    Dernier message: 15/08/2007, 22h05
  3. Réponses: 13
    Dernier message: 08/03/2007, 14h53
  4. Réponses: 12
    Dernier message: 22/11/2005, 13h17
  5. Réponses: 10
    Dernier message: 19/09/2005, 22h24

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