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

idontknow

unregistriert

11

30.03.2012, 17:02

du kannst als Begrenzung der Schleife doch einfach "m_Base.size() > vbi.GetVec().size() ? m_Base.size() : vbi.GetVec().size()" verwenden und dann von 0 hochzählen? Abhängig davon was die "Logik" hinter dem Vergleichsoperator ist kannst du evtl. schon bei unterschiedlicher Größe abbrechen.. aber ich hab keine Ahnung was das geben soll von daher musst das du wissen.

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

12

30.03.2012, 18:14


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.

Da stimm ich dir zu. Der Tipp wurde dir gegeben, da man Schleifenvariablen doch meist mit 0 initialisiert und man das schnell übersieht, dass es bei dir nicht so ist.

@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.

Wie bereits gesagt, wir können nur mit dem arbeiten, was du uns anbietest. Wenn der Error sagt, dass du die Grenzen überschreitest, geht wohl irgendwas schief. Daher hatte ich vorgeschlagen mal zu schauen, wie der Index ist und ob die Vektoren wirklich alle so gefüllt sind, wie du dir das denkst. Irgendwo muss ja der Fehler sein.
PS: Wäre das bei einem normalem Integer nicht 32.767?
Das wäre bei einem 16-bit Integer. Standard auf normalen PCs ist 32-bit.

13

30.03.2012, 19:56

Keine Ahnung warum, ich habe nichts verändert, nur MVC++2010E war geschlossen, aber jetzt geht es. ö.o

MfG
Check

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

14

31.03.2012, 11:56

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.

Keine Ahnung warum, ich habe nichts verändert, nur MVC++2010E war geschlossen, aber jetzt geht es. ö.o

Die Schleife ist einfach vollkommen falsch. Wenn der Vektor leer ist, führst du die Schleife trotzdem immer mindestens einmal aus (tatsächlich bis zu unendlich oft, weil noch viel falscher, aber das wurde ja schon oft genug erwähnt), was für leere Vektoren unweigerlich in einer Zugriffsverletzung endet. Daher der Crash schon in Runde 1.

Als erstes muss in deine Schleife auf jeden Fall die Größe der beiden Vektoren einbezogen werden. Wenn wir mal davon ausgehen, dass die höchstwertige Ziffer jeweils am Ende des Vektors steht, und die höchstwertige Ziffer nie 0 ist, dann ist eine Zahl mit mehr Ziffern auf jeden Fall immer größer als eine Zahl mit weniger Ziffern. Nur wenn die Zahlen gleichlang sind, muss die Ziffernfolge tatsächlich verglichen werden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
if (m_Base.size() == vbi.size())
{
    // Laufe von 1 bis einschließlich size() beider Vektoren
    for(size_t i=1; i<=m_Base.size(); ++i)
    {
        // i ist immer mindestens 1 und maximal size()
        if(m_Base[m_Base.size()-i] > vbi.GetVec()[vbi.GetVec().size()-i])
            return true;
    }
}
// Wenn this länger, dann größer, wenn this kürzer, dann nicht größer, sonst nur größer wenn schon in Schleife return true
return (m_Base.size() > vbi.GetVec().size());


Es gibt keinen Grund, beim Zählen != zu verwenden, das hat praktisch immer nur Nachteile. Die Vergleichsoperatoren <, <=, > und >= sind wesentlich ausdrucksstärker und sollten somit zur Fehlervermeidung immer bevorzugt werden. Obige Schleife könnten wir beispielsweise mit != überhaupt nicht sinnvoll ausdrücken, ohne wild Einsen dazu zu addieren. Davon abgesehen schalten <, <=, > und >= Compileroptimierungen ein, die für != nicht existieren, aber das nur am Rande.

