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

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2018
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Problème de résultat

    bonjour a tous, j'ai voulu coder un jeu de bataille, pour passer le temps et ne pas perdre la main
    j'ai donc utilisé un random pour les valeur, mais lorsque j'affiche la valeur juste après le random, ca me donne une vraie valeur( par exemple 8) mais lors de l'utilisation de mon programme d'affichage, il me compte que la valeur est 0, et j'ai beau chercher je ne voit pas pourquoi. pourriez vous m'aider svp
    je vous joint le code en pièce jointe, j’espère que quelqu'un pourra m'aider.
    bonne journée a tous
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Homme Profil pro
    Programmeur du dimanche
    Inscrit en
    août 2017
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Programmeur du dimanche
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2017
    Messages : 127
    Points : 410
    Points
    410

    Par défaut

    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 carte_joueur; /* ici, c'est une variable globale */
     
    ...
     
     
    int main (){
      while (i < 5){
        def_carte_joueur(carte_joueur); /* ici, la variable globale, qui n'est pas initialisée, est passée par copie en paramètre à la fonction def_carte_joueur  */
     
    ...
     
    int def_carte_joueur (int carte_joueur){
      carte_joueur = rand()%(13-1)+1; /* ici, c'est la copie locale qui est modifiée */
      printf("carte = %i\n", carte_joueur); /* valeur affichée, par exemple : 6 */
      return carte_joueur; /* la valeur retournée ici est ignorée par l'appelant... */
    }
    Verdict : la fonction def_carte_joueur ne modifie pas le contenu de la variable globale carte_joueur (je suppose que c'est ce que vous vouliez faire), mais sa copie locale qui lui est passée en paramètre et qui est ignorée par le main.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2018
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    daccord merci, je voit ou est le probleme
    je devrait donc faire quelque chose de ce genre la du coup?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int def_carte_joueur (int *carte_joueur){
      &carte_joueur = rand()%(13-1)+1; 
      printf("carte = %i\n", &carte_joueur); 
      return &carte_joueur; 
    }

  4. #4
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 324
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 324
    Points : 3 886
    Points
    3 886

    Par défaut

    Pour être précis, la variable globale est initialisée à zéro bien qu'il ne soit pas clair qu'il s'agisse du comportement escompté par l'OP.

    Citation Envoyé par florent88 Voir le message
    daccord merci, je voit ou est le probleme
    je devrait donc faire quelque chose de ce genre la du coup?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int def_carte_joueur (int *carte_joueur){
      &carte_joueur = rand()%(13-1)+1; 
      printf("carte = %i\n", &carte_joueur); 
      return &carte_joueur; 
    }
    As-tu essayé de compiler ce morceau de code ? Qu'est-ce qui ne colle pas à ton avis ?

    De plus, tes choix de conception doivent être justifiés : pourquoi renvoyer quelque chose si l'on désire modifier la valeur du paramètre ? Pourquoi passer à la fonction l'adresse d'une variable globale plutôt que de référencer directement cette variable ?

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 6 489
    Points : 18 235
    Points
    18 235
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par florent88 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int def_carte_joueur (int *carte_joueur){
      &carte_joueur = rand()%(13-1)+1; 
      printf("carte = %i\n", &carte_joueur); 
      return &carte_joueur; 
    }
    Bonjour

    Je vais essayer de t'apprendre certaines règles que tu devras avoir toujours en tête pour comprendre les pointeurs

    Première règle: l'adresse d'un int correspond à un nombre (une valeur d'adresse). Et si on regarde "ce qui est pointé par ce nombre", alors on a l'int correspondant
    Traduction C: si on a int a, alors &a est une adresse et *(&a) équivaut à "a"

    Seconde règle: une adresse est stockée (stockable) dans un pointeur, pointeur dont le pointé correspond au type de la variable. Par extension on peut dire qu'une adresse est un pointeur (attention, on n'a le droit de faire ce raccourci que si on garde en mémoire que ce n'est qu'un raccourci "de confort" et non une vérité mathématique ; une adresse c'est un nombre et un pointeur c'est un type).
    Traduction C: si on a int a, alors &a est du type "int étoile". Rajouter "&" devant un nom de variable revient à rajouter une étoile à son type.

    Si on applique ces principes à ta fonction, tu as "carte_joueur" du type "int étoile". Ensuite tu parles de "&carte_joueur". Donc (selon la seconde règle), "&carte_joueur" sera du type "int étoile étoile" (donc l'adresse d'une adresse) ce qui est peu compatible avec le nombre aléatoire (entier) que tu veux lui mettre. Mais le plus grave c'est que dans 95% des cas ce type d'instruction fonctionnera parce qu'une adresse reste tout de même à la base un nombre. Donc dans 95% des cas tu auras un code qui compilera mais un comportement totalement aléatoire (parce que bien entendu le nombre n'aura pas été stocké au bon endroit).

    Pour le reste, Matt_Houston a posé de très bonnes questions auxquelles tu devrais répondre avant de continuer. Mais si tu n'as pas encore fait de choix définitif, alors (selon les avis des développeurs C en général) les variables globales apportent plus de soucis que ceux qu'elles aident à résoudre...

    PS: Troisième règle: l'étoile, utilisée en tant que type, signifie "pointeur". Mais utilisée en tant qu'instruction signifie "pointé par".
    Traduction C:
    • int *a => je déclare une variable "a" qui me servira à stocker une adresse
    • printf("%d\n", *a) => je regarde la valeur qui se trouve à l'adresse placée dans "a"
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

Discussions similaires

  1. problème de résultat avec une requête
    Par jexl dans le forum PHP & MySQL
    Réponses: 3
    Dernier message: 29/03/2006, 23h23
  2. [SQL] Problème de résultat avec une requête
    Par raptorman dans le forum PHP & SGBD
    Réponses: 2
    Dernier message: 04/01/2006, 17h16
  3. Problème de résultat
    Par Mephisto08 dans le forum C
    Réponses: 21
    Dernier message: 28/09/2005, 08h57
  4. [VBA] Calcul du PGDC --> Problème de résultat
    Par snoopy69 dans le forum Access
    Réponses: 16
    Dernier message: 25/08/2005, 14h23
  5. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00

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