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 qui renvoie 2 arguments


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Par défaut fonction qui renvoie 2 arguments
    bonjour,
    je veux créer une fonction qui prend deux tableaux puis, après les avoir modifiés , les renvoie. J'ai l'impression qu'en C une fonction ne renvoie qu'un seul argument. Faut il créer une structure de deux tableaux et une fonction qui renvoie cette structure? Peut on écrire struc devant une fonction?
    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    avant de poser des questions, lis ton cours....

    Bien sûr qu'on peut avoir le nombre d'arguments souhaités dans une fonction.... Et même éventuellement un nombre variable...

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Par défaut
    Je n'ai pas de cours de C, je dois me débrouiller tout seul pour l'instant. J'ai eu un vieux réflexe matlab mais en utilisant les pointeurs on modifie directement les tableaux (donc pas besoin d'arguments de sorties). Désolé.

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Par défaut
    Au risque de paraître stupide je repose ma question. Dans tous les tutoriels du site que j'ai vu à chaque fois les fonctions ont un seul type donc on renvoie un seul argument. Est ce que je peux, par exemple, prendre deux tableaux, puis renvoyer la somme, le produit, la soustraction dans 3 nouveaux tableaux ou dois je faire 3 fonctions pour cela. Merci

  5. #5
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Par défaut
    je veux créer une fonction qui prend deux tableaux puis, après les avoir modifiés , les renvoie.
    Nuance importante : en C, quand tu passes un tableau à une fonction, tu passes seulement l'adresse du premier élément de ce tableau.
    Si tu déclares dans ton code :
    tab est un tableau de type int[30].
    Si ce tableau est envoyé à une fonction ayant pour prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction(int[] t, size_t nb_items);
    t sera seulement un pointeur sur un int (soit int*). Dans les paramètres d'une fonction, écrire « type[] nom_variable » revient exactement à écrire « type* nom_variable ». La syntaxe est différente mais la signification est la même : c'est juste un pointeur.
    Ta fonction a donc la possibilité de modifier ton tableau sur place, tu n'as pas besoin de retourner une valeur.

    Mais si au contraire tu cherches à interdire à ta fonction de modifier ton tableau (par exemple, une fonction d'affichage ou de recherche d'un élément), utilise le mot clef const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction(const int t[], size_t nb_items);
    J'ai l'impression qu'en C une fonction ne renvoie qu'un seul argument.
    Exact. Il me semble que le terme « argument » est réservé aux paramètres des fonctions, pour la valeur retour tu peux parler simplement de... valeur.

    Faut il créer une structure de deux tableaux et une fonction qui renvoie cette structure?
    Comme en C le transfert de paramètres se fait par valeur, si une fonction reçoit ou retourne une structure, toute la structure sera dupliquée en mémoire. C'est pourquoi cette technique est généralement proscrite car ce n'est pas optimisé.
    Si tu veux envoyer une structure à une fonction, utilise un pointeur sur cette structure.

    Peut on écrire struct devant une fonction?
    Oui, mais je te renvoie à ma précédente remarque.
    Tu peux aussi utiliser un typedef pour alléger l'écriture et ainsi éviter d'écrire le mot clef struct à chaque fois.
    Si tu veux absolument retourner une structure, utilise l'allocation dynamique :

    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
    typedef struct
    {
        /* éléments */
    } Foobar;
     
    Foobar* foobar_init(void)
    {
        Foobar* f = malloc(*f);
     
        if (f == NULL)
        {
            /* gestion de l'erreur */
        }
        /* initialisation des éléments */
        return f;
    }
    Exemple typique d'un constructeur.

    Je n'ai pas de cours de C
    N'essaie pas d'apprendre le C à l'aveuglette.
    Achète toi un livre, il y a également de très bon cours disponibles gratuitement sur ce site.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Par défaut
    Oui, je me très suis très mal exprimé. J'ai lu un tuto en entier mais maintenant je passe à la pratiqe (la théorie c'est bien beau mais faut bien en faire quelque chose ). Je crois que j'ai à peu près compris les réponses mais ce qui me gêne c'est que je ne peux renvoyer qu'une valeur. Je m'explique: j'essaie d'appliquer gram-schmidt sur 4 vecteurs de R4. J'ai 4 tableaux X[4],Y[4],Z[4],T[4]
    voici ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double gram(double X[], double Y[], double Z[], double T[], long tailletableau)
    {
         double e1[4],e2[4],e2[3],e4[4];
    /* je fais mon bidouillage sur mes vecteurs et je stocke les 4 vecteurs normalisés dans e1,e2,e3,e4 */
     
    return e1, e2, e3, e4;  /* et ça je peux pas le faire car je peux retourner qu'une seule valeur */
    }
    Je pense que je peux faire un tableau en deux dimensions (par exemple X[4][2] et mettre e1 dans X[4][1].
    Je peux également couper ma fonction en 4 fonctions.
    je peux aussi déclarer des variables globales mais cela semble déconseillé.
    Je peux créer les tableaux e1,..,e4 dans le main.c et les placer en argument avec des pointeurs.

    Comme je suis pollué par un autre langage je pense que je vais souvent refaire ce schéma. Y a t il une manière plus "classique" pour renvoyer plusieurs valeurs. Ma dernière suggestion me semble plus dans l'esprit du C.
    Cordialement

  7. #7
    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 kharg Voir le message
    je veux créer une fonction qui prend deux tableaux puis, après les avoir modifiés , les renvoie.
    Lorsque tu 'passe 2 tableaux', en fait, tu passes les adresses des premiers éléments du tableau via des paramètres de type pointeur. Si tu n'as pas utilisé 'const', les zones pointées sont modifiables; Tu fais donc les modifications dans la fonction et c'est tout. Il n'y a rien à renvoyer (à part un éventuel compte rendu d'exécution).

    Attention quand même : les tableaux 'originaux' sont modifiés. Si tu veux faire une copie modifiée ou garder une copie de l'original, il faut procéder autrement.

Discussions similaires

  1. Fonction qui renvoie un tableau?
    Par elm dans le forum C
    Réponses: 23
    Dernier message: 21/12/2005, 12h44
  2. Réponses: 31
    Dernier message: 25/10/2005, 18h26
  3. Fonction qui renvoie erreur dans mon état
    Par Daniel MOREAU dans le forum Access
    Réponses: 1
    Dernier message: 20/10/2005, 12h40
  4. [bioinfo] fonction qui renvoie chaîne à autre fonction
    Par perlaud dans le forum Bioinformatique
    Réponses: 11
    Dernier message: 16/07/2004, 15h06
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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