begin process at 2010 03 18 04:02:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

probleme de vecteur static


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

probleme de vecteur static

vendredi 3 novembre 2006 à 16:24:46 | probleme de vecteur static

hisoka56

bonjour, je suis en train de réaliser un moteur 3d pour un jeu et je bloque sur un petit point:

j'ai fait un module de chargement de model (ASE) que je stocke dans des vecteurs de <model> a l'initialisation, juste apres celle ci, aucun probleme, les models sont contenu mais plus tard quand j'essaille d'y acceder (pour le rendu par exemple)
quand j'y accede par
ml::model_loader.mod.size(), il me dit qu'il en contient 0




/*
model_loader.h

sert a charger des fichier de model 3D (format .ASE)
et les transforme en entité affichable sous opengl

auteur:jolrael
*/

#ifndef MODEL_LOADER_H
#define MODEL_LOADER_H
#include "sdlglutils.h"
#include <vector>
#include <string>
#include <stdio.h>
using namespace std;

namespace ml
{

    typedef struct v3d v3d;
    typedef struct face face;
    typedef struct tv3d tv3d;
    typedef struct tface tface;
    struct v3d    {double x, y, z;};
    struct face {int A,B,C;};
    struct tv3d {double x,y,z;};
    struct tface {int A,B,C;};



    class element
    {
    private:
        GLuint texture;
        char nom[20];
        vector<v3d> vertex;
        vector<face> faces;
        vector<tv3d> tvertex;
        vector<tface> tfaces;

       

        void afficherface(int i);

    public:
        element();
        int charger(FILE *fichier, int n);
        void afficher();
       
    };

    class model
    {
    private:
        vector<element> elt;
        FILE *fichier;

    public:
        model();
        model(char *nom);
        void afficher();
        void charger(char *nom);
    };


    class model_loader
    {
    public:
        static vector<model> mod;
        static void addModel(char *url);
    };


}

#endif




vendredi 3 novembre 2006 à 16:43:19 | Re : probleme de vecteur static

Kangourou_Nomade

Salut,

heu...
 Je pige pas en quoi le code header peut aider à comprendre pourquoi ton vecteur est vide.


Jah bless mycode

vendredi 3 novembre 2006 à 17:44:00 | Re : probleme de vecteur static

hisoka56

hum désolé, je pensais avoir posté le reste avec:



fichier model_loader.cpp:

#include "model_loader.h"
#include <string.h>
#include <iostream>
using namespace std;


/*
permet de charger des models 3d au format ASE
*/

ml::model::model(char *nom)
{
    charger(nom);
}

ml::model::model()
{
   
}

void ml::model::charger(char *nom)
{
    int nbre=0;
    char tmp[14];
    fichier = fopen(nom, "r");
    if (fichier==NULL) return;
    //compte le nombre d'elements
    while(fgets(tmp, 14, fichier) != NULL)
        if (!strcmp(tmp, "*GEOMOBJECT {"))
            nbre++;
    //nbre contient le nombre d'elements
    if (nbre == 0) return;

    for (int i=1; i<=nbre; i++)
    {
        element t;
        t.charger(fichier, i);
        elt.push_back(t);
    }


    fclose(fichier);
}

void ml::model::afficher()
{
    for (int i=0; i<elt.size(); i++)
        elt[i].afficher();
}


ml::element::element()
{
    texture=0;
    strcpy(nom, "aucun nom");
}