Jetzt solltest du dir noch überlegen, ob der Vergleich in der Schleife so stimmen kann. Wenn die Ziffer von this größer ist als die entsprechende Ziffer von vbi, dann ist this auf jeden Fall größer, soweit richtig. Wenn die Ziffern gleich sind, dann müssen die nächsten Ziffern weiter verglichen werden, soweit ebenfalls richtig. Wenn die Ziffer von this aber kleiner ist als die Ziffer von vbi, dann ist this AUF JEDEN FALL kleiner als vbi. Mit der aktuellen Bedingung hingegen würden in diesem Fall auch die nachfolgenden Ziffern verglichen, und wenn dort eine Ziffer von this größer wäre, würde true zurückgegeben, obwohl this ganz offensichtlich kleiner ist als vbi. Du musst also einen weiteren Fall einbauen, der ausschließt, dass vbi größer ist als this.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if (m_Base.size() == vbi.size())
{
    // Laufe von 1 bis einschließlich size() beider Vektoren
    for(size_t i=1; i<=m_Base.size(); ++i)
    {
        // i ist immer mindestens 1 und maximal size()
        if(m_Base[m_Base.size()-i] != vbi.GetVec()[vbi.GetVec().size()-i])
            // Ziffern unterscheiden sich, also entweder this > vbi, d.h. true, oder this < vbi, d.h. false
            return (m_Base[m_Base.size()-i] > vbi.GetVec()[vbi.GetVec().size()-i]);
    }
}
// Wenn this länger, dann größer, wenn this kürzer, dann nicht größer, sonst nur größer wenn schon in Schleife return true
return (m_Base.size() > vbi.GetVec().size());


Eine Sache, die mir jetzt noch Sorge bereitet, ist, dass du offensichtlich in deinem Code ziemlich viel kopierst. So wird zum Beispiel für JEDEN Aufruf deines Vergleichsoperators der übergebene Vektor vbi ERNEUT kopiert. Hier solltest du dich dringend mit Referenzen vertraut machen. Mit const vbint &vbi erhält dein Operator nur eine read-only Referenz auf den übergebenen Vektor, und sämtliche Kopieren fallen weg. Viel Schlimmer könnte es noch in der Schleife mit GetVec() aussehen. Je nachdem, was GetVec() zurückgibt, solltest du dort auch dringend auf Referenzen umsteigen.

Zuletzt ist dein Operator nicht const-korrekt. Wenn jemand auf die Idee kommt, deinen Operator auf zwei konstanten Vektoren auszuführen, bekommt er eine Fehlermeldung, obwohl dein Operator eigentlich den Vektor überhaupt nicht verändert. Hierzu musst du die Methode noch zusätzlich mit einem const nach der Parameterliste ergänzen. Zusammen genommen sähe der korrigierte Operator also wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool vbint::operator> (const vbint &vbi) const // Beachte: Referenz statt Kopie und zweimal const
{
    if (m_Base.size() == vbi.size())
    {
        // Laufe von 1 bis einschließlich size() beider Vektoren
        for(size_t i=1; i<=m_Base.size(); ++i)
        {
            // i ist immer mindestens 1 und maximal size()
            if(m_Base[m_Base.size()-i] != vbi.GetVec()[vbi.GetVec().size()-i])
                // Ziffern unterscheiden sich, also entweder this > vbi, d.h. true, oder this < vbi, d.h. false
                return (m_Base[m_Base.size()-i] > vbi.GetVec()[vbi.GetVec().size()-i]);
        }
    }
    // Wenn this länger, dann größer, wenn this kürzer, dann nicht größer, sonst nur größer wenn schon in Schleife return true
    return (m_Base.size() > vbi.GetVec().size());   
}
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CodingCat« (31.03.2012, 12:02)


15

31.03.2012, 14:21

Wenn der Vektor leer wäre.
Alles was du schriebst passt nicht in mein Konzept. Warum antwortest du eigentlich noch? Es funktioniert doch.
Der Code stimmt auch nicht (mehr) überein.
Trotzdem erhältst du ein Danke von jedem der über eine Suchmaschine nun sein Problem lösen konnte.

MfG
Check

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

16

31.03.2012, 15:10

Warum so unhöflich? Das sind alles wichtige Punkte die Cat da angesprochen hat. Schließlich sind wir in einem Forum und von Wissen anderer kann man immer profitieren. Zumal das wirklich tolle Tipps sind: Konstante Referenzen statt Call-by-Value, <=,... verwenden statt != weil dann möglicherweise der Compiler die Schleife ausrollt usw. Ich denke nicht das Cat dich bloßstellen wollte oder ähnliches. Sieh es als Hinweise für die Zukunft. Grüße Toa
"Das ist ein Minkovski Raum, manche Menschen nennen ihn auch Weltraum" Prof. Dr. Jürgen Wambach, Theoretische Physik, TU Darmstadt | Meine Homepage

17

31.03.2012, 15:26

Wieso denn wieder unhöflich!?
Freilich habe ich auch erwähnt, dass die Infos nützlich waren.
Es wäre schön, wenn der Thread nun abgeschlossen wäre. Ich hab keine Lust auf weitere Diskussionen bezüglich "meiner Arroganz".

MfG
Check

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

18

31.03.2012, 15:50

Alles was du schriebst passt nicht in mein Konzept.

Alles was ich schreibe ist haargenau auf das abgestimmt, was sich aus deinen vagen Posts erahnen lies.

Warum antwortest du eigentlich noch? Es funktioniert doch.

Weil es überhaupt nicht richtig sein kann, wenn es auch nur annähernd was mit dem zu tun hat, was du zuvor gezeigt hast.

Trotzdem erhältst du ein Danke von jedem der über eine Suchmaschine nun sein Problem lösen konnte.

Nein, alles war explizit für dich und deinen konkreten Integer-Vergleich geschrieben, in der Hoffnung, dich damit in deinen persönlichen Programmier-Fähigkeiten voran zu bringen. Jemand anderem wird das nur marginal nützen, weil der Kontext dieses Threads schon viel zu umfangreich ist.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

19

31.03.2012, 16:10

Alles was ich schreibe ist haargenau auf das abgestimmt, was sich aus deinen vagen Posts erahnen lies.

Ja, erahnen.
Weil es überhaupt nicht richtig sein kann, wenn es auch nur annähernd was mit dem zu tun hat, was du zuvor gezeigt hast.

Jo, dann ist es eben falsch. Ich kann damit leben.
Nein, alles war explizit für dich und deinen konkreten Integer-Vergleich geschrieben, in der Hoffnung, dich damit in deinen persönlichen Programmier-Fähigkeiten voran zu bringen. Jemand anderem wird das nur marginal nützen, weil der Kontext dieses Threads schon viel zu umfangreich ist.

Dann hast du mir nicht sehr "geholfen". Wodurch man wieder zurückkommt: Der Thread ist abgeschlossen, wenn ich doch zufrieden bin, nach deiner Ansicht es eben falsch mache, es aber bei mir funktioniert und ich das als ausreichend empfinde, dann lass mich doch in meiner Dummheit leben. Der Code stimmt ja auch 'sowieso' nicht mit dem hier überein und dieses Beispiel hier ist wahrlich nicht gut gewesen, hab ich auch verstanden. Irgendwem wird schon geholfen. Damit schließe ich nicht aus, dass ich dazu gehöre.
Könnten wir diese ständigen Diskussionen nachdem ich mal was gefragt habe eindämmen? Schön ist das nicht.

MfG
Check

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

20

31.03.2012, 16:15

Könnten wir diese ständigen Diskussionen nachdem ich mal was gefragt habe eindämmen? Schön ist das nicht.

Ja, das kannst DU. Indem du Fragen stellst, die mehr zulassen als Ahnungen. Und indem du Fragen einfach sein lässt, wenn du eh keine Antworten hören willst.

WIR könnten das natürlich auch, indem wir dich einfach sperren.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

Werbeanzeige