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 :

fonction retourne pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut fonction retourne pointeur
    bonjour, je souhaite qu'une fonction me retoure plusieurs valeurs (ou un tableau). Pour cela je souhaiterais retourner un pointeur. Voici un exemple de code:
    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
     
    int *compare(int * , int *);	
    const DIM = 3;
     
    void main()
    {
     int toto[DIM] = {5,1,10};
     int bobo[DIM] = {4,5,5};
     int *bin;
     int a,b,c;
     bin = compare(toto,bobo);
     a = *bin;
     b  = *(bin+1);
     c = *(bin+2); 
     
    }
     
     int *compare(int *t, int *g)
     {
      int res[DIM];
      int i;
      for(i=0;i<DIM;i++){
        if(t[i]<=g[i])
          res[i] = 0;
        else
          res[i] = 1;
      }
      return res;
     }
    Dans mon exemple, je retrouve bien les bonne valeurs pour a,b et c. Cependant je ne suis pas sur que les adresse bin+1 et bin+2 soient 'stable' (aucun risque que le compilateur les ecrase en cas d'allocation d'espace memoire pour une variable quelconque).
    Note: du a des limitation du compilateur (compilateur pour microcontroleur specifique), je ne peux pas faire d'allocation dynamique.

    Est ce que cette methode fonctionne (en C ANSI) ? si non, quelles sont les alternatives possibles ?

    merci d'avance

  2. #2
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    non ce n'est pas une façon de faire, res est une variable local, stockée dans la pile, et pourra être écrasé suite à l'appel à d'autres fonctions. donc ton programme aura un comportement indéfini.
    comment ça ton compilateur ne te permet pas de faire d'allocation dynamique ?
    malloc fais parti de la libc !
    si tu ne veux pas utiliser de malloc, soit tu utilise une variable static, soit tu utilise une variable globale.
    mais generalement, pour ce genre de fonction, on fais appel à de l'allocation dynamique.

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut
    je travaille sur du hardware: limitation hardware du a l'architecture du hardware cible + compilateur proprietaire avec librairie n'etant pas des lib standard C.
    Je reformule donc ma question:
    1. est-il possible de retourner un tableau de valeurs sans avoir recours a l'allocation dynamique.
    2. si 1 est possible, est il possible de créer une fonction d'allocation style malloc en beaucoup plus simple ?

    PS: erreur dans le code envoyer const DIM = 3 est un #define DIM 3

  4. #4
    Membre éclairé Avatar de thoratou
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    Dans ton cas, fait plutôt une fonction compare comme il suit :

    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
     
     void compare(int *t, int *g, int* res)
     {
      int i;
      for(i=0;i<DIM;i++){
        if(t[i]<=g[i])
          res[i] = 0;
        else
          res[i] = 1;
      }
      return res;
     }
     
    void main()
    {
     int toto[DIM] = {5,1,10};
     int bobo[DIM] = {4,5,5};
     int bin[DIM] = {0,0,0};
     int a,b,c;
     bin = compare(toto,bobo);
     a = bin[0];
     b  = bin[1];
     c = bin+[2]; 
    }
    Ainsi tu n'a pas d'allocation dynamique e pas comportement indéterminé.

    Par contre il faut etre tres prudent avec ce genre de programmation et bien explicite les parametres de la fonction compare pour eviter les erreurs dans l'utilisation de la fonction.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     void compare(int *i_table3_t, int *i_table3_g, int *io_table3_res);
    Edit : pardon diogene, j'avais pas vu ta reponse

  5. #5
    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
    Evidemment, ce n'est pas possible de procéder comme tu le fais, puisque les variables locales (ici le tableau res dans compare()) sont détruites en sortie de fonction.

    Une possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ....
     int bin[DIM];
     int a,b,c;
     compare(bin,toto,bobo);
    ....
    void compare(int * res, int *t, int *g)
     {
      int i;
      for(i=0;i<DIM;i++){....

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut
    merci a vous,
    en fait je connaissait deja cette methode. Ce que j'essaye de faire c'est de repertorier toutes les methodes possibles et si je comprends bien sans allocation dynamique, l'idee de retourner un tableau ne marche pas.
    est-ce bien exact ?

  7. #7
    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
    C'est exact. (sauf pour si tu retournes un tableau en mémoire statique, mais cela génère un tas d'autres problèmes, donc les seules options viables sont le tableau passé en paramètre et l'allocation dynamique).

    Et aussi, les exemples donnés manquent de const:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int* compare(int const *t, int const *g, int* res)
    {
    	int i;
    	for(i=0 ; i<DIM ; i++) {
    		if(t[i] <= g[i])
    			res[i] = 0;
    		else
    			res[i] = 1;
    	}
    	return res;
    }
    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.

  8. #8
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut
    merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/04/2010, 11h33
  2. Réponses: 4
    Dernier message: 23/06/2009, 16h52
  3. Réponses: 6
    Dernier message: 04/03/2009, 19h50
  4. Fonction retournant un pointeur
    Par Le Furet dans le forum C
    Réponses: 8
    Dernier message: 25/09/2005, 18h54
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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