int ml::element::charger(FILE *fichier, int n)
{
    char *tex;
    char tamp[200];
    int k=0;
    char cherche[20] = "\t*MATERIAL ";
    char tmp[20];

    rewind(fichier);
   
    while(fgets(tmp, 12, fichier) != NULL)
    {
        if(!strcmp(tmp, cherche))
        {
            k=fgetc(fichier);
            if (k-48+1 == n)//si c'est le fichier de texture voulu (-48=>c->int +1)
            {
                k=n;
                break;
            }
        }
    }
    if (k!=n) return 0; //texture non trouvée
    while (strcmp(fgets(tmp, 15, fichier), "\t\t\t*MAP_AMOUNT"));
    fgets(tmp, 19, fichier);
    fgets(tamp, 200, fichier);
    tex=strchr(tamp, '\"');
    tex = (tex+1);
    tex[strlen(tex)-2] = '\0';
    //a partir d'ici tex contient le chemin exacte de la texture
    texture=loadTexture(tex);

    for(int i=1; i<=n; i++)
        while (strcmp(fgets(tmp, 14, fichier), "\t*NODE_NAME \""));
    fgets(nom, 20, fichier);
    nom[strlen(nom)-2] = '\0';
    //nom contient le nom du mesh associé

    int n_vertex=0, n_faces=0;
    while(strcmp(fgets(tmp, 19, fichier), "\t\t*MESH_NUMVERTEX "));
    fgets(tmp, 10, fichier);
    n_vertex=atoi(tmp);
    while(strcmp(fgets(tmp, 18, fichier), "\t\t*MESH_NUMFACES "));
    fgets(tmp, 10, fichier);
    n_faces=atoi(tmp);
    //n_vertex & n_faces contiennent respectivement le nombre de vertex et de faces


    //lit les vertex
    fgets(tamp, 100, fichier);
    for (int i=0; i<n_vertex; i++)
    {
        v3d vert;
        char *ch;
        fgets(tamp, 100, fichier);
        ch=strchr(tamp, 'X'); ch=strchr(ch, '\t');
        ch=ch+1;
        sscanf(ch, "%lf\t%lf\%lf", &vert.x, &vert.y, &vert.z);

        //v3d vert ={x,y,z};
        vertex.push_back(vert);   

    }
    //les vertex sont stockés

    //lit les faces
    while(strcmp(fgets(tamp, 21, fichier), "\t\t*MESH_FACE_LIST {\n"));
    for (int i=0; i<n_faces; i++)
    {
        face fc;
        char *ch, tA[5], tB[5], tC[5];
        fgets(tamp, 200, fichier);
        ch=strchr(tamp, ':');ch+=7;
        sscanf(ch, "%s %s %s %s %s",tA, tamp, tB,tamp, tC);
        fc.A=atoi(tA); fc.B=atoi(tB); fc.C=atoi(tC);
        faces.push_back(fc);
    }
    //les faces sont lues

    //lit les vertex sur les textures
    int n_tvertex;
    while(strcmp(fgets(tmp, 20, fichier), "\t\t*MESH_NUMTVERTEX "));
    fgets(tmp, 10, fichier);
    n_tvertex=atoi(tmp);
    fgets(tamp, 200, fichier);

    for (int i=0; i<n_tvertex; i++)
    {
        tv3d tvert;
        char *ch;
        fgets(tamp, 100, fichier);
        ch=strchr(tamp, 'T'); ch=strchr(ch, '\t');
        ch=ch+1;
        sscanf(ch, "%lf\t%lf\%lf", &tvert.x, &tvert.y, &tvert.z);

        tvertex.push_back(tvert);   

    }
    //chargées

    //lit les tfaces
    int n_tfaces;
    while(strcmp(fgets(tmp, 20, fichier), "\t\t*MESH_NUMTVFACES "));
    fgets(tmp, 10, fichier);
    n_tfaces=atoi(tmp);
    fgets(tamp, 200, fichier);

    for (int i=0; i<n_tfaces; i++)
    {
        tface tf;
        char *ch;
        fgets(tamp, 100, fichier);
        ch=strchr(tamp, 'C'); ch=strchr(ch, '\t');
        ch=ch+1;
        sscanf(ch, "%ld\t%ld\%ld", &tf.A, &tf.B, &tf.C);

        tfaces.push_back(tf);   

    }

    return 1;
}


void ml::element::afficher()
{
    for (int i=0; i<faces.size(); i++)
        afficherface(i);
}

void ml::element::afficherface(int i)
{
    face f = {faces[i].A, faces[i].B, faces[i].C};
    v3d v[3];
    v[0]= vertex[f.A];
    v[1]= vertex[f.B];
    v[2]= vertex[f.C];

    //a completer pour les textures
    glBegin(GL_TRIANGLES);
    glColor3ub(0,0,255); //face bleu
    glVertex3d(v[0].x, v[0].y, v[0].z);
    glVertex3d(v[1].x, v[1].y, v[1].z);
    glVertex3d(v[2].x, v[2].y, v[2].z);   
    glEnd();


}














