Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.05.2013, 16:48

Vektor in anderen Vektor einfügen(klappt auf lappi, aber nicht aufm pc)

Hey Leute

Habe gestern eine Funktion geschrieben, wo ich zwei Vektoren an eine Funktion übergebe und diese füllen lassen möchte.

Das problem ist, auf meinem Lappi klappt es ohne probleme.

Bei meinem Pc wird nur 1 Zeile oder garkeine hineingeschrieben



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
       void CMap::ChoiceMap   (vector<vector <int> > *Tile, vector<vector <int> > *Colli)
       {

        //Daten zu TileManager
        for(unsigned int i=0; i<MaxMapHeight; i++)
        {
            vector<int>  Zeile;
            vector<int> MyColZeile;
            for(unsigned int j=0; j<MaxMapWidth; j++)
            {
                MyColZeile.push_back(Collision[i][j]);
                Zeile.push_back(Karte[i][j]);

                cout<< MyColZeile.size() << endl;
            }
            Colli->push_back(MyColZeile);
            Tile->push_back(Zeile);

        }


       }



Ich hoffe ihr könnt mir helfen

Mfg Leri

2

06.05.2013, 16:57

Habe es mir gerade nochmal angeschaut, er trägt wohl die erste Zeile komplett ein und dann nichts mehr.

kann Tile[0][2].size() noch abfragen.

Die Vektoren die das ganze übertragen sind komplett gefüllt, an dennen liegts also nicht

3

06.05.2013, 17:59

Vielleicht ein Speicherzugriffsfehler bei Collision oder Karte? Du könntest at() statt [] benutzen, dann bekommst du eine Exception, falls was schief läuft.
http://en.cppreference.com/w/cpp/container/vector/at

Vielleicht sind auch die Zeiger auf die Vektoren Müll, würdest du Referenzen übergeben, würde das nicht so leicht passieren.
Lieber dumm fragen, als dumm bleiben!

4

06.05.2013, 18:15

also der Vektor stimmt jetzt, ist jetzt in der einen klasse mit den werten gefüllt worden.

Allerdings, habe ich noch ein problem, er lädt die Tiles nicht richtig


Er soll für jede Nummer ein Tile erstellen.

Größe soll 768 sein, er spuckt aber nur 3 Tiles aus.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
for(unsigned int i=0; i<m_MapHeight; i++)
    {
        for(unsigned int j=0; j<m_MapWidth; j++)
        {
            CTile Tile;
            Tile.SetTileNumber(m_LTiles[i][j],j*50,i*50);
            Tile.SetTileCollision(m_LCollision[i][j]);
            m_Tiles.push_back(Tile);

        }


    }


der Vektor ist mit den richtigen Daten gefüllt, habs extra per cout überprüft.

Ich verzweifle echt langsam, aufm lappi klappt das teil 100%

5

06.05.2013, 18:34

Bin grad auf ne echt schöne entdeckung gestoßen.

C-/C++-Quelltext

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
                          freopen( "CON", "wt", stdout );
freopen( "CON", "wt", stderr );




for(unsigned int i=0; i<m_MapHeight; i++)
    {
        for(unsigned int j=0; j<m_MapWidth; j++)
        {
            CTile Tile;
            Tile.SetTileNumber(m_LTiles[i][j],j*50,i*50);
            Tile.SetTileCollision(m_LCollision[i][j]);
            m_Tiles.push_back(Tile);

        }


    }


for(unsigned int o=0; o<m_MapHeight; o++)
    {
        for(unsigned int t=0; t<m_MapWidth; t++)
        {
          cout <<m_LTiles[o][t];

        }

        cout << endl;
    }
LifeTiles=m_Tiles.size();
cout << LifeTiles << endl;





Lasse ich die untere Schleife vor der anderen laufen, gibt der Vektor mir alles richtig aus.

Lasse ich ihn wie hier abgebildet als zweites durchgehen, gibt er mir wirre Zahlen aus.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

06.05.2013, 18:36

Spontan würde ich jetzt das Stichwort Copy Constructor in den Raum werfen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

7

06.05.2013, 18:38

nur so nebenbei, ich hab ja bei allem jetzt soweit unsigned int verwendet, übernehme ich das auch in den Tiles funktioniert es, würde nur zu gerne mal wissen warum.

8

06.05.2013, 19:51

