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 stockage


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Par défaut Problème stockage
    Bonjour

    Je Suis nouvelle sur le forum. et j'aurais aimé solliciter votre aide car je suis au bord du précipice. Je te trouve pas de solution.
    Suis une débutante du C++ et je rame un peu.

    VOilà dans le cadre de mon stage et de mon programme je dois récupérer des coordonnées de vertex et de faces dans un fichier obj.
    Dans mon inexpérience, le code que j'ai écris récupére les données du fichier et stocke chaque point comme un objet d'une classe POINT3D avec comme attributs : identifiant, x,y et Z;

    le même principe vaut pour les faces.

    après je procède à des calculs.

    Le Hic c'est que jusqu'ici je testais avec un misérable et minime fichier obj et ca tournait . mais dès que je teste avec des fichiers lourds (des millions de points et des millions de faces) ca ne va plus du tout.

    Mon erreur c'est d'avoir stocké tout cela dans des classes mais je ne sais pas comment faire autrement

    Quelqu'un peut m'aider.?

    parce que suis censée finir mon stage bientôt, trop bientôt

    Mais quand je tes

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Ce n'est pas une erreur. Un objet de trois entiers ne va pas couter plus cher qu'une structure de trois entiers ou même trois entiers. C'est exactement le même poids.
    Ce qui faut voir ce sont tes algos et les structures utilisées pour organiser tes ensembles de données.

    Et là difficile de parler dans le vide. De plus, de ce que j'en sais, ce n'est pas un domaine connu pour être simple à optimiser quand le volume de données augmente. Ils n'ont pas d'expérience sur le sujet dans ta boite ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Par défaut
    Leproblème c'est que dans ma boîte il n'y pas d'informaticien. Ce qui finalement est une très mauvaise chose.

    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
    char lettre;
    float x, y, z;
    FILE *pfichier_obj;
     
    int R,V,B;
    int f1= 0,f2=0,f3=0, i =0, j=0, f6= 0,f4=0,f5=0;
    // int f1= 0,f3=0, i =0, j=0, f5=0;
     
    pfichier_obj = fopen("fichier_mesh.obj","r");
     
    if(!pfichier_obj)
    {
        // MessageBox(NULL,"Erreur Fichier OBJ","Gestion Erreur",MB_OK);
        cout << "Chargement du Fichier échoué"<< endl;
        return 1;
    }
     
    while(!feof(pfichier_obj))
    {
        // cout << "i = " i<< endl;
     
        lettre = fgetc(pfichier_obj);
     
        switch(lettre)
        {
            default:
                break;
     
            case 'v':
                lettre = fgetc(pfichier_obj);
     
                switch(lettre)
                {
                    default:
                        break;
     
                    case ' ':
                        fscanf(pfichier_obj," %f %f %f %i %i %i   \0",&x,&y,&z,&R,&V,&B);
                        // fscanf(pfichier_obj," %f %f %f    \0",&x,&y,&z);
     
                        cPoint3D sommet ; // création de l'objet temporaire//
                        i = i+1;
                        std::cout<<"i="<<i<<std::endl ;
                        sommet.IDs = i;
                        sommet.X = x;
                        sommet.Y = y;
                        sommet.Z = z;
                        VarGlob::POINT3D.pAJOUT_ELEMENT(sommet); 
                        break;
                }
                break;
     
            case 'f':
                fscanf(pfichier_obj," %i // %i %i // %i  %i // %i   \0",&f1,&f2,&f3,&f4,&f5,&f6);
                // fscanf(pfichier_obj," %i %i %i   \0",&f1,&f3, &f5);
                cTriangle3D triangle;
                j = j+1;
                std::cout<<"j="<<j<<std::endl ;
                triangle.IDt = j;
                triangle.S1 = f1;
                triangle.S2 = f3;
                triangle.S3 = f5;
                VarGlob::TRIANGLE3D.pAJOUT_ELEMENT(triangle);
                break;
        }
    }
     
    fclose(pfichier_obj);
    VarGlob::POINT3D.pAFFICHE_TABLE();
    VarGlob::TRIANGLE3D.pAFFICHE_TABLE();
     
    return 0;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    cTriangle3D::cTriangle3D(unsigned int IDt, unsigned int S1, unsigned int S2, unsigned int S3) :
       Taille ( 65536*sizeof(char) + 2*sizeof(unsigned int) ),
       NomObj("cTriangle3D")
    {
       this->IDt = IDt;
       this->S1 = S1;
       this->S2 = S2;
       this->S3 = S3;
    }
     
    cTriangle3D::~cTriangle3D()
    {
     
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Commence par lire les règles:
    http://club.developpez.com/regles/
    et mettre plus de soin à la rédaction de tes messages (balises codes, moins de sauts de lignes...).
    Parcours la FAQ, les cours...

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Par défaut
    Désolée pour la formulation et la forme de mes posts!

    D'autre part, si j'ai fait appel à ce forum, c'est que justement j'ai passé plusieurs heures à tenter d'éplucher tutoriaux, cours, etc et que finalement, du fait de mon inexpérience ou autres (...) je n'ai pooint trouvé la solution!!
    D'où l'idée de poster sur ce forum....
    Merci quand même

  6. #6
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    J'ai donné à ton code une mise en page plus lisible.

    A l'avenir, pense :

    - Que tu peux éditer tes posts si tu as un ajout ou une correction à faire
    - A le faire toi-même


    Ensuite pour ton problème, quelques remarques :

    - Ca ne changera pas grand chose, mais puisque ta classe triangle possède un constructeur pourquoi ne pas l'utiliser ?
    - Puisque tu codes en C++, utilise les flux (fstream) ainsi que la surcharge d'opérateur >>, le code n'en sera que plus clair.
    - Comment sont stockés tes triangles ?
    - Que signifie leur donnée membre Taille ?
    - C'est quoi toutes ces variables globales ?
    - Il faudrait aussi voir le format de tes fichiers (un petit exemple).

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Par défaut
    Merci pour tes conseils, que j'ai suivis.

    J'ai épluché de nouveau la doc que j'avais pu accumuler et décidé de ne pas céder à l'abattement; résultat, c'est bon je l'ai : merci mes amis les vector.


  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Par défaut
    Voilà ce que ca donne. Merci encore


    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
     
     
    class cPoint3D 
     
    {
    public : 
    	int IDs;
    	float  X;
    	float  Y; 
    	float  Z;
    };
     
    class cTriangle3D 
     
    {
    public : 
    	int IDt;
    	int  S1;
    	int S2; 
    	int  S3;
    };
     
     
    vector <cPoint3D> Lptot3D;
    vector <cTriangle3D> LFace3D;
     
     
    pfichier_obj = fopen("fichier_mesh.obj","r");
     
    if(!pfichier_obj)
    {
     
        cout << "Chargement du Fichier échoué"<< endl;
       return 1;
     
    }
     
    while(!feof(pfichier_obj))
    {
     
         lettre = fgetc(pfichier_obj);			
        switch(lettre)
       {
           default:					
           break;
     
          case 'v':
          lettre = fgetc(pfichier_obj);
     
          switch(lettre)
         {
    	default:
                    break;
                    case ' ':
           fscanf(pfichier_obj," %f %f %f %i %i %i   \0",&xt,&yt,&zt,&R,&V,&B);
           i2 = i2+1;
     
          sommet.IDs = i2;				
          sommet.X = x;
          sommet.Y = y;
          sommet.Z = z;
          Lptot3D.push_back(sommet);
          break;
     
         }
     
        break;
     
         case 'f':
       fscanf(pfichier_obj," %i // %i %i // %i  %i // %i    \0",&f1,&f2,&f3,&f4,&f5,&f6);
     
         j2 = j2+1;
         triangle.IDt = j2;
         triangle.S1 = f1;
         triangle.S2 = f3;
         triangle.S3 = f5;
         LFace3D.push_back(triangle);
     
         break;
     
     
         }
    }
     
         fclose(pfichier_obj);

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Par défaut
    Tu es obligé de tous stocker en même temps? Parce que sinon tu peux choisir de ne traiter qu'un partie de ton fichier à la fois (quite à garder en mémoire les résultats temporaires par ex)
    Sinon, comme l'a dit Luc Hermitte, c'est plus un problème de structure de données que de programmation pure.

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    En passant aux flux C++, et en écrivant les opérateurs d'extraction depuis les flux, ton code gagnera en simplicité et facilité de maintenance. Ne jamais hésiter à faire des fonctions pour réduire une fonction à moins de 15 lignes.

    C'est faux en C++ (avec le flux), et je crois bien que cela l'est également en C : il ne faut jamais faire une lecture tant que non eof. (FAQ!)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Problème stockage (STORE CSV->QVD)
    Par Invité dans le forum QlikView
    Réponses: 2
    Dernier message: 26/11/2014, 08h46
  2. Problème Stockage de données
    Par MrAd11 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 28/08/2012, 14h56
  3. Problème stockage de fichier dans tableau
    Par Youry dans le forum Débuter
    Réponses: 7
    Dernier message: 03/06/2009, 17h28
  4. [Débutant] Problème stockage et condition
    Par thtghgh dans le forum MATLAB
    Réponses: 25
    Dernier message: 22/05/2009, 15h04
  5. Probléme stockage inventaire
    Par Raziel abel dans le forum Modélisation
    Réponses: 4
    Dernier message: 28/01/2009, 23h34

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