Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2130 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  C# : problème avec retour de valeur (return int)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C# : problème avec retour de valeur (return int)

n°1689025
Durst1805
Posté le 20-02-2008 à 04:59:59  profilanswer
 

Salut à tous, voilà j'ai un petit soucis avec ma fonction return.
A partir de ma méthode 1, qui contient la variable hh, j'appelle une méthode 2 avec hh, qui elle même appelle une méthode 3 avec le même hh. Cette dernière méthode modifie la valeur de hh et la retourne à la méthode 2 qui la retourne à la méthode 1. Or lors du test, la variable hh de la méthode 1 n'est pas modifiée.
Voici un extrait de mon code, qui contient les détails du résumé ci-dessus :

 

(La méthode 1 est une boucle for qui modifie en permanence la valeur de hh)

 

Méthode 1 : Main

 
Code :
  1. ...
  2. for (s = 0, ss = 0, m = 0, mm = 0, h = 0, hh = 0, dbg = 0, ctrl = 0; ss != 10; )
  3. ...
  4. if (ctrl == 10 & s == 5 & ss == 9) Actions.dressage(hh);// affiche le menu d'actions toutes les 10 minutes
 


Méthode 2 : Actions.dressage

 

Code :
  1. public class Actions
  2.     {
  3.         public static int dressage(int hh)
  4.         {
  5.             Console.WriteLine("Votre aventure commence aujourd'hui. Il est minuit." );
  6.             Console.WriteLine("Voulez-vous éduquer votre animal? (oui)(non)" );
  7.             string rep = Console.ReadLine();
  8.             if (rep == "oui" ) Dressage.compétences(hh);
  9.             return hh;
  10.         }
  11.     }


Méthode 3 : Dressage.compétences
(la variable qui modifie hh est tps)

 
Code :
  1. public class Dressage
  2.     {
  3.         private bool cond;
  4.         private int tps;
  5.         private int ValComp;
  6.         private string cmd;
  7.         public static int compétences(int hh)
  8.         {
  9.             Dressage seNourrir = new Dressage();
  10.             seNourrir.cmd = "se nourrir";
  11.             seNourrir.cond = false;
  12.             seNourrir.tps = 2;
  13.             seNourrir.ValComp = 0;
  14.             Dressage attaquer = new Dressage();
  15.             attaquer.cmd = "attaquer";
  16.             attaquer.cond = false;
  17.             attaquer.tps = 2;
  18.             attaquer.ValComp = 0;
  19.             Dressage pister = new Dressage();
  20.             pister.cmd = "pister";
  21.             pister.cond = false;
  22.             pister.tps = 3;
  23.             pister.ValComp = 0;
  24.             Console.WriteLine("Que voulez-vous apprendre à votre animal ?" );
  25.             Console.WriteLine("(" + seNourrir.cmd + " ) " + "(" + attaquer.cmd + " ) " + "(" + pister.cmd + " )" );
  26.             string rep = Console.ReadLine();
  27.             switch (rep)
  28.             {
  29.                 case "se nourrir": seNourrir.ValComp++; hh += seNourrir.tps; Console.WriteLine("La compétence 'se nourrir' de votre animal est de " + seNourrir.ValComp);
  30.                     break;
  31.                 case "attaquer": attaquer.ValComp++; hh += attaquer.tps; Console.WriteLine("La compétence 'attaquer' de votre animal est de " + attaquer.ValComp);
  32.                     break;
  33.                 case "pister": pister.ValComp++; hh += pister.tps; Console.WriteLine("La compétence 'pister' de votre animal est de " + pister.ValComp);
  34.                     break;
  35.             }
  36.             System.Threading.Thread.Sleep(2000);
  37.             return hh;
  38.         }
  39.     }
 

Quelqu'un peut-il m'expliquer pourquoi quand je choisis une option entre "se nourrir" "attaquer" ou "pister",  la valeur de hh qui est censée être modifiée ne se repporte pas sur le résultat du hh affiché dans la méthode Main ?
Merci d'avance pour vos réponses.
Ps : Si vous avez besoin du code complet pour mieux cerné l'erreur, je vous le posterais volontier.


