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 :

Retourner un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut Retourner un tableau
    Bonjour à tous,

    Voilà je suis un débutant en C et j'aurais souhaité savoir comment faire pour qu'une fonction retourne un tableau. Je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void main()
    {
    int A[2][2];
    A = init(A); // init() est une fonction qui fonction qui initialise toutes les cases de mon tableau a la valeur 2
    }
     
    ??? init(int a[2][2])
    {
         // instructions
    }
    Que mettre au niveau des points d'interrogations ? Je sais que je peux passer par les pointeurs et modifier mon tableau directement sans passer par une variable locale à ma fonction init() mais par curiosité je souhaitais savoir comment faire pour retourner un tableau, cela pourrait m'être utile ^^

    Merci beaucoup d'avance !

    TeToN

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    La solution passe par l'allocation dynamique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char *ma_fonction(int taille_demandee)
    {
       char *ptr = malloc(taille_demandee);
       return ptr;
    }
     
    int main(void)
    {
    char *tableau = ma_fonction(12);
    }
    La fonction retourne un pointeur sur un tableau de taille_demandee de char.

    Les pièges à éviter :
    • Na pas oublier de libérer la mémoire (avec free())
    • Ne pas déborder dans le tableau, si tu alloues 12 octets, il est interdit d'aller voir ou écrire dans le 13eme.
    • Ne pas oublier de tester le retour, je ne l'ai pas fais dans cet exemple (l'appel malloc() peu échouer)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Merci ! Mais je ne pensais pas justement au pointeurs !!!

    Ce que je voulais c'etait tout simplement que le tableau soit recopié dans un autre tableau dans ma fonction init() (en tant que variable locale a init()) et ensuite le renvoyer a la fonction main() et le remettre dans A.

    Merci d'avance !

    PS :

    Quand j'ecris : int[][] init(int tab[][])
    {
    ...
    }

    Cela ne fonctionne pas !

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Tu ne peux pas utiliser la valeur de retour d'une fonction pour recopier dans un tableau.
    Par contre, tu peux recopier dans un tableau en paramètre:
    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
    void copie_tableau(int dest[2][2], int const src[2][2])
    {
    	size_t x, y;
    	for(x=0 ; x<2 ; x++)
    	{
    		for(y=0 ; y<2 ; y++)
    		{
    			dest[x][y] = src[x][y];
    		}
    	}
    }
     
    int main(void)
    {
    	const int a[2][2] = { {1, 2}, {3, 4} };
    	int b[2][2];
    	copie_tableau(b, a);
    }
    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.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Ok ok !

    Merci beaucoup ! Donc si je résume bien, au final on ne peut pas renvoyer un tableau parce que lorsqu'on passe un tableau en paramètre dans une fonction ce n'est pas une variable locale mais le même tableau que j'ai déclaré précédemment dans ma fonction main(), cela étant du au fait qu'un tableau n'est rien d'autre qu'une adresse.

    Ais-je bien compris ?

    Merci beaucoup

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    C'est ça.
    Les tableaux en paramètre ne sont pas copiés.

    En fait, ça se voit mieux si tu ne mets pas la taille de la dernière dimension. Exemple, mon code précédent correspond à :
    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
    void copie_tableau(int dest[2][], int const src[2][], size_t tailleY)
    {
    	size_t x, y;
    	for(x=0 ; x<2 ; x++)
    	{
    		for(y=0 ; y<tailleY ; y++)
    		{
    			dest[x][y] = src[x][y];
    		}
    	}
    }
     
    int main(void)
    {
    	const int a[2][2] = { {1, 2}, {3, 4} };
    	int b[2][2];
    	copie_tableau(b, a, 2);
    }
    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.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/10/2005, 18h32
  2. Retourner un tableau ?
    Par chateau_dur dans le forum C++
    Réponses: 8
    Dernier message: 20/08/2005, 12h11
  3. retourné un tableau
    Par elekis dans le forum C++
    Réponses: 5
    Dernier message: 17/03/2005, 15h03
  4. [plpgsql] comment retourner un tableau
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 21h09
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

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