le main de test:

using namespace ml;

int main(int argc, char *argv[])
{
    model m;
    m.charger("models/maison.ASE");
    model_loader::mod.push_back(m);
    cout <<model_loader::mod.size(); //ici pas de probleme il m'affiche 1
    ogl g;
    g.boucle_affiche();

   

    return 0;
}










et la fonction qui devrait afficher le model:


void ogl::boucle_affiche()
{

    last_time = SDL_GetTicks();
    for (;;)
    {
        start_time = SDL_GetTicks();

        while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
            case SDL_QUIT:
                exit(0);
                break;
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                case SDLK_p:
                    takeScreenshot("test.bmp");
                    break;
                }
            }
        }

        gluLookAt(200,200,200,0,0,10,0,0,1);
        current_time = SDL_GetTicks();
        elapsed_time = current_time - last_time;
        last_time = current_time;
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity( );

        //md.afficher();

        cout <<model_loader::mod.size();    //le probleme se trouve ici
       //a la ligne du dessus je devrais avoir 1 (le model chargé) mais il me dit que le vecteur est vide

       

        glFlush();
        SDL_GL_SwapBuffers();

        stop_time = SDL_GetTicks();
        if ((stop_time - last_time) < time_per_frame)
        {
            SDL_Delay(time_per_frame - (stop_time - last_time));
        }

    }
}


dimanche 5 novembre 2006 à 10:42:00 | Re : probleme de vecteur static

hisoka56

bon personne ne voit d'ou vient le probleme?
J'ai essayé de triturrer ça dans tous les sens, par exemple en
mettant static vector<model> mod; sirectement dans le namespace ml et en l'appellant par
ml::mod... mais le resultat est le même, après l'initialisation le vecteur est correctement rempli mais plus tard lorsque j'en ai besoin, ses compostans sont inexistants.
lundi 6 novembre 2006 à 20:14:02 | Re : probleme de vecteur static

KeniiyK

Membre Club
Réponse acceptée !

Salut, y a un truc que je n'ai pas vu (mais peut etre que cela y est ...), c'est la declaration dans le cpp de

vector<model> model_loader::mod;

KeniiyK



Cette discussion est classée dans : int, loader, vector, model, struct


Répondre à ce message

Sujets en rapport avec ce message

probleme SKD [ par Arnaud16022 ] helloje suis sur VC6 et je voudrais charger des modeles md2 sous openGL. que faire? Évidemment un petit tour chez Digiben!! (bon je sais qu'il existe Passage par adresse d'un tableau de structures. [ par alekine ] Bonjour, j'ai un problème pour passer par adresse un tableau de structures. Voilà mon code:#include #define L_MAX 2struct point //la structure d'un p compression de huffman urgent svp [ par bundy_boy ] Bonjour voila, j'essai d'implémenter la compression de huffman dans un archiveur (qui lui fonctionne très bien), j'ai testé deux algorithmes de huffma PB compilation de socket [ par dhylde ] Bonjour a tous, j'ai un petit souci de compilation (j'ai du manqué l'inclusion d'une Librairy). Bref je me prend la tete depuis ce matin. Je suis sous Probleme de reception dans un serveur visual C++ pour windows [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi.voici les source du client et du serveurLe Serveur pb de retour( du tableau) de ma fonction [ par airwann ] bonjour,j ai un problème comment dois je modifier l'entête de ma fonction pour recupérer le tableau de structure 3 d alloué dynamiquementmerci d avanc Passer une struct dans une shared memory POSIX [ par cobbleguard ] Salut,J'ai 3 processus indépendants qui communiquent.PS1 reçoit des valeurs saisies au clavier, les met dans une structure et les envoie au PS2 via un Problème pour compiler du c [ par flox39 ] Salut à tous Je suis en galère avec du code qu'on m'a passé je n'arrive pas a le compilerl'erreur c error C2447: missing function header (old-style fo Vector, template et iterator ... [ par Alela ] Bonjour,j'aimerais faire ceci :#include #include #include #include using namespace std;template void Afficher(vector&l pb avec des structures [ par tomalille ] Bonjour, j'ai un probleme avec l'utilisation de structure. Je declare mon struct en globale, je l'utilise ensuite dans une procedure qui remplit un ta


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales