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 avec new


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut Problème avec new
    Je crée un programme pour faire des feuilles de personnage et pour chaque personnage, je fais choisir la race puis la classe. Ce qui fait au total 123 choix différents possibles. Le personnage sera donc de type Humain_Guerrier ou Horpy_Necromancien par exemple. Enfin je le stock avec un pointeur de type Perso car c'est la classe mère.

    Mais le problème c'est que étant donné que j'ai 123 allocations de mémoire avec new, bien que ca ne passera que par une seule, le compilateur me met cette erreur:

    too much global data defined in function in file in function [...]

    J'ai fais quelques tests et je crois que ca vient du nombre excessif de new, alors si quequ'un a compris et a une solution je l'en remerci de me la dire.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu peux nous montrer le code correspondant ?

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Les allocations se font dans ces parties :

    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
    Perso* Creer_Humain (int y) {
    	Perso *Temporaire;
     
    	switch (y) {
    		case eGuerrier : Temporaire = new Humain_Guerrier; break;
    		case eArcher : Temporaire = new Humain_Archer; break;
    		case eBarbare : Temporaire = new Humain_Barbare; break;
    		case eCavalier : Temporaire = new Humain_Cavalier; break;
    		case eRanger : Temporaire = new Humain_Ranger; break;
    		case eBandit : Temporaire = new Humain_Bandit; break;
    		case eAssassin : Temporaire = new Humain_Assassin; break;
    		case eAcrobate : Temporaire = new Humain_Acrobate; break;
    		case eMagicien : Temporaire = new Humain_Magicien; break;
    		case eClerc : Temporaire = new Humain_Clerc; break;
    		case eNecromancien : Temporaire = new Humain_Necromancien; break;
    		case eDruide : Temporaire = new Humain_Druide; break;
    		case eAlchimiste : Temporaire = new Humain_Alchimiste; break;
    		case eNavigateur : Temporaire = new Humain_Navigateur; break;
    		case eColporteur : Temporaire = new Humain_Colporteur; break;
    		case eChevaliere_du_kraan : Temporaire = new Humain_Chevaliere_du_kraan; break;
    		case eGardien_des_enfers : Temporaire = new Humain_Gardien_des_enfers; break;
    		case eGuerrier_de_la_nuit : Temporaire = new Humain_Guerrier_de_la_nuit; break;
    		case eTemplier : Temporaire = new Humain_Templier; break;
    	};
    	return Temporaire;
    }
    Perso* Creer_Nain (int y) {
    	Perso *Temporaire;
     
    	switch (y) {
    		case eGuerrier : Temporaire = new Nain_Guerrier; break;
    		case eBarbare : Temporaire = new Nain_Barbare; break;
    		case eCavalier : Temporaire = new Nain_Cavalier; break;
    		case eRanger : Temporaire = new Nain_Ranger; break;
    		case eBandit : Temporaire = new Nain_Bandit; break;
    		case eAcrobate : Temporaire = new Nain_Acrobate; break;
    		case eClerc : Temporaire = new Nain_Clerc; break;
    		case eDruide : Temporaire = new Nain_Druide; break;
    		case eAlchimiste : Temporaire = new Nain_Alchimiste; break;
    		case eColporteur : Temporaire = new Nain_Colporteur; break;
    		case eTemplier : Temporaire = new Nain_Templier; break;
    	};
    	return Temporaire;
    }
    Sachant qu'il y a 13 fonctions comme ca au total. Au début, ça bloque sur la troisième, puis si je supprime quelques allocations avant, ça recule de plus en plus.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ca me paraît pas top comme design, mais de ce côté là je suis sûr que si Luc passe dans le coin il pourra mieux te conseiller que moi

    Tu devrais également regarder du côté du design pattern factory.

    Ceci dit, j'ai jamais vu ce genre d'erreur, c'est assez bizarre !

  5. #5
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Salut,

    Juste quelques remarques au passage (sinon pour ton problème désolé je ne vois pas d'où ça peut venir):

    1. les enums

    Visiblement tu utilise un type énuméré: Si tu as donné un nom a ton enum, comme EPERSO, profites-en pour limiter les parametres de la fonction à cette énum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    enum EPERSO
    {
        eGueriller,
        eArcher
        ...
    };
     
    void fonction(EPERSO _e);
    2. le grand switch

    Pourquoi ne pas retourner la nouvelle instance directement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Perso* Creer_Humain (EPERSO _e)
    {
       switch (_e)
       {
          case eGuerrier : return new Humain_Guerrier;
          case eArcher : return new Humain_Archer;
          case eBarbare : return new Humain_Barbare;
          case eCavalier : return new Humain_Cavalier; 
          default:  return NULL;
       } 
    }

    C'est tout ce que je vois
    C'est bizarre ton problème, je n'ai jamais vu ça avant

  6. #6
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Au fait, eGuerrier est une énumération qui correspond au Guerrier, etc.

    et je ne sais pas ce que c'est le pattern design, je suis plutôt débutant.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Les design pattern sont des motifs de conception (vive la traduc), c'est-à-dire des schémas utilisables dans des situations bien particulières. La factory (fabrique) en est un courant, servant à créer des instances dérivées d'une classe mère selon un identifiant, ce qui est exactement ce que tu cherches à faire.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut
    Ben moi aussi je code un jeu comme ton genre.
    Si ça peut t'aider, je ne passe pas du tout par des switch/ case.

    J'ai fait une classe Magic générique et abstraite dont hérite Magiclife, Magicdeath etc...

    J'ai fait une classe Fight générique et abstraite dont hérite Warrior, etc..

    Donc quand je veux créer par exemple un shadow knight (toi tu connais c sûr ), il me suffit de créer dans ma classe Player une instance de Fight* -ici Warrior- et une instance de Magic* -ici magicdeath-.
    Si je veux faire un palouf, et bien hop une instance de Fight* -Warrior- et une autre de Magic* -Magiclife-.
    Donc infinité de choix et ça coûte pas un rond.


    Ma classe Player a donc pour données membres :

    Fight* fight;
    Magic* magic;

    et des données communes à tout joueur comme un level, une force etc...


    Bon c'est un peu plus compliqué que ça ce que j'ai écrit, mais l'idée de base, c'est dédier des tâches à des classes dévouées pour.


    Si tu fais à la sauce procédurale, tu ne t'en sortiras pas, car quand tu voudras rajouter une classe, tu seras bien embêté -Ce genre de projet n'est jamais ficelé à l'avance, c'est bien connu-.

    J'espère t'avoir aidé un petit peu

  9. #9
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Merci bigquick, en retournant directement l'instance ca marche mais ça génère une nouvelle erreur, Segment ELECKASE_TEXT exceeds 64K, alors je fais comment moi ? Y'a pas une option pour régler la limite ?

    Et pour kaktus, moi aussi j'ai une classe générique pour la race puis la classe vien s'y coller par dessus et ça sa marche bien sauf que pour que le joueur choisisse sa race et sa classe il faut que je fasse des switch car si il prend un humain alors il a le choix entre 19 classes, si c'est un nain alors il en a 11, etc.

  10. #10
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    En fait non, ca ne marche pas, le compilateur arrive juste un peu plus loin mais il me marque la même erreur par la suite.

    Il me met aussi que le code est Unreachable dans les fonctions du fait que je mets plein de return new ...

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Je suis assez hostile aux classes (C++) spécialisées pour les 42000 types d'entités différentes qui vont pouvoir se ballader dans un monde de jdr-v -- je ne sais pas si c'est pour ça que Loulou m'avait invoqué, vu qu'en disant "factory" il avait tout dit.

    Parce que comment :
    - se multiclasser ?
    - sortir de ces notions de classes ? (aller BASIC et ses dérisés -- le système de règles, hein ?!)
    - se polymorpher (volontairement ou non) en kobold-castor-garou ?
    - ...

    La souplesse se gagne plutôt avec de la composition (dynamique). Ainsi, la créature finale sera obtenue par superpositions de traits (aussi définissable, la superposition, dans un fichier de scripts (non C++)).

    Sinon, le message m'évoque ces vieux compilateurs du monde DOS -- à cause du 64k. Après je n'en sais pas plus.

  12. #12
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Merci Luc mais j'ai quasiment rien compris à ce que tu m'a écrit.

    Donc pour le problème du 64K ca viendrais de mon compilateur? Je peux rien y faire?

    Et pour les Unreachable, ca vient d'où ?

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Tu peux changer de compilateur si :
    - tu utilises bien un ancêtre destiné à msdos
    - ton système le permet (si tu es sous autre chose que msdos et que ta machine n'est pas trop ancienne).

    Pour ce que j'ai raconté, considère la composition plutôt que l'héritage (voire ici ton choix de définir 123 classes). Sinon, j'avais déjà dû m'étendre ici sur le sujet il y a quelques temps déjà. Peut-être avec la recherche avancée si tu cherches sur elfe ou nain dans le forum C++. Soit, cela rejoins un peu le choix adopté par Kaktus.

    EDIT: précisions.

  14. #14
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Je vais en prendre un autre alors car j'ai une machine assez puissante mais j'ai turbo C++ 4.5. Le problème c'est que j'ai téléchager dev-c++ et il n'avait pas graphics.h et il refuser clrscr(), donc il fallait que j'efface mon écran "à la main", du coup je l'ai laissé tomber. Puis j'ai eu Builder X mais y'a rien qui marché dessus, alors je vais bientôt utiliser Visual C++.

  15. #15
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Pour les Unreacable c'est réglé, j'ai remplacé le switch par des if, j'ai vu dans un nouveau post qu'on ne pouvait pas déclarer dans un switch et c'est pareil pour l'allocation de mémoire je crois.

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Azharis
    Pour les Unreacable c'est réglé, j'ai remplacé le switch par des if, j'ai vu dans un nouveau post qu'on ne pouvait pas déclarer dans un switch et c'est pareil pour l'allocation de mémoire je crois.
    Pour ça, il suffit d'ajouter des blocs d'accolades.

    http://www.developpez.net/forums/vie...859317#1859317

  17. #17
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    J'ai essayé mais ça ne marchait pas quand même

  18. #18
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    S'il s'agit toujours de ton problème des 64K, effectivement ce n'est pas la même chose. Là je parlais simplement des déclarations de variables dans les 'case'.

  19. #19
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Non, c'était pas le problème des 64K, c'était l'avertissement du Unreachable et avec les if, ca le fait plus.

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

Discussions similaires

  1. Problème avec New Delete TComponentList
    Par frantzgac dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2010, 17h22
  2. Problème avec un trigger et la valeur ":NEW."
    Par cedrich dans le forum SQL
    Réponses: 8
    Dernier message: 11/02/2009, 17h13
  3. problème avec un new[]
    Par f56bre dans le forum C++
    Réponses: 25
    Dernier message: 13/11/2006, 23h09

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