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 :

A propos des fonctions et des valeurs de retour


Sujet :

C

  1. #1
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut A propos des fonctions et des valeurs de retour
    Bonjour,
    Je réalise un code qui doit afficher une ligne, une rectangle, et un triangle en forme creuse.
    Pour l'instant je n'ai pas encore les formes creuses, mais le problème n'est pas la.
    J'ai crée un fonction qui demande à l'utilisateur des valeurs afin d'afficher les formes en question. mais rien ne s'affiche. Pourtant lorsque la structure de contrôle est dans la fonction main le code compile. Ma question est donc comment envoyer les valeurs à la fonction main.
    j'ai testé avec return LigneDeArob; mais le resultat est le même.

    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
    /****************************************************/
    /*forme_creuse guillaume.strohecker 15/12/2007      */
    /****************************************************/
    #include <stdio.h>
     
    /* fonction qui affiche une ligne de X */
    void ligne(int NombreDeX, char leCaractereX )
    {
    	int i; /* le compteur */
    	for (i = 1; i <= NombreDeX; i++)
    		printf("%c",leCaractereX);
    	printf("\n");
     
    }
     
    /* fonction qui affiche un rectangle */
    void rectangle(int LigneDeDiese, int ColonneDeDiese, char leCaractereDiese)
    {
    	int i, j; /* les compteurs */
    	for (i=1; i <= LigneDeDiese; i++)
    	{
    		for (j=1; j <= ColonneDeDiese; j++)
    		{
    			printf("%c",leCaractereDiese);
    		}
    		printf("\n");
    	}
    }
     
    /* fonction qui affiche un triangle */
    void triangle(int LigneDeArob, char leCaratereArob)
    {
    	int i=0;
    	int ColonneDeArob = i + 1;
    	while ( i < LigneDeArob)
    	{
    		int ColonneDeArob = i + 1;
    		ligne(ColonneDeArob, leCaratereArob);
    		i++;
    	}
    }
    /* fonction de controle */
    void controle(int NombreDeX, int LigneDeDiese, int ColonneDeDiese, int LigneDeArob)
    {
     
    	while (NombreDeX < 1 || NombreDeX > 20)
    		scanf("%d", &NombreDeX);
    	while (LigneDeDiese < 1 || LigneDeDiese > 20)
    		scanf("%d", &LigneDeDiese);
    	while (ColonneDeDiese < 1 || ColonneDeDiese > 20)
    		scanf("%d", &ColonneDeDiese);
    	while (LigneDeArob < 1 || LigneDeArob > 20)
    		scanf("%d", &LigneDeArob);
     
    }
     
     
    /* ma fonction main() */
    int main(void)
    {
    	int NombreDeX = 0;
    	int LigneDeDiese = 0;
    	int ColonneDeDiese = 0;
    	int LigneDeArob = 0;
    	controle(NombreDeX, LigneDeDiese, ColonneDeDiese, LigneDeArob);
    	ligne(NombreDeX, 'X');
    	printf("\n");
    	rectangle(LigneDeDiese, ColonneDeDiese, '#');
    	printf("\n");
    	triangle(LigneDeArob, '@');
    	printf("\n");
    	return 0;
    }
    Merci.

  2. #2
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    tu passes les paramètres à la fonction "controle" pour les faire modifier par l'utilisateur du programme.

    mais les parametres sont passés par valeur dans les arguments de la fonction, donc il ne sont pas modifiés au final. Et valent donc toujours 0.

  3. #3
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Donc je ne les initialise pas à zéro dans le main ?

  4. #4
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    oui oui il faut les initialiser, mais ce que je veux dire c'est que APRES la fonction "controle", ils vaudront toujours la meme chose, zéro si tu les initialises à zéro, un si tu les initialise à un, valeur indéfinie si tu ne les initialises pas.

    En fait les arguments d'une fonction sont en principe "passés par valeur" (ou on dit aussi "par copie"). C'est une *copie* des variables que controle( ) utilise. Donc l'utilisateur aura beau marquer tous les nombres qu'il veut, ce ne sont que les copies qui sont affectées, et pas les variables originales.

    En C++ en tout cas il faut passer les parametre *par référénce*. (int & au lieu de int), je ne sais plus si c'est pareil en C

    essaye de mettre des "&" après le type des variables de controle()

  5. #5
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Merci, je vais me pencher sur cette histoire " passer par valeur ".
    J'ai testé le int & mais il semblerait que cela ne fonctionne pas.

  6. #6
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    Voila j'ai trouvé :

    http://c.developpez.com/faq/?page=po...etour_multiple

    c'est pas très complet mais grosso modo c'est en fait ce que tu veux faire .

    Tu veux passer des arguments pour qu'ils soient modifiés.

    Alors dans ce cas en C tu vas utiliser des *pointeurs*, (int *) au lieu de (int) en paramètres de la fonction.

    un pointeur contient "l'adresse" de la variable en mémoire, et permet donc d'y accéder meme dans une fonction.

    par contre : il va falloir faire de petites modif :

    appeler controle non plus avec le nom des variables à modifier mais avec leur adresse :

    dans main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    controle(&NombreDeX, &LigneDeDiese, &ColonneDeDiese, &LigneDeArob);
    dans la fonction controle :

    utiliser NombreDeX au lieu de &NombreDeX je crois, etc...

    EDIT : arf trop tard, deja corrigé ^^

  7. #7
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    bonjour,
    Je n'ai pas encore vu la notion de pointeur en C, et donc pour créer ce type de fonction il faut savoir les manipuler. Il n'y a pas d'autres moyens ?
    ou faut il alors laisser la structure de contrôle dans le main.

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par emprex Voir le message
    Je n'ai pas encore vu la notion de pointeur en C, et donc pour créer ce type de fonction il faut savoir les manipuler.
    Des qu'une fonction doit modifier l'un de ces arguments (et que cette modification doit etre visible par la fonction appellante), il faut qu'elle recoive un pointeur vers cet argument. Il n'y a pas d'autre moyen.

    Il n'y a pas d'autres moyens ?
    Dans ton cas, il suffit de faire une petite fonction qui se charge de lire un entier, et qui renvoit la valeur. Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NombreDeX = get_int_1_to_20();
    LigneDeDiese = get_int_1_to_20();
    ...
    Ainsi, pour le moment, tu evites d'utiliser une notion que tu n'as pas encore apprise. Pour la saisie, evite scanf() qui est difficile a utiliser de facon propre et secure, et regarde du cote de fgets() + strchr() + strtol(). Fais une recherche: il y a plein de sujets dans ce forum qui ont aborde le probleme de la saisie d'un entier. C'est peut-etre d'ailleurs une FAQ.

  9. #9
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    merci beaucoup.

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/04/2011, 13h30
  2. Réponses: 7
    Dernier message: 11/08/2006, 15h03
  3. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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