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 :

procédure avec paramètre de sortie


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut procédure avec paramètre de sortie
    Bonjour,
    je voudrais faire une procédure avec un paramètre de sortie. J ai procédé de la manière suivante mais ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int saisie_prix(float prix_du_produit)
    {
    	char char_prix_du_produit[3];
     
    	printf("Entrez le prix\nou tapez 'q' pour quitter\n");
    	do
    	{
    		gets(char_prix_du_produit);
    		if (char_prix_du_produit[0] == 'q') return FALSE;
    	}while ( sscanf(char_prix_du_produit,"%f",&prix_du_produit) != 1 || prix_du_produit > 2 || prix_du_produit <= 0 );
    	return TRUE;
    }
    Il semblerait qu il n y a pas de passage de valeur, dois je faire un passage par adresse ?

  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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Ashin Voir le message
    Bonjour,
    Il semblerait qu il n y a pas de passage de valeur, dois je faire un passage par adresse ?
    Oui, passage du paramètre par adresse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int saisie_prix(float * prix_du_produit)
    {
    	char char_prix_du_produit[3];
     
    	printf("Entrez le prix\nou tapez 'q' pour quitter\n");
    	do
    	{
    		gets(char_prix_du_produit);
    		if (char_prix_du_produit[0] == 'q') return FALSE;
    	}while ( sscanf(char_prix_du_produit,"%f",prix_du_produit) != 1 || prix_du_produit > 2 || prix_du_produit <= 0 );
    	return TRUE;
    }

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    merci medinoc t as résolu mon 2nd probleme et merci ram_0000 pour le premier

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Je ferais comme ça:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #ifndef TRUE
    #   define TRUE 1
    #endif
    #ifndef FALSE
    #   define FALSE 0
    #endif
     
    static int
    fclean(char *buffer, FILE *fp)
    {
        int err = 0;
     
        if (buffer != NULL && fp != NULL)
        {
            char *pc = strchr(buffer, '\n');
     
            if (pc != NULL)
            {
                /* -tc- La saisie est complete. On elimine le caractere de fin de
                   ligne saisit par fgets() */
                *pc = 0;
            }
            else
            {
                /* -tc- Erreur: la saisie a ete tronquee */
                int c;
     
                /* -tc- On signale l'erreur et on fait le menage dans le tampon
                   du flux entrant */
                err = 1;
     
                while ((c = fgetc(fp)) != '\n' && c != EOF)
                {
                }
            }
        }
     
        return err;
    }
     
    static int
    saisie_prix(double *prix_du_produit)
    {
        int ret = FALSE;
     
        if (prix_du_produit != NULL)
        {
            char buffer[16] = "";
            char *pend = NULL;
     
            do
            {
                printf("Entrez le prix\nou tapez 'q' pour quitter\n");
                fgets(buffer, sizeof buffer, stdin);
                fclean(buffer, stdin);
                *prix_du_produit = strtod(buffer, &pend);
            }
            while (strcmp(buffer, "q") != 0 &&
                    (*pend != 0 || *prix_du_produit > 2 || *prix_du_produit <= 0));
     
            if (strcmp(buffer, "q") != 0)
            {
                ret = TRUE;
            }
        }
     
        return ret;
    }
     
    int main(void)
    {
        double prix;
        if (saisie_prix(&prix) == TRUE)
        {
            printf("Le prix est %f\n", prix);
        }
        else
        {
            printf("La saisie a ete arretee!\n");
        }
        return 0;
    }
    Thierry

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    merci a vous tous, mais si jamais c est une chaine de caractère que je dois passer par adresse

    en reprenant le meme exemple ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int saisie_nom(char *retour_nom_du_produit)
    {
    	char char_nom_du_produit[30];
    	retour_nom_du_produit = char_nom_du_produit;
     
    	fgets(char_nom_du_produit);
    	if (char_nom_du_produit[0] == 'q') return FALSE;
    	return TRUE;
    }
    par contre impossible de récupérer ma chaine dans mon main en faisant comme dans ton tuto

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Ashin Voir le message
    merci a vous tous, mais si jamais c est une chaine de caractère que je dois passer par adresse

    en reprenant le meme exemple ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int saisie_nom(char *retour_nom_du_produit)
    {
    	char char_nom_du_produit[30];
    	retour_nom_du_produit = char_nom_du_produit;
     
    	fgets(char_nom_du_produit);
    	if (char_nom_du_produit[0] == 'q') return FALSE;
    	return TRUE;
    }
    par contre impossible de récupérer ma chaine dans mon main en faisant comme dans ton tuto
    Je verrais plus quelque chose comme:

    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
    int saisie_nom(char *retour_nom_du_produit, size_t taille)
    {
        int ret = FALSE;
     
        if (retour_nom_du_produit != NULL && taille > (size_t) 1)
        {
            if (fgets(retour_nom_du_produit, taille, stdin) != NULL)
            {
                /* -tc- voir definition de fclean() dans mon post precedent. */
                if (fclean(retour_nom_du_produit, stdin) == 0 &&
                        strcmp(retour_nom_du_produit, "q") != 0)
                {
                    ret = TRUE;
                }
            }
        }
        return ret;
    }
    Thierry

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    ok mais comment je récupère le nom de mon produit dans mon main ?

    j ai beau faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void main(void)
    {
    	char nom;
    	if(saisie_nom(&nom)==0) return FALSE;
    	printf("%s\n",nom);
    	return TRUE;
    }
    mais ça marche pas!

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Ashin Voir le message
    ok mais comment je récupère le nom de mon produit dans mon main ?

    j ai beau faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void main(void)
    {
    	char nom;
    	if(saisie_nom(&nom)==0) return FALSE;
    	printf("%s\n",nom);
    	return TRUE;
    }
    mais ça marche pas!
    Voici un exemple:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #ifndef TRUE
    #   define TRUE 1
    #endif
    #ifndef FALSE
    #   define FALSE 0
    #endif
     
    static int
    fclean(char *buffer, FILE *fp)
    {
        /* -tc- Voir detail de fclean() dans mon post plus haut! */
    }
     
    int
    saisie_nom(char *retour_nom_du_produit, size_t taille)
    {
        /* -tc- Voir detail de saisie_nom() dans mon post plus haut! */
    }
     
    /* -tc- N.B. main() retourne un entier de type int, toujours! En plus, les
       3 valeurs portables que peut retourner main() sont 0, EXIT_SUCCESS et
       EXIT_FAILURE */
    int
    main(void)
    {
        char nom[30] = "";
        int ret = EXIT_SUCCESS;
     
        printf("Entrez votre nom: ");
        fflush(stdout);
        if (saisie_nom(nom, sizeof nom) == TRUE)
        {
            printf("%s\n",nom);
        }
        else
        {
            ret = EXIT_FAILURE;
        }
     
        return ret;
    }
    Thierry

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    merci, je suis en train d étudier ta solution qui marche évidemment, mais bon il y a encore une bonne partie de ce que tu as mis que j ai pas encore capté et j ai toujours pas compris ce qui était faux dans mon main .

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Ashin Voir le message
    merci, je suis en train d étudier ta solution qui marche évidemment, mais bon il y a encore une bonne partie de ce que tu as mis que j ai pas encore capté et j ai toujours pas compris ce qui était faux dans mon main .
    Ta variable nom est de type char. Elle ne peut stocker qu'un caractère isolé. Pour une chaine de caractères, il faut utiliser un tableau de chars. Par ailleurs, ma version de saisie_nom() attend 2 arguments, car il est recommandé de contrôler la taille de la saisie. Dans ton exemple d'utilisation, tu ne passes qu'un seul argument à cette fonction. Finalement, tu définis main() comme ne retournant aucune valeur, alors que cette fonction doit obligatoirement, selon la norme du langage, retourner un entier de type int. De plus, cet entier doit être une des valeurs suivantes: 0, EXIT_SUCCESS ou EXIT_FAILURE.

    Voilà, j'espère que ça t'aide un peu.

    Thierry

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    jte remercie

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

Discussions similaires

  1. [SQLEXP2005][TSQL]Procédures avec Paramètres optionnels
    Par hsii04 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/03/2008, 10h50
  2. appel procédure avec paramètres ds fonction
    Par cpattin dans le forum VB.NET
    Réponses: 7
    Dernier message: 14/06/2007, 22h11
  3. Problème procédure avec paramètres
    Par Aizen64 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/06/2007, 10h40
  4. Fonction ou procédure avec paramètres optionnels ?
    Par [Silk] dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2006, 13h55
  5. [Débutant]Procédure avec paramètres entrée / sortie
    Par jeromejanson dans le forum Langage
    Réponses: 13
    Dernier message: 10/10/2005, 08h30

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