Probleme de valeur dans mes class!

[Résolu]
Signaler
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Bonjour,


Je programme sous VS6 et j'ai un probleme que j en arrive pas a
resoudre depuis 2 jours, alors apres 2 presque nuit blanche et de tout
petits yeux me voila devant vous en esperant trouver l'origine de mon
soucis!

Je vous explique, le code suit en dessous:

J'ai plusieur objet d'une meme class, je lis des valeur dans un fichier
et selon ce qu'il lis sur une ligne, il enregistre les valeur dans tel
ou tel objet... ce sont des coordonnées et les differents objet sont
des couches (etages). Je créer un objet par etage car chaque etage a sa
hauteur et couleur approprié!

Et a la fin il dessine chaque objets, mon but et de pouvoir dans le
futur decider de dessiner la couche que je veux grace au menu de mon
programme!

Mon probleme ne se trouve pas dans la compilation, aucune erreur de ce
cote la, mon programme s'execute parfaitement, je clique sur ouvrir, je
selectionne mon fichier et ensuite il me dessine n'importe quoi!!! par
contre (cf en dessous) si dans mon switch(LTest) je ne laisse qu'un
seul et unique case, il me le dessine exactement comme il faut, mais
des que je met tous les case, la il me dessine n importe quoi!

J'ai fait un test en ecrivant dans un fichier les valeur recu par
AddValue() et en ecrivant les valeurs tout a la fin, une fois tout le
fichier lu qu'elles sont les valeurs dans mes objets... AddValues
recoit les bonne valeurs, mais apres mes objets ont des valeurs
totalement fausse et abhérentes genre négative par exemple... enfin
bref des valeur rien a voir!

Avec le debug j'ai verifié les valeur qui s'enregistrait pourtant dans
mes objets et ca a l air correcte! Je ne comprend vraiment pas ce qu'il
se passe! Merci infiniment pour votre aide!


Voila, maintenant le Code

Je declare dans un General.h


#define INDICE_NELL    0

#define INDICE_PPLUS    1

#define INDICE_ACTIVE    2

#define INDICE_POLY        3

#define INDICE_ETAL1    4

#define INDICE_CONT        5

#define INDICE_ETAL2    6

#define INDICE_VIA1        7


// COORDONNEES

class VERTEX           
           
    // Build our Vertex Class

{

public:

    float x, y;       
           
        // 3D coordinates x,
y       

};

// CLASS GROUPANT LES 4 SOMMETS DE LA FACE

class QUAD           
           
        // Build our Quads Structure

{

public:

    VERTEX vertex[4];   
           
    // Array of 4 vertices   
           
           

};           
           
           

// CLASS D'UN COUCHE

class LAYER           
           
        // Build our LAYER Class

{

public:

    int num_quads;       
           
   

    float hauteur, zstart;

    vec4 color;

    QUAD* quad;


    LAYER(float z, float h, float r, float g, float b, float a)

    {

        this->num_quads=0;

        this->zstart = z;

        this->hauteur = h;

        this->quad = new QUAD;

        this->color.set(r, g, b, a);

    }


    void AddValue(float _centrex, float _centrey, float _qwidth, float _qlenght)

    {

        this->quad[num_quads].vertex[0].x =
_centrex - (_qlenght/2)
;

        this->quad[num_quads].vertex[0].y =
_centrey + (_qwidth/2)
;


        this->quad[num_quads].vertex[1].x = 
_centrex + (_qlenght/2)
;

        this->quad[num_quads].vertex[1].y =
_centrey + (_qwidth/2)
;


        this->quad[num_quads].vertex[2].x =
_centrex + (_qlenght/2);

        this->quad[num_quads].vertex[2].y =
_centrey - (_qwidth/2)
;

                   

        this->quad[num_quads].vertex[3].x =
_centrex - (_qlenght/2)
;

        this->quad[num_quads].vertex[3].y =
_centrey - (_qwidth/2)
;


        this->num_quads= this->num_quads+1;

    }

    ~LAYER()

    {delete quad; }

};

extern LAYER LNell;

extern LAYER LPPlus;

extern LAYER LActive;

extern LAYER LPoly;

extern LAYER LEtal1;

extern LAYER LEtal2;

extern LAYER LCont;

extern LAYER LVia1;

Mon
General.cpp
LAYER LNell    = LAYER(  0.0,-35.0, 1.0, 1.0, 1.0, 0.5);

LAYER LPPlus    = LAYER(  0.0,  0.0, 1.0, 1.0, 1.0, 1.0);

LAYER LActive    = LAYER(  0.0, -4.0, 0.0, 1.0, 0.0, 1.0);

LAYER LPoly        = LAYER(  0.1,  4.2, 1.0, 0.0, 0.0, 1.0);

LAYER LCont        = LAYER(  0.0, 10.0, 0.0, 0.0, 0.0, 1.0);

LAYER LEtal1    = LAYER( 10.0,  6.0, 0.0, 0.0, 1.0, 1.0);

