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 retournant 2 valeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut Fonction retournant 2 valeurs
    bonjour, j'ai un petit souci avec une question que j'ai eu à l'examen (que j'ai raté) et dont je ne trouve pas la solution.


    Question 1 La fonction compter_enregistrements est la première appelée par main. Elle doit recevoir en paramètre le nom d’un fichier (chaîne) et la taille commune des enregistrements de ce fichier (en octets). Elle retourne vers l’appelant le nombre d’enregistrements contenus dans ce fichier (0 si le fichier est vide ou non trouvé).
    Ecrire le code de cette fonction.

    Question 2 Ecrire une variante de compter_enregistrements. Elle réalise le même traitement que celle de la question 1, à la différence qu’elle retourne 0 si le fichier n’est pas trouvé et 1 s’il est trouvé. Uniquement si le fichier est trouvé, elle propage vers l’appelant le nombre d’enregistrements contenus dans ce fichier, en utilisant un moyen alternatif à la valeur de retour.
    Ecrire le code de cette variante. N’indiquez que les modifications apportées à la fonction de la question 1..

    voici le prototype de cette fonction:

    int compter_enregistrements (char*,int);

    voici l'appel à cette fonction dans main

    compter_enregistrements(fichier_voiture, sizeof(vehicule));

    question 1

    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
    int compter_enregistrements(const char* fichier_courant,int taille)
    {
        FILE* f_voiture;
        int ret_val;
     
        f_voiture = fopen(fichier_courant, "rb");
     
        if(f_voiture == NULL)
            ret_val = 0;
        else
        {
            fseek(f_voiture, 0, SEEK_END);
            ret_val = ftell(f_voiture)/taille;
            fclose(f_voiture);
        }
     
        return ret_val;
    je ne vois pas comment répondre à la question 2
    en utilisant un pointeur? mais sur quoi?

    je suis complètement perdu!!!

    merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 499
    Par défaut
    Bonjour et bienvenue,

    Citation Envoyé par fredattack Voir le message
    Je ne vois pas comment répondre à la question 2
    en utilisant un pointeur? mais sur quoi?
    Tu as pratiquement donné la réponse à ta question :

    — Un pointeur, mais sur quoi ?
    — Sur une variable capable de recevoir la valeur de la donnée que tu dois renvoyer.

    Jusqu'ici, tu renvoyais un int. C'est donc à la fonction appelante (ici main), de déclarer une variable de type int et de passer l'adresse de cette variable à ta fonction, pour que celle-ci puisse écrire dedans. Cette fonction doit donc admettre un troisième paramètre en plus des deux premiers, qui soit formellement de type « int * », soit « pointeur sur un entier ». Pour trouver ensuite l'adresse en mémoire d'une variable, quelle qu'elle soit, il faut utiliser le préfixe « & ».

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    merci pour vos réponses,

    mais la fonction ne peut contenir que 2 parametres formel.

    je pensais à ceci:

    dans main, déclarer:

    int nb_enrgistrement;

    et la fonction comme ceci:

    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
    int compter_enregistrements(const char* fichier_courant,int taille)
    {
       /* QUESTION  2*/
        FILE* f_voiture;
        int ret_val=1;
        in *pt_nb_enregistrement= & nb_enregistrement
     
        f_voiture = fopen(fichier_courant, "rb");
     
        if(f_voiture == NULL)
            ret_val = 0;
        else
        {
            fseek(f_voiture, 0, SEEK_END);
            *pt_nb_enregistrement = ftell(f_voiture)/taille;
            fclose(f_voiture);
        }
     
        return ret_val;
    }

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut


    Citation Envoyé par fredattack Voir le message
    la fonction ne peut contenir que 2 parametres formel.
    dans ce cas effectivement l'idée c'est d'avoir une variable globale, la modifier depuis ta fonction et la lire depuis main()

    mais es-tu certain que le prototype ne doive obligatoirement comporter que 2 paramètres ? ça n'est pas précisé dans l'énoncé tel qu'il est posé en tous cas, et c'est en soi souvent plus propre d'utiliser un paramètre de sortie qu'une variable globale

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par fredattack Voir le message
    en utilisant un pointeur?
    alors pour resituer un peu, la question 2 n'est pas une question, ta réponse en revanche en est une, je comprends que tu sois perdu

    elle propage vers l’appelant le nombre d’enregistrements contenus dans ce fichier, en utilisant un moyen alternatif à la valeur de retour.
    pense à une fonction comme scanf() par exemple, et la façon dont on l'utilise

  6. #6
    Membre expérimenté
    Avatar de ChipsAlaMenthe
    Homme Profil pro
    Ingénieur en eau chaude et ballon rond
    Inscrit en
    Mai 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur en eau chaude et ballon rond
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 138
    Par défaut
    Tout à fait!

    En gros voici l'allure de ta fonction pour la question 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int compter_enregistrements(const char* fichier_courant,int taille)
    {
        int code_retour = 0;
        ...
        return code_retour;
    }
    Maintenant il est demandé d'utiliser la valeur de retour comme indicateur (en gros), ça permet notamment une utilisation plus complexe et plus complète de ta fonction, c'est souvent un moyen utilisé par certaines fonctions en C.

    L'idée est donc d'intégrer un paramètre de sortie (ou dit aussi paramètre "out") dans les arguments de ta fonction. Ainsi, si tu as trouvé ce que tu voulais dans le code de ta fonction, tu vas retourner la valeur 1 et tu vas donner une valeur à ton paramètre de sortie. Comme ça dans ta fonction main, si le retour de cette fonction est 1, alors tu sais que tu vas pouvoir exploiter ce paramètre de sortie.
    Par contre si tu retournes 0, alors n'inscrit rien dans ce paramètre de sortie, ce n'est pas la peine car la fonction a échouée. Du coup dans ton main lorsque ta valeur de retour est de 0, tu ne tiendra pas compte du paramètre de sortie de ta fonction "compter_enregistrements".

    Voici un exemple de ta fonction compter_enregistrements:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int compter_enregistrements(const char* fichier_courant,int taille, int* parametre_sortie)
    {
        int code_retour = 0;
        ...
        // Modification de parametre_sortie si necessaire
        ...
        return code_retour;
    }

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/01/2008, 17h05
  2. fonction (retourner une valeur)
    Par nymus7 dans le forum Langage
    Réponses: 8
    Dernier message: 03/09/2007, 13h22
  3. Fonction retournent plusieurs valeurs
    Par Futixu dans le forum C++
    Réponses: 18
    Dernier message: 15/06/2006, 22h49
  4. Fonction retournant plusieurs valeurs
    Par Trap D dans le forum Scheme
    Réponses: 1
    Dernier message: 17/02/2006, 21h52
  5. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45

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