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 renvoyant un Float* ?


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut Fonction renvoyant un Float* ?
    Bonjour a tous !
    J'aurais voulu savoir s'il etait possible pour une fonction de renvoyer un pointeur float, qui n'en en fait autre qu'un tableau de float.

    c-a-d, est-ce qu'une declaration du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float *ma_fonction(mes parametres)
    est correcte en C ?

    Car je voudrais manipuler un tableau de float temporairement dans ma fonction et ne renvoyer en sortie qu'un pointeur vers celui-ci

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Pas possible à moins de déclarer le tableau dynamiquement.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Ok je vais faire autrement alors, mais je trouve dommage que ca soit impossible

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    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
     
    #include <stdlib.h>
     
    float *mafonction(void)
    {
        float *tab = NULL;
        tab = malloc(10*sizeof(float));
        if(tab == NULL) exit(EXIT_FAILURE);
        return tab;
    }
     
    int main(void)
    {
        float *tab = NULL;
        tab = mafonction();
        tab[0] = 0.;
        [...];
        free(tab), tab = NULL;
        return 0;
    }

  5. #5
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Oui ok je vois.
    Mais je voulais eviter l'allocation dynamique d'un nouveau tableau.
    Je vais plutot modifier dans ma fonction un tableau predeclare et alloue.
    Merci !

  6. #6
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    Mais je voulais eviter l'allocation dynamique d'un nouveau tableau.
    Si tu connais sa taille, tu peux le déclarer en static.

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Mayti4
    Si tu connais sa taille, tu peux le déclarer en static.
    Oui mais dans ce cas tu ne peux pas le retourner.

    Tu parle peux être de déclarer le tableau avec le mon clé static, dans ce cas le tableau n'est pas détruit à la sortie de la fonction mais j'essairai même pas de faire retourner son adresse par une fonction

  8. #8
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Tu parle peux être de déclarer le tableau avec le mon clé static, dans ce cas le tableau n'est pas détruit à la sortie de la fonction mais j'essairai même pas de faire retourner son adresse par une fonction
    Justement quelle est la différence entre un tableau "static" et dynamique quand il est retourné par la fonction?
    Y a t'il réellement comportement indéterminé?


  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Justement, non. Un tableau déclaré en variable locale statique peut être retourné par adresse sans problème: Il n'est pas effacé lorsque la fonction quitte.

    Par contre, cela pose les mêmes problèmes que les variables globales, sauf celui de l'accès depuis n'importe quel source (mais les autres problèmes, comme la non-réentrance et la non-thread-safeness, sont toujours présents).
    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.

  10. #10
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    C'est bon à savoir, merci.

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 gege2061
    Oui mais dans ce cas tu ne peux pas le retourner.
    Pourquoi ? Comment crois-tu que ctime() fonctionne ?

    Il y a d'autres problèmes, mais pas celui-là.

  12. #12
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par gege2061
    Oui mais dans ce cas tu ne peux pas le retourner.
    Pourquoi ? Comment crois-tu que ctime() fonctionne ?
    Je paralais d'une variable en mémoire statique (concernant le mot clés static, c'est en dessous).

    ctime fonctionne bizzarement : http://swtch.com/usr/local/plan9/src/lib9/ctime.c.

    Si j'ai bien suivi c'est encore pire que non thread-safe puisqu'à chaque appel de la fonction, on perd la valeur précédente (on réécri toujours à la même adresse, celle de cbuf)

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Tout comme pour une variable globale.

    Je paralais d'une variable en mémoire statique (concernant le mot clés static, c'est en dessous).
    ??? Elle est où, la différence ?
    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.

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Médinoc
    ??? Elle est où, la différence ?
    Bah c'est pas dynamique

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    ben, ça ne l'est dans aucun des deux cas!
    Je répète: Où est la différence ?
    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.

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 gege2061
    Je paralais d'une variable en mémoire statique (concernant le mot clés static, c'est en dessous).

    ctime fonctionne bizzarement : http://swtch.com/usr/local/plan9/src/lib9/ctime.c.

    Si j'ai bien suivi c'est encore pire que non thread-safe puisqu'à chaque appel de la fonction, on perd la valeur précédente (on réécri toujours à la même adresse, celle de cbuf)
    Il n'y a rien de bizarre. C'est simplement un exemple parmi d'autre de fonction C standard à l'interface mal conçu qui induit une implémentation à coup de variable statique et donc un comportement déplorable. Heureusement, strftime() corrige le tir.

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 08/01/2010, 16h15
  2. Fonction renvoyant char*
    Par Azharis dans le forum C++
    Réponses: 4
    Dernier message: 28/12/2005, 15h33
  3. Fonction renvoyant 0 ou 1
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/10/2005, 10h56
  4. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33
  5. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20

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