LAYER LEtal2    = LAYER( 26.0, 10.0, 0.0, 0.0, 1.0, 1.0);

LAYER LVia1        = LAYER( 16.0, 10.0, 0.0, 0.0, 0.0, 1.0);

Ma fonction de lecture du fichier et d'enregistrement
bool SetupWorld(const char *filename)

{

    char type_layer[10];

    CString TestTypeLayer;

    float centrex, centrey, qwidth, qlenght;

    FILE *filein;

    char chaine[255];

    int LTest=-1;

    filein = fopen(filename, "rt");   
            // File To
Load World Data From

    if(filein != NULL)

    {               

        while (fgets(chaine, 250, filein)
!= NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)

        {

            if(CString(1,chaine)=="L")

            {

                sscanf(chaine, "L %s;", &type_layer);

                TestTypeLayer = CString(type_layer);

                if(TestTypeLayer.Compare("PPLUS;"))

                {   

                    LTest = INDICE_PPLUS;

                }

                if(TestTypeLayer.Compare("ACTIVE;"))

                {   

                    LTest = INDICE_ACTIVE;

                }

                if(TestTypeLayer.Compare("POLY;"))

                {   

                    LTest = INDICE_POLY;

                }

                if(TestTypeLayer.Compare("ETAL1;"))

                {   

                    LTest = INDICE_ETAL1;

                }

                if(TestTypeLayer.Compare("ETAL2;"))

                {   

                    LTest = INDICE_ETAL2;

                }

                if(TestTypeLayer.Compare("VIA1;"))

                {   

                    LTest = INDICE_VIA1;

                }

                if(TestTypeLayer.Compare("NELL;"))

                {   

                    LTest = INDICE_NELL;

                }


                if(TestTypeLayer.Compare("CONT;"))

                {   

                    LTest = INDICE_CONT;

                }

            }


            if(CString(1,chaine)=="B")

            {

           
    sscanf(chaine, "B %f %f %f,%f ;", &qlenght,
&qwidth, &centrex, &centrey);

                switch (LTest)

                {

           
        case
INDICE_CONT    :
LCont.AddValue(centrex,centrey,qwidth,qlenght);    break;

           
        case
INDICE_NELL    :
LNell.AddValue(centrex,centrey,qwidth,qlenght);    break;

           
        case
INDICE_ETAL1    :
LEtal1.AddValue(centrex,centrey,qwidth,qlenght); break;

           
        case INDICE_ETAL2  :
LEtal2.AddValue(centrex,centrey,qwidth,qlenght); break;

           
        case
INDICE_VIA1    :
LVia1.AddValue(centrex,centrey,qwidth,qlenght);    break;

           
        case INDICE_ACTIVE  :
LActive.AddValue(centrex,centrey,qwidth,qlenght); break;

           
        case
INDICE_POLY    :
LPoly.AddValue(centrex,centrey,qwidth,qlenght);    break;

           
        case INDICE_PPLUS   :
LPPlus.AddValue(centrex,centrey,qwidth,qlenght);   
break;   

                }

            }

        }

    }

    fclose(filein);

    return 1;

}

Et pour finir le fichier lu ressemble a ca: Je precise que je ne
peux pas changer la facon dont est construit ce fichier, il est exporté
d'un autre programme.
DS 1 5 1;

L PPLUS;

L ACTIVE;

B 12 46 38,315;

L ACTIVE;

L POLY;

B 36 10 38,315;

L ETAL1;

L CONT;

L ETAL2;

L VIA1;

L NELL;

DF;

DS 2 5 1;

L PPLUS;

L ACTIVE;

B 12 46 38,251;

L ACTIVE;

L POLY;

B 36 10 38,251;

L ETAL1;

L CONT;

L ETAL2;

L VIA1;

L NELL;

DF;

DS 3 5 1;

L PPLUS;

L ACTIVE;

B 12 46 108,243;

L ACTIVE;

L POLY;

B 36 10 108,243;

L ETAL1;

L CONT;

L ETAL2;

L VIA1;

L NELL;

DF;


Voila, je crois que je vous ai tout dis!

Encore un GRAND merci d'avance a ceux qui m'aideront a trouver pourquoi ca ne fonctionne pas comme il faudrait!


Jojo

2 réponses

Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

J'ai trouvé :P

Simplement il fallait que je déclare mon QUAD par QUAD[nombre]!

:)


Erreur bete
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
Oui mais tu n'as pas compris ton erreur en allouant avec QUAD[nombre] (alloc statique).
Cela ne te choque pas : CLASS c = CLASS(val,val,val,val); !!!!!?
Tu n'as pas défini de constructeur de copie (ni eventuellement d'operateur d'affectation) :
LAYER(const LAYER&);
Quant tu alloues avec "new" il faut obligatoirement un constructeur de copie.
C'est pourquoi en allouant statiquement ton QUAD[4], il n'y a plus d'erreur.

A par ça, ton programme à l'air interessant.