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

Korowai

unregistriert

1

25.06.2015, 06:15

Vektoren

Guten Morgen,

ich habe folgendes Problem. Ich habe einen Testcode für Vektoren erstellt.

Der Compiler meckert nicht, aber das Prog stürzt ab. Mir scheint, ich habe bei der Deklarierung irgendetwas nicht beachtet mit dem Raum des Vektors.

Hier der Code:

Quellcode

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
#include <iostream>
#include <conio.h>
#include <iterator>
#include <list>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <string>
using namespace std;

int Schuerferpreis=231300;
int Preis=50000;

int main()
{
    
vector< vector<int> > einsHSchuerfer(12);
//vector<int>::iterator iHSchuerfer;
vector< vector<int> > einsMSchuerfer(12);
//vector<int>::iterator iMSchuerfer;
vector< vector<int> > einsSSchuerfer(12);
//vector<int>::iterator iSSchuerfer;
//vector<string> vNameSchuerfer(0);
//vNameSchuerfer[0] = "Startschuerfer";
// vector<string>::iterator iNameSchuerfer;
//vector< vector<int> >vSpieler(2);
//vector<int>::iterator ivSpieler;
const int AnzahlSchuerfer=1;
int PlecsSpieler1=1000000;
einsHSchuerfer[0] [0]=4; //0=Antrieb
einsHSchuerfer[0] [1]=6; //1=Energie
einsHSchuerfer[0] [2]=4; //2=Steuerung
einsHSchuerfer[0] [3]=10; //Lagerpunkte
einsHSchuerfer[0] [4]=100; //Lagerienheitspunkte
einsHSchuerfer[0] [5]=5; //Scan
einsHSchuerfer[0] [6]=10;//Förder
einsHSchuerfer[0] [7]=4;//Schilde
einsHSchuerfer[0] [8]=5;//Panzer
einsHSchuerfer[0] [9]=3;//Waffen
einsHSchuerfer[0] [10]=1;//Hyperdrive
einsHSchuerfer[0] [11]=725700;//Höchstpreis
einsHSchuerfer[0] [12]=0;//belegte LAgerpunkte


    for (int i=0; i<13; i++)
    {
        cout << /*vNameSchuerfer[0] <<*/ " Wert "<< i+1 << " " << einsHSchuerfer[0] [i] << endl;
    }

    return 0;
}


Sieht jemand den Fehler?

Danke

Lares

1x Contest-Sieger

  • Private Nachricht senden

2

25.06.2015, 06:23

Du greifst an zwei Stellen im Code auf Elemente zu die nicht existieren.
Überlege was du im Konstruktor übergibst! Der Vector kann 12 Elemente fassen, also gehen die Indices von 0-11.
D.h sowohl deine Wertezuweisung, als auch deine anschließende for-Schleife sind fehlerhaft, weil du da auf Element [0][12] zugreifst.

Edit: Ne mom der Fehler wird tatsächlich durch einen anderen maskiert, da du einen mehrdimensionalen Vector konstruierst. "einsHSchuerfer" hat 12 Elemente in der 1. Dimension, also [0-11][?].

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Lares« (25.06.2015, 06:28)


Korowai

unregistriert

3

25.06.2015, 06:31

Hi,

ich habe den Raum für 13 Elemente erhöht.

Leider dasselbe Ergebnis.

Muss ich die zweite DImension des Vektors zunächst eigenständig deklarieren?

