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

C# : problème avec retour de valeur (return int) - C#/.NET managed - Programmation

Marsh Posté le 20-02-2008 à 04:59:59    

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
Reply

Marsh Posté le 20-02-2008 à 04:59:59   

Reply

Marsh Posté le 20-02-2008 à 08:51:38    

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
Reply

Marsh Posté le 20-02-2008 à 12:15:33    

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

Reply

Marsh Posté le 20-02-2008 à 21:15:18    

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
Reply

Marsh Posté le 20-02-2008 à 21:23:11    

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
Reply

Marsh Posté le 20-02-2008 à 22:43:37    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed