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 :

Exception stack overflow


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut Exception stack overflow
    salut les gars
    j'ai un souci en poo sur c#. Je reçois l'erreur "Process is terminating due to StackOverflowException."
    bon je sais pas ceque sa signifie mais jai fais des recherches et rien de concret.
    voici le code
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace ActiviteOrienteObjet
    {
        class Program
        {
            private static Random random = new Random();
     
            static void Main(string[] args)
            {
                AfficheMenu();
               ConsoleKeyInfo consoleKeyInfo = Console.ReadKey(true);
                while (consoleKeyInfo.Key != ConsoleKey.D1 && consoleKeyInfo.Key != ConsoleKey.D2 && consoleKeyInfo.Key != ConsoleKey.NumPad1 && consoleKeyInfo.Key != ConsoleKey.NumPad2)
                {
                    AfficheMenu();
                    consoleKeyInfo = Console.ReadKey(true);
                }
                if (consoleKeyInfo.Key == ConsoleKey.D1 || consoleKeyInfo.Key == ConsoleKey.NumPad1)
                    Jeu1();
                else
                    Jeu2();
              /*    string choix;
               int nombre;
            do
              {
                 AfficheMenu();
                 choix=Console.ReadLine();
                 nombre=0;
            if (int.TryParse(choix,out nombre))
             {
                 if (nombre==1)
                  {
                     Jeu1();
                  }
                     Jeu2();
             }
                }while (nombre !=1 || nombre !=2); */
     
            }
     
            private static void AfficheMenu()
            {
                Console.Clear();
                Console.WriteLine("Veuillez choisir votre mode de jeu :");
                Console.WriteLine("\t1 : Contre les monstres");
                Console.WriteLine("\t2 : Contre le boss de fin");
            }
            private static void Jeu1()
            {
                Joueur nicolas =new Joueur(150);
                int cptFacile = 0;
                int cptDifficile = 0;
                while (nicolas.EstVivante)
                {
                    MonstreFacile monstre = FabriqueDeMonstre();
                    while (monstre.EstVivant && nicolas.EstVivante)
                    {
                        nicolas.Attaque(monstre);
                        if (monstre.EstVivant)
                            monstre.Attaque(nicolas);
                    }
     
                    if (nicolas.EstVivante)
                    {
                        if (monstre is MonstreDifficile)
                            cptDifficile++;
                        else
                            cptFacile++;
                    }
                    else
                    {
                        Console.WriteLine("Snif, vous êtes mort...");
                        break;
                    }
                }
                Console.WriteLine("Bravo !!! Vous avez tué {0} monstres faciles et {1} monstres difficiles. Vous avez {2} points.", cptFacile, cptDifficile, cptFacile + cptDifficile * 2);
            }
     
            private static MonstreFacile FabriqueDeMonstre()
            {
                if (random.Next(2) == 0)
                    return new MonstreFacile();
                else
                    return new MonstreDifficile();
            }
     
            private static void Jeu2()
            {
                Joueur nicolas = new Joueur(150);
                BossDeFin boss = new BossDeFin(250);
                while (nicolas.EstVivante && boss.EstVivante)
                {
                    nicolas.Attaque(boss);
                    if (boss.EstVivante)
                        boss.Attaque(nicolas);
                }
                if (nicolas.EstVivante)
                    Console.WriteLine("Bravo, vous avez sauvé la princesse (ou le prince !)");
                else
                    Console.WriteLine("Game over...");
            }
        }
     
        public static class De
        {
            private static Random random = new Random();
     
            public static int LanceLeDe()
            {
                return random.Next(1, 7);
            }
     
            public static int LanceLeDe(int valeur)
            {
                return random.Next(1, valeur);
            }
        }
     
        public class MonstreFacile:NewClass {}
        public class MonstreDifficile : MonstreFacile {}
     
     
        public class Joueur:NewClass
        {
         //   public int PtsDeVies { get; private set; }
     
            public void Attaque(NewClass monstre) // attaque du joueur sur tout type de monstre
            {
              int lancerJoueur=LancerLeDe();
              int lancerMonstre=monstre.LancerLeDe();
              if (lancerJoueur > lancerMonstre)
              {
                  if (monstre is MonstreFacile || monstre is MonstreDifficile )
                  {
                      monstre.SubitDegats();
                  }
                  else if(monstre is BossDeFin)
                  {
                    int nbPoints = LancerLeDe(26);
                     monstre.SubitDegats(nbPoints);
                  }
              }
            }
            public Joueur(int points)
            {
                this.PtsDeVies=points;
            }
            public void SubitDegat(int degats)
            {
                if (!BouclierFonctionne())
                    PtsDeVies -= degats;
            }
     
            private bool BouclierFonctionne()
            {
                return De.LanceLeDe() <= 2;
            }
        }
     
        public class BossDeFin :NewClass 
        {
            public BossDeFin(int points)
            {
              this.PtsDeVies=points;
            }
            public override void Attaque(Joueur personnage)
            {
                int nbPoints = LancerLeDe(26);
                personnage.SubitDegats(nbPoints);
            }
     
        }
         public class NewClass 
        {
          protected  int PtsDeVies { get;  set; }
          public virtual  bool EstVivant { get; private set; }
           private NewClass monstre=new NewClass();
            private const int degatsSort = 10;
            public virtual int LancerLeDe()
            {
                return De.LanceLeDe();
            }
             public  bool EstVivante
            {
                get { return PtsDeVies > 0;}
            }
     
          /*    public NewClass(int points)
            {
                PtsDeVies = points;
            }*/
            // public NewClass(){}
     
            public int LancerLeDe(int valeur)
            {
                return De.LanceLeDe(27);
            }
              private int SortMagique()
            {
                int valeur = De.LanceLeDe();
                if (valeur == 6)
                    return 0;
                return degatsSort * valeur;
            }
            public  virtual void Attaque(Joueur joueur)
            {
                int lanceJoueur= LancerLeDe();
                int lanceMonstre= LancerLeDe();
                if (lanceMonstre > lanceJoueur)
                {
                    if (monstre is MonstreFacile)
                    {
                        joueur.SubitDegats(degatsSort);
                    }
                    else if(monstre is MonstreDifficile)
                    joueur.SubitDegats(SortMagique());
                }
            }
             public void SubitDegats()
            {
                EstVivant = false;
            }
              public void SubitDegats(int valeur)
            {
                PtsDeVies -= valeur;
            }
     
        }
    }

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    exception = erreur/bug dans ton code
    stack = pile
    overflow = dépassement de capacité

    quand une méthode en appelle une autre ca va sur la pile et celle ci a une taille limitée
    si un membre s'appelle lui même ca fait une boucle infinie qui finira par déclencher stackoverflow
    ca c'est le cas le plus simple, ca peut etre sur une propriété qui dans le get se rappelle elle même
    parfois c'est plus compliqué genre a qui appelle b qui appelle c qui appelle a et donc ca tourne en boucle

    normalement quand ca arrive en debug dans VS le programme te montre la dernière ligne qui passe en erreur, et en regardant la pile des appels tu peux facilement comprendre d'où vient le problème
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Ce n'est pas par rapport à la question posée, mais il y a beaucoup plus simple et souple pour lire le choix de l'utilisateur :
    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
    string input = string.Empty;
    while(input != "q")
    {
        AfficheMenu();
        Console.WriteLine("\tq : Quitter");
        input = Console.ReadLine().ToLower();
        switch(input)
        {
            case "1":
                Jeu1();
                Console.WriteLine("Appuyez sur [Entrée] pour continuer...");
                Console.ReadLine();
                break;
            case "2":
                Jeu2();
                Console.WriteLine("Appuyez sur [Entrée] pour continuer...");
                Console.ReadLine();
                break;
            case "q":
                Jeu1();
                Console.WriteLine("Merci d'avoir joué avec nous !");
                Console.WriteLine("Appuyez sur [Entrée] pour terminer...");
                Console.ReadLine();
                break;
            default:
                Console.WriteLine("Ce choix est invalide");
                Console.WriteLine("Appuyez sur [Entrée] pour continuer...");
                Console.ReadLine();
                break;
        }
    }

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 988
    Par défaut
    Ligne 178, tu crées un autre objet de type NewClass lors de l'initialisation de l'objet NewClass. Ce qui crée une boucle sans fin sur cette ligne.

    Dans ta méthode Attaque, tu peux remplacer "monstre" par "this".
    Dans cette même méthode, tu ne devais pas tester la classe du monstre (en POO, l'objet ancêtre ne doit rien connaître de ses descendants).
    Cette méthode est déjà virtuelle, il te suffit de la surcharger dans les classes MonstreFacile et MonstreDifficile et coup ne rien faire du tout dans NewClass.Attaque

    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
    public class MonstreFacile : NewClass {
     
        public override void Attaque(Joueur joueur)
        {
            int lanceJoueur = LancerLeDe();
            int lanceMonstre = LancerLeDe();
            if (lanceMonstre > lanceJoueur)
            {
                joueur.SubitDegats(degatsSort);
            }
        }
    }
    public class MonstreDifficile : MonstreFacile {
     
        public override void Attaque(Joueur joueur)
        {
            int lancerJoueur = LancerLeDe();
            int lancerMonstre = LancerLeDe();
            if (lanceMonstre > lanceJoueur)
            { 
                    joueur.SubitDegats(SortMagique());
            }
        }     
    }
    Cela va nécessiter de déclarer "protected" les membres utilisées dans MonstreFacile et MonstreDifficile.
    Ici ne sont affichés que les changements, le reste n'a pas besoin d'évoluer
    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
    public class NewClass
    {
        protected const int degatsSort = 10;
     
        protected int SortMagique()
        {
            int valeur = De.LanceLeDe();
            if (valeur == 6)
                return 0;
            return degatsSort * valeur;
        }
        public virtual void Attaque(Joueur joueur)
        {      
        }
     
    }
    EDIT :
    Au passage, ta gestion du menu ne fonctionne pas, ça boucle sans fin également même si tu n'a ps d'erreur.
    Esssaie la proposition de noxen.

Discussions similaires

  1. exception: Stack overflow
    Par ame_12 dans le forum C++
    Réponses: 6
    Dernier message: 01/09/2013, 18h43
  2. Exception de première chance : stack overflow
    Par Far_Away dans le forum C++
    Réponses: 9
    Dernier message: 02/02/2011, 20h22
  3. pourquoi ai-je une exception stack overflow ?
    Par AsmCode dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/06/2010, 12h44
  4. exception stack overflow
    Par farid0031 dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/05/2009, 00h46
  5. [Form.Close] System Stack Overflow Exception
    Par Ticoche dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/01/2008, 18h13

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