Quellcode

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
int main()
{

vector< vector<int> > einsHSchuerfer(14);
//vector<int>::iterator iHSchuerfer;
vector< vector<int> > einsMSchuerfer(14);
//vector<int>::iterator iMSchuerfer;
vector< vector<int> > einsSSchuerfer(14);
//vector<int>::iterator iSSchuerfer;
//vector<string> vNameSchuerfer(0);
//vNameSchuerfer[0] = "Startschuerfer";
// vector<string>::iterator iNameSchuerfer;
//vector< vector<int> >vSpieler(2);
//vector<int>::iterator ivSpieler;
const int AnzahlSchuerfer=1;
int PlecsSpieler1=1000000;
einsHSchuerfer[0] [0]=4; //0=Antrieb
einsHSchuerfer[0] [1]=6; //1=Energie
einsHSchuerfer[0] [2]=4; //2=Steuerung
einsHSchuerfer[0] [3]=10; //Lagerpunkte
einsHSchuerfer[0] [4]=100; //Lagerienheitspunkte
einsHSchuerfer[0] [5]=5; //Scan
einsHSchuerfer[0] [6]=10;//Förder
einsHSchuerfer[0] [7]=4;//Schilde
einsHSchuerfer[0] [8]=5;//Panzer
einsHSchuerfer[0] [9]=3;//Waffen
einsHSchuerfer[0] [10]=1;//Hyperdrive
einsHSchuerfer[0] [11]=725700;//Höchstpreis
einsHSchuerfer[0] [12]=0;//belegte LAgerpunkte


    for (int i=0; i<15; i++)
    {
        cout << /*vNameSchuerfer[0] <<*/ " Wert "<< i+1 << " " << einsHSchuerfer[0] [i] << endl;
    }

    return 0;
}

Korowai

unregistriert

4

25.06.2015, 06:34

Ach Moment,

so greife ich in der for sChleife auf einen Vektor zu, der nicht existiert.

Korowai

unregistriert

5

25.06.2015, 06:36

Ne,

geht auch nicht, wenn die for SChleife nur auf die vorhandenen 13 Elemente zugreift...

Lares

1x Contest-Sieger

  • Private Nachricht senden

6

25.06.2015, 06:43

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
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
#include <iostream>
#include <conio.h>
#include <iterator>
#include <list>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <string>
    using namespace std;

    int Schuerferpreis = 231300;
    int Preis = 50000;

    int main()
    {

        vector< vector<int> > einsHSchuerfer(12);
        //vector<int>::iterator iHSchuerfer;
    //  vector< vector<int> > einsMSchuerfer(12);
        //vector<int>::iterator iMSchuerfer;
    //  vector< vector<int> > einsSSchuerfer(12);
        //vector<int>::iterator iSSchuerfer;
        //vector<string> vNameSchuerfer(0);
        //vNameSchuerfer[0] = "Startschuerfer";
        // vector<string>::iterator iNameSchuerfer;
        //vector< vector<int> >vSpieler(2);
        //vector<int>::iterator ivSpieler;
        const int AnzahlSchuerfer = 1;
        int PlecsSpieler1 = 1000000;

                //wichtig!
        for (int i = 0; i<12; i++)
        {
            einsHSchuerfer[i].push_back(0);
        }


        einsHSchuerfer[0][0] = 4; //0=Antrieb
        einsHSchuerfer[1][0] = 6; //1=Energie
        einsHSchuerfer[2][0] = 4; //2=Steuerung
        einsHSchuerfer[3][0] = 10; //Lagerpunkte
        einsHSchuerfer[4][0] = 100; //Lagerienheitspunkte
        einsHSchuerfer[5][0] = 5; //Scan
        einsHSchuerfer[6][0] = 10;//Förder
        einsHSchuerfer[7][0] = 4;//Schilde
        einsHSchuerfer[8][0] = 5;//Panzer
        einsHSchuerfer[9][0] = 3;//Waffen
        einsHSchuerfer[10][0] = 1;//Hyperdrive
        einsHSchuerfer[11][0] = 725700;//Höchstpreis
        //einsHSchuerfer[12][0] = 0;//belegte LAgerpunkte


        for (int i = 0; i<12; i++)
        {
            cout << /*vNameSchuerfer[0] <<*/ " Wert " << i + 1 << " " << einsHSchuerfer[i][0] << endl;
        }

        std::cin.get();
        return 0;
    }


Der oben gezeigte Code kann auch umgekehrt werden, wichtig ist allerdings das push_back damit überhaupt erstmal was drinne ist, auf das du zugreifen kannst.

Besser du lässt die Mehrdimensionalität bleiben, da sie dir in diesem Beispiel nichts bringt!


Edit:
Um das ganze noch mal ausführlich zu erklären:
Ein mehrdimensionaler Vector ist etwas anderes als ein mehrdimensionales Array!
Ein Array hat n*m Plätze die bereits reserviert sind, auf die du also direkt nach Erstellen des Arrays zugreifen kannst.
Ein mehrdimensionaler Vector hingegen ist zunächst erst mal leer! Egal, welche Werte du eintragen möchtest, du musst zunächst einen Vector in den mehrdimensionalen Vector einfügen, damit -bildlich gesprochen- die zweite Dimension eingefügt wird.
Das ist denke ich, dass erste Verständnisproblem was du hattest.

Das zweite Problem ist wie schon angemerkt, der Unterschied zwischen der Größe eines Vektors und der Anzahl möglicher Indices. Ein Vector der Größe n hat Indices von 0 bis n-1. D.h. egal zu welchen Zeitpunkt du durch den Vector iterieren willst, du musst sicherstellen, dass du es nur zwischen diesen beiden Werten machst (Vector hat für dieses Problem Iterator und size()).

Von diesen Sachen abgesehen: Ein mehrdimensionaler Vector ist meistens nicht sinnvoll. Er fügt eine Komplexität hinzu die häufig nicht nötig ist, sowohl für den Programmierer, als auch für den Computer. Bei deinem Code hätte man z.B. die Integerwerte in Form eines Objekts einer Klasse oder Struct zusammenfügen können und dann lediglich einen Vector für KlasseX erstellen müssen. Oder man schreibt alle Int-Werte in einen Vector und findet dann mittels Index und Modulo-Operator (%) heraus, was der Int-Wert eigentlich repräsentiert.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Lares« (25.06.2015, 07:12)


Korowai

unregistriert

7

25.06.2015, 07:31

Hi. Danke.

Ich brauche den mehrdimensionalen Vektor später. Aber ich denke über die objekte in Vektoren nach...

Bis dann

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

25.06.2015, 08:07

Wenn du einen zweidimensionalen Vektor mit den Dimensionen w und h haben möchtest, kannst du ebenfalls einen eindimensionalen Vektor der Länge w * h anlegen. Um dann per x und y auf Elemente zuzugreifen kannst du den Index im Vektor per y * w + x berechnen. Das klappt nicht nur für Vektoren sondern ist unabhängig. Stell dir mal vor wie ein zweidimensionales Array im Speicher aussieht und wie der Compiler da von den beiden Koordinaten den Offset zum Startzeiger des Arrays bestimmt. Das ist im Prinzip das selbe. Am besten ist wenn man sich das mal versucht aufzumalen. Dann wird schnell klar warum das so funktioniert.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

9

25.06.2015, 08:21

Wie schon festgestellt hast du da einen Vektor von Vektoren von Ganzzahlen. Die inneren Vektoren werden in deinem Code _immer_ die gleiche Anzahl an Elementen haben und die Bedeutung der Elemente leitet sich aus ihrer Position ab.
Anhand dessen sollte man bereits darauf kommen, dass man eher keinen vector<int>, sondern eine eigene Datenstruktur (eine Klasse) verwenden sollte. Diese Klasse würde dann Felder für Antrieb, Energie, Steuerung, Lagerpunkt usw. definieren, welche über den entsprechenden Namen abgerufen werden können.
Solltest du bisher noch nichts über Objektorientierung gelesen haben, dann wäre es wahrscheinlich ein guter Zeitpunkt, damit anzufangen. ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Korowai

unregistriert

10

27.06.2015, 07:12

Danke für die Hilfe.

Ich glaube, dass ich um zweidimensionale Vektoren nicht herum komme. Eher sogar dreidimensionale.

Es soll drei SPieler geben, jeder SPieler eine veränderliche Anzahl von Fahrzeugen, die einzelnen Fahrzeuge mit veränderlichen Attributen:

Anzahl Schiff= Zugehörigkeit Spieler
Attribute (13 Stk)
Höchstwerte der Attribute
Spielwert der Attribute

Also Vektor Spieler. Vektor Schiff (mit STring für Name). Attribute
Dasselbe für die HÖchstwerte
Dann noch für die SPielwerte

Oder gibt es eine Möglichkeit, den Vektor der SChiffe mit den veränderbaren Attributen in ein Array Spieler zu packen?

Wie sähe da der COde aus?

Array Vektor Werte Schiffe | Höchstwerte Schiffe | Spielwerte Schiffe
Spieler 0 0.n.m | 0.n.k | 0.n.l

Spieler 1 1.n.m | 1.n.k | 1.n.l

Spieler 2 2.n.m | 2.n.k | 2.n.l

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Korowai« (27.06.2015, 07:21)


Werbeanzeige