Nun, wahrscheinlich handelt es sich um undefiniertes Verhalten. Du machst irgendwas ziemlich falsch und das Ergebnis davon ist nicht spezifiziert, also hast du mal Glück und es scheint zu funktionieren und mal Pech und dein Programm macht den größten Mist. Das kann dann die absurdesten Auswirkungen haben, unter anderem, dass es auf einem PC läuft und auf dem anderen nicht. Ich hatte schonmal so Späße, dass es nicht lief, ich danach die exe umbenannt habe, es dann auf einmal wieder ging und nach einem erneuten umbenennen wieder nicht mehr.

Debuggen wirst du selber müssen, als Anfänger wird das aber kniffelig. Da muss man dann eben durch. Natürlich kann man solche Fehler unwahrscheinlicher machen, indem man sauberer programmiert. Wieso speicherst du beispielsweise Mapheight in einer extra Variable und benutzt nicht einfach vector.size()? Im letzteren Fall ist nämlich ein Speicherzugriffsfehler quasi ausgeschlossen, während es im ersten Fall sehr leicht geschehen kann, das du den Vektor änderst, Mapheight aber nicht. Oder umgekehrt.

Das es mit unsigned int funktioniert ist vermutlich pures Glück, der Fehler wird immer noch drin sein, und es ist sehr gut möglich, dass er sich plötzlich auch wieder bemerkbar macht, wenn du z.b. einen Teil am Programm änderst, der mit der Map gar nichts zu tun hat.
Lieber dumm fragen, als dumm bleiben!

9

06.05.2013, 20:23

habe das ganze problem jetzt erstmal gelöst, indem ich die direkte datei ausgelesen hab, und die unsigned int direkt int normal int gecastet habe.

Klar es ist sozusagen, mein erstes größeres projekt.

Ich denke da bleiben solche fehler nicht aus, aber es macht mir auch recht viel spaß, die fehler selbst zu finden, wenn es denn geht und dadurch zu lernen.

Wie gesagt, habe nochmal drübergeschaut und ein paar sachen abgeändert.

Die Version habe ich jetzt auf 3 Pcs getestet, einmal Windows 7, xp und noch auf meiner Schwester ihren lappi, der mit Vista läuft.

10

06.05.2013, 20:28

was mich jetzt noch interessieren würde, ich habe in meiner game cpp jetzt handel auf alle momentan aktiven instanzen z.b die Sprit klasse, TileManager etc.


funktioniert so, habe in meiner Game klasse jeweils einen Pointer der per Funktion Init der CGame Klasse übergeben wird, und da dann letzendlich im Pointer gespeichert wird.

Frage für mich ist, ob das halt ne gute Variante ist oder halt nicht.

Hier mal die Klasse CGame

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef GAME_HPP
#define GAME_HPP
#include "EManiaLX/Framework.hpp"
#include "Map.hpp"
#include "EManiaLX/LXTileManager.hpp"
#include "EManiaLX/CTileSprite.hpp"

class CGame
{
public:
        void Init(CMap *Map, CTMng *TileMng, CTileSprite *CTSprite ); // Handling auf alle wichtigen Spielklassen
        void GenerateHandle(); // Generiert Spielklassen
        void RunGame(); //Hauptschleife des Spieles
        void ExecutionEvents();

private:
        CMap *MyMap; //Handling auf Mapload
        CTMng *MyTileMng;//Handling auf Tilemanager
        CTileSprite *MyTileSprite;//Handling auf Sprites
        bool MyGameRun;

};
#endif // GAME_HPP



C-/C++-Quelltext

1
2
3
4
5
6
7
8
void CGame::Init(CMap *Map, CTMng *TileMng, CTileSprite *CTSprite )
{
MyMap = Map;
MyTileMng = TileMng;
MyTileSprite = CTSprite;
GenerateHandle();
MyGameRun=true;
}//Init




Für mich ist das eigentlich recht praktisch, weil ich so die einzelnen Funktionen für das Spiel direkt über die Game Klasse ansprechen kann

meine Momentane Run Schleife für das Game schaut da schon recht gut aus.


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CGame::RunGame()
{
    while(MyGameRun==true)
    {
        ExecutionEvents();
        g_pFramework->Update();
        MyTileMng->Render();
        g_pFramework->Flip();




    }
}//RunGame

Werbeanzeige