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 :

Problème d'incrémentation dans une procédure


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Points : 30
    Points
    30
    Par défaut Problème d'incrémentation dans une procédure
    Bonjour,
    Je voudrais changer (incrémenter) une variable depuis une procédure, le suivant est une simplification de mon code, je voulais pas que la procédure soit une fonction. Apparement c'est un simple détail. le résultat obtenu de ce code est 00000 au lieu de 12345. J'attends votre aide. Merci.

    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
    #include <stdio.h>
    #include <string.h>
    void tester(int test1)
    {
        test1=test1+1;
    }
    int main()
    {
        int i=0;
        int test=0;
        while (i<5)
        {
            tester(test);
            printf("%d",test);
            i++;
        }
     
        return 0;
    }

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Si je ne dis pas de bêtise, ta fonction travail sur une copie de ta variable donc quand tu sors de ta fonction elle vaut 0 comme tu l'as initialisé à 0 dans ton main.

    La solution serait de faire la boucle dans ta fonction et d’afficher après chaque tour de boucle la variable test.

    Et dans ton main faire juste un appel à ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int test;
    tester(test);

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    Si je mets le printf dans la procédure sera 11111 puisque il y a une incrémentation. Ce que je constate que le programme garde toujours la valeur 0 de test, or ce que je voudrais bien c'est la changer à chaque fois donc un résultat de 12345.

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    A la norme :

    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
    #include <stdio.h>
    #include <string.h>
     
    void tester(int test1)
    {
      test1 = test1 + 1;
    }
     
    int main(void)
    {
      int i = 0;
      int test = 0;
     
      while (i < 5)
      {
        tester(test);
        printf("%d", test);
        i++;
      }
      return (0);
    }
    Connais-tu les pointeurs ?
    Car l'idée de la procédure c'est de donner des pointeurs pour modifier le contenu.
    En gros : prendre un int*, et modifier le contenu.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Je te montre le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
    	int test = 1;
    	tester(test);
    	return 0;
    }
    Essaie maintenant de faire ta fonction, tu étais sur la bonne route.

    Si tu avais voulu que cela marche avec ton 1ère exemple il aurait fallu travailler avec des pointeurs chose compliqué pour un si petit code.

  6. #6
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Oulalala il y a du lourd dans ce topic ! (excusez ma familiarité ! Mais là... )

    Code petit ou pas... les pointeurs seront *toujours* nécessaires s'il souhaite garde ses specs telles qu'elles.
    Et faire du C sans pointeur... c'est... euh... bah autant allez voir du côté de PHP en CLI...

    Bref.
    sarra2104, connais-tu les pointeurs ou pas ?
    Si c'est non, et que tu ne veux pas les apprendre, tu DOIS faire une fonction dans "tester" qui renvoie un int.... sinon c'est impossible à faire [car on va éviter les variables globales dans du code clean].
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    C'est bon c'est résolu, des notions que j'avais oublié. Le voilà mon nouveau code correct :

    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
    #include <stdio.h>
    #include <string.h>
    void tester(int *test1)
    {
        *test1=*test1+1;
        printf("%d",*test1);
     
        return;
    }
    void main(void)
    {
        int test=0;
        int i=0;
     
        while (i<5)
        {
            tester(&test);
            i++;
        }
     
    }
    Merci pour vous tous.

  8. #8
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    C'est exactement ce que j'allais proposer !

    N'oublie pas de mettre à résolu, clique le bouton tout en bas.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Sa doit s'adresser à moi le début du message

    Je commence à m'apercevoir que oui faire du C sans pointeur c'est comme faire du vélo sans roue, mais pour une procédure aussi petite n'y à t'il pas plus simple que de passer par des pointeurs ?? Et cela sans variable globale.

    EDIT : Oublions ce que j'ai dis pas très doué pour aider ^^.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    Le problème c'est pas qu'on sait pas , le problème c'est de refuser de savoir et d'essayer. Vous avez essayé d'aider, en contre parti vous avez appri comme moi.

  11. #11
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    @clems_t : oui le début te visait "un peu".. (excuse-moi si tu le prends mal...)

    Non il n'y a pas d'autres solutions "si on suit ses spécifications à la lettre" et que l'on se refuse d'utiliser des globales.

    Si on oublie les contraintes de propreté et l'obligation de faire une "procédure", au final on aurait pu faire :
    - utiliser des pointeurs
    - une fonction aurait été très convenable
    - mettre le code de la procédure directement dans la fonction appelante
    - utiliser une variable globale

    On évite les variables globales pour des tas de raisons diverses et variées....
    La principale étant : elle est globale... elle risque d'être modifiée "n'importe où" dans le code... et là ça sera une horreur à débugger.

    Bref... si vous avez appris/retrouvé des trucs... tant mieux !
    Bonne journée !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par clems_t Voir le message
    Je commence à m'apercevoir que oui faire du C sans pointeur c'est comme faire du vélo sans roue, mais pour une procédure aussi petite n'y à t'il pas plus simple que de passer par des pointeurs ?? Et cela sans variable globale.
    Je te mets au défi d'écrire une procédure pour modifier une variable sans utiliser un pointeur.

    Avec une fonction, on peut y arriver mais tu ne modifies pas vraiment la variable avec la fonction. Tu fais a = carre(a);, ce n'est donc pas la fonction qui modifie a. La plupart du temps, modifier un paramètre veut dire passage par pointeur.

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

Discussions similaires

  1. problème de dynamisme dans une procédure
    Par sherdogvdb dans le forum Oracle
    Réponses: 3
    Dernier message: 07/03/2007, 11h43
  2. Réponses: 1
    Dernier message: 06/03/2007, 11h57
  3. Réponses: 1
    Dernier message: 20/07/2006, 17h03
  4. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  5. Problème Alter view dans une procédure stockée
    Par adjava dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2005, 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