Message édité par Durst1805 le 20-02-2008 à 05:09:10
mood
Publicité
Posté le 20-02-2008 à 04:59:59  profilanswer
 

n°1689057
Tarabiscot​e
Posté le 20-02-2008 à 08:51:38  profilanswer
 

Tu ne réaffectes pas la valeur de retour de tes méthodes à ta variable hh, par exemple :
 

Code :
  1. if (ctrl == 10 & s == 5 & ss == 9) hh = Actions.dressage(hh);


 

Code :
  1. if (rep == "oui" ) hh = Dressage.compétences(hh);


 
Ou alors utilise un passage par référence.


Message édité par Tarabiscote le 20-02-2008 à 08:52:00
n°1689262
Durst1805
Posté le 20-02-2008 à 12:15:33  profilanswer
 

Ok merci beaucoup, dans les nombreux exemples de return que j'ai pu lire, aucun d'eux n'utilisait la réafectation de valeur, de ce fait je ne connaissais pas cette méthode. J'ai bien essayer une ref, mais malheureusement ça n'as pas voulu fonctionner. J'approfondirais cette méthode un peu plus tard. Merci

n°1689720
MagicBuzz
Posté le 20-02-2008 à 21:15:18  profilanswer
 

Code :
  1. void Main()
  2. {
  3.  int hh = 0;
  4.  DoSometing(ref hh);
  5.  Console.Writeline(hh);
  6. }
  7.  
  8. void DoSomething(ref int hh)
  9. {
  10.  hh = 1;
  11. }


 
Tu peux éventuellement utiliser la syntaxe des pointeurs aussi, mais ça t'oblige à écrire une zone "unsafe", ce qui n'est pas recommandé lorsqu'on peut s'en passer.


Message édité par MagicBuzz le 20-02-2008 à 23:57:03
n°1689732
MagicBuzz
Posté le 20-02-2008 à 21:23:11  profilanswer
 

Exemple complet, avec ref et pointeur :

Code :
  1. using System;
  2.  
  3. namespace TestConsole
  4. {
  5.    class Program
  6.    {
  7.        unsafe static void Main(string[] args)
  8.        {
  9.            int myVar = 0;
  10.  
  11.            DoSomethingByRef(ref myVar);
  12.            Console.WriteLine(myVar);
  13.  
  14.            DoSomethingByPtr(&myVar);
  15.            Console.WriteLine(myVar);
  16.  
  17.            Console.ReadKey(true);
  18.        }
  19.  
  20.        static void DoSomethingByRef(ref int var)
  21.        {
  22.            var = 1;
  23.        }
  24.  
  25.        unsafe static void DoSomethingByPtr(int *var)
  26.        {
  27.            *var = 2;
  28.        }
  29.    }
  30. }


 
A noter que pour que "unsafe" fonctionne, il faut modifier les paramètres de compilation, car par défaut c'est interdit.
http://msdn2.microsoft.com/fr-fr/l [...] S.80).aspx


Message édité par MagicBuzz le 20-02-2008 à 21:23:37
n°1689780
Durst1805
Posté le 20-02-2008 à 22:43:37  profilanswer
 

Merci beaucoup, tu es sympa, j'avais justement besoin d'un exemple concret de ref pour bien centrer le sujet.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  C# : problème avec retour de valeur (return int)

 

Sujets relatifs
[résolu] Petit problème de ThreadProblème de MCD pour produits à mulitples options
Problème code erreur PHP problème avec drawrect
probleme de frame en HTML.Probleme création nouveau membre
Problème de passage de variablesProblème avec Qt4
Concaténation de chaînes, problème avec langues sens d'écriture ≠Problème PHP/MySQL
Plus de sujets relatifs à : C# : problème avec retour de valeur (return int)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR