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

29.03.2012, 20:30

Vektoren

Hallo!
Mag sein, dass ich gerade auf dem Schlacuh stehen mag, aber warum geht das nicht:

C-/C++-Quelltext

1
m_Base[m_Base.size()-i]>vbi.GetVec()[vbi.GetVec().size()-i]

Wobei i jede Runde um 1 inkrementiert wird. Stimmt die Bedingung, so wird sofort via return true 'abgebrochen'.
Also warum bekomme ich da gleich beim ersten Durchgang "vector subscript out of range"?
Dabei scheint es egal was i ist. Normalerweise beträgt i soviel wie der Wert 0.

MfG
Check

2

29.03.2012, 20:46

C-/C++-Quelltext

1
m_Base[m_Base.size()-i-1]>vbi.GetVec()[vbi.GetVec().size()-i-1]

Zitat

Basically, there are only 10 types of people in the world. Those who know binary, and those who don't.

3

29.03.2012, 20:52

Eben nicht. Funktioniert nicht. ;)
Gleiche Meldung.


MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (29.03.2012, 21:00)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

29.03.2012, 21:11

Was hast du denn vor? Du verwendest i so als würdest du ein Schachbrett von unten rechts nach oben links durchlaufen wollen.
Ich denke mal du willst eigentlich zwei Zählervariablen benutzen?
Ausserdem macht der Teil in den Zweiten eckigen Klammern kein Sinn.

Willst du vielleicht soetwas?
m_Base[m_Base.size()-x-1]->vbi.GetVec()[m_Base[m_Base.size()-x-1]->vbi.GetVec().size()-y-1]

Ausserdem solltest du aufpassen, dass alle Vectoren in allen Elementen von m_Base nicht leer sind...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

29.03.2012, 21:16

vbi ist eine Klasse die einen Vektor mit GetVec holt. Der hat logisch eine andere Größe.
In den Vektoren-Elementen sind Integer gespeichert. ;)

MfG
Check

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
bool vbint::operator> (vbint vbi)
{
    for(int i=1; i!=0; ++i)
    {
        if(m_Base[m_Base.size()-i-1]>vbi.GetVec()[vbi.GetVec().size()-i-1])
            return true;
    }
    return false;   
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Checkmateing« (29.03.2012, 21:43)


Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

6

29.03.2012, 23:10

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
bool vbint::operator> (vbint vbi)
{
    for(int i=1; i!=0; ++i)
    {
        if(m_Base[m_Base.size()-i-1]>vbi.GetVec()[vbi.GetVec().size()-i-1])
            return true;
    }
    return false;   
}
Ähm. Du zählst hier i quasi ins Unendliche hoch. Irgendwann ist i größer als die Anzahl der Elemente deines Vectors, und dann wird der Index negativ, wodurch du diese Fehlermeldung erhälst.
Also so macht das Ganze eigentlich keinen Sinn, weil du nicht eine Zählervariable auf 2 Vectoren anwenden kannst, welche unterschiedliche Größen haben. Was genau willst du überhaupt prüfen? Du bräuchtest, wie NachoMan schon angedeutet hat, eine verschachtelte Schleife.

7

30.03.2012, 07:02

Genau deswegen schmiert es schon nach einem Durchgang ab.
Es sind übrigens nur relevante Bruchstücke.

MfG
Check

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

8

30.03.2012, 10:23

Naja, was möchtest du denn noch alles hören, bis du den anderen glaubst^^

Das sind vielleicht die relevanten Bruchstücke, mit denen du etwas anfangen kannst, aber wir können dir nicht sagen, wie es richtig aussehen muss, wenn man nicht weiß, was da überhaupt passieren soll. Grundsätzlich ist ja wie bereits gesagt da mehrfach der Wurm drin. Deine Schleife läuft endlos und gibt dir bei i >= size() des kleineren Vektors einen negativen Index was wohl auch zu deinem Fehler führen sollte.

Den Fehler zu finden ist doch grundsätzlich ganz einfach. Das geht nicht durch scharfes hinsehen, sondern indem du das Statement einfach mal in seine Bestandteile zerlegst (Index einzeln berechnen, dann mit temp. Variablen die Rückgabewerte der Funktionen speichern) und dann ganz simpel mit dem Debugger drüber gehst. Dann wirst du sicherlich gleich sehen, was falsch läuft. Grundsätzlich fallen mir da 3 Dinge ein:

- Index ist negativ
- einer der Vektoren ist leer
- Vektoren haben unterschiedliche Größen

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

30.03.2012, 14:18

Achso, das ist ein Vergleichsoperator. Ich dachte das wäre ein falsch abgeschriebener Zugriffsoperator. Dann ist eine verschachtelte Schleife doch nicht unbedingt notwendig.

Das nächste mal bitte Leerzeichen verwenden:

C-/C++-Quelltext

1
m_Base[m_Base.size()-i-1] > vbi.GetVec()[vbi.GetVec().size()-i-1]
ist eindeutiger ;)

Theoretisch läuft die Schleife 2³²-1 mal durch(integerüberlauf ;)). Du solltest dir also nochmal überlegen wie der Schleifenkopf aussehen müsste.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

10

30.03.2012, 16:03

Wäre nur schön wenn mir wer plausibel erklären würde, weshalb es bereits bei Runde Eins, ein Dank geht an den Debugger, dazu kommt.
Theoretisch sollte es doch immerhin beim ersten Mal Durchlauf dann funktionieren.
Das Ganze soll eine Klasse für große Zahlen werden. xD
Hatte es mal so versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
bool vbint::operator> (vbint vbi)
{
    for(int i=1; i!=0;)
    {
        if(m_Base[m_Base.size()-i] > vbi.GetVec()[vbi.GetVec().size()-i])
            return true;
        else
            ++i;
    }
    return false;   
}

Warum müsste man nochmal 1 abziehen, wenn i schon 1 ist? :hmm:
Es sollte vom denken doch auch eigentlich statt 1 eher 0 sein, oder? Naja egal erst einmal.
@SP3iky: Ich glaube, sobald mir da einer auch die Hintergründe erklären kann. Letztlich probiere ich ~95% was mir hier gezeigt wird, je nach Qualität eben, aus.
Achja: Beide Vektoren sind mit 5 Integer-Variablen bestückt.

MfG
Check

PS: Wäre das bei einem normalem Integer nicht 32.767?

Werbeanzeige