Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 3


|
Conversation : Inversion d'un tableau |
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne |
Salut, Voilà dans mon programme il se passe quelque chose de bizarre et je n'arrive pas à en déceler l'origine. En faite j'ai un fichier texte avec des "matrices" enregistrées à l'intérieure donc je les lit et je stocke les valeurs dans des vectors je les envoie à ma fonction et là quand il doit afficher il inverse tout mais je comprend vraiment pas pourquoi est-ce que ça vient de ma fonction d'affichage, d'enregistrement ou de chargement des images ? Donc imaginons la matrice comme ceci je l'enregistre: 3 3 2 2 2 1 1 1 1 1 1
A la ré ouverture j'obtiens ça : 3 3 2 2 2 1 1 1 1 1 1
et à l'affichage ceci: 3 3 2 1 1 2 1 1 2 1 1 Si là je la ré enregistre alors elle va s'enregistrer au format de l'affichage etc'est pas normale.
Je vous met les fonctions si vous avez le courage de les lire moi j'ai pas trouver l'erreur.
Fonctions de sauvegarde et d'ouverture :
Code wxWidgets: void EditeurApp::fiOuvrir(wxCommandEvent& WXUNUSED(event)) { std::ifstream fichier("map.txt"); if(fichier) { VecteurT Couche1; VecteurT Couche2; std::vector < PosDecors > decors; std::string chaine; int num,nbX,nbY,nbDec; fichier >> chaine; nbX = atoi(chaine.c_str()); fichier >> chaine; nbY = atoi(chaine.c_str()); Couche1.resize(nbX,vectY(nbY,-1)); Couche2.resize(nbX,vectY(nbY,-1)); for(int i=0;i<nbX;i++) { for(int j=0;j<nbY;j++) { fichier >> chaine; num = atoi(chaine.c_str()); Couche1[i][j] = num; } } for(int i=0;i<nbX;i++) { for(int j=0;j<nbY;j++) { fichier >> chaine; num = atoi(chaine.c_str()); Couche2[i][j] = num; } } fichier.close(); x = nbX; y = nbY; h = nbX*SolX; w = nbY*SolY; for(int i=0;i<nbX;i++) { for(int j=0;j<nbY;j++) { std::cout << Couche1[i][j] << " "; } std::cout << std::endl; } OuvrirCarte(h,w,x,y,Couche1,Couche2,decors); } else std::cout << "Impossible d'ouvrir le fichier !" << std::endl; } void EditeurApp::fiSauver(wxCommandEvent& WXUNUSED(event)) { wxString testNum; SetStatusText(_T("Sauvegarde en cours ..."),0); std::string result; Save.Open(_T("map.txt"),wxFile::write); VecteurT couche; testNum << x; Save.Write(testNum); testNum.Clear(); Save.Write(_T(" ")); testNum << y; Save.Write(testNum); testNum.Clear(); for(int i=1;i<=2;i++) { couche = m_affCarte->GetSave(i); Save.Write(_T("\r\n")); for(int i=0;i<x;i++) { for(int j=0;j<y;j++) { testNum << couche[j][i]; Save.Write(testNum); Save.Write(_T(" ")); testNum.Clear(); } Save.Write(_T("\r\n")); } } Save.Close(); SetStatusText(_T("Sauvegarde termin\351e"),0); }
Et la fonction d'affichage :
Code wxWidgets: void RpgScrollFrame::OnPaint(wxPaintEvent& event) { wxPaintDC pDc(this); int xT,yT; int Tx,Ty; int x,y; int yInd, xInd; int xPos, yPos; wxBitmap imgBmp; GetViewStart(&xT,&yT); GetParent()->GetVirtualSize(&Tx,&Ty); xT *= SolX; yT *= SolY; for(int i = 0;i < 2;i++) { y = yT; while (y < (yT + Ty)) { x = xT; yPos = (y - (y % SolY)); yInd = yPos / SolY; yPos -= yT; while(x < (xT + Tx)) { xPos = (x - (x % SolX)); //sert à trouver la position 'virtuel' xInd = xPos / SolX; //permet de trouver l'indice dans le vector xPos -= xT; //position pour l'affichage if(xInd >= 0 && xInd < m_nbCaseLar) { if(yInd >= 0 && yInd < m_nbCaseHau) { if(i == 0 && (Couche1[xInd][yInd] >= 0)) pDc.DrawBitmap(TabTerrains.GetTab(Couche1[xInd][yInd]),xPos,yPos,true); if(i == 1 && (Couche2[xInd][yInd] >= 0)) pDc.DrawBitmap(TabTerrains.GetTab(Couche2[xInd][yInd]),xPos,yPos,true); } } x += SolX; } y += SolY; } } }
Merci pour votre aide ++
Dernière modification par Warzer (29-02-2008 17:27:52)
|
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 544
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Heu par hasard ce que tu utilises n'utilises pas une pile FIFO?
|
Itérer est humain, récurser est divin
|
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne |
Euh non mais en faite je vient de trouver à l'instant je parcourait pas le tableau dans le bon sens il fallait que je parcours toute la colonne et ensuite je passait à la suivante j'en ai même profité pour optimiser mon code tellement je l'ai regardé ^^
|
|
blend (Membre)
Inscrit le : 07-10-2007
Messages: 129
Snippets: 0
Tutoriels: 0
Hors ligne |
La meilleure optimisation que tu peux faire à mon avis, si tu as des matrices rectangulaires, serait surtout d'avoir un vecteur unidimensionnel au lieu de bidimensionnel, le temps d'accès à un élément sera bien amélioré qui n'est pas du tout gratuit contrairement avec les tableaux normaux.
|
Rien ne vaut la 2D pour éviter les problèmes de profondeur.
|
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne |
Oui mais je pense que ce serai un peu plus compliqué à gérer. Enfin faut voir t'aurai une idée de comment faire ?
|
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 544
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Les coordonnés en une dimension sont faciles a calculer : x + y * taille_x
|
Itérer est humain, récurser est divin
|
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne |
Oui mais imagine tu fait un truc de 100*100 ton vecteur va faire 10,000 case ce qui est assez enorme et quand tu doit afficher il faut trouver le bon indice parce que c'est pas terrible de parcourir les 10000 cases du tableau.
Dernière modification par Warzer (01-03-2008 15:40:11)
|
|
blend (Membre)
Inscrit le : 07-10-2007
Messages: 129
Snippets: 0
Tutoriels: 0
Hors ligne |
Je crois colonne * tailleColonne + offset Après, tu peux aller voir http:/jeux.developpez.com/faq/matquat/ pour qqch de complet^^ En fait pareil que xxlTux (j'avais pas lu) ^^...
Dernière modification par blend (01-03-2008 16:02:08)
|
Rien ne vaut la 2D pour éviter les problèmes de profondeur.
|
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne |
Ok merci je vais allé faire un tour. Bon ben voilà j'ai tout refait avec des vecteurs à une dimension ça marche tout aussi bien et j'ai plus les 19 Warning à la c** des vecteurs 2D ^^
Dernière modification par Warzer (01-03-2008 18:06:24)
|
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 544
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Blend pas bien de pas lire les posts precedent XD
|
Itérer est humain, récurser est divin
|
|