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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

10.08.2009, 09:08

Da sind aber Fehler im Code:

C-/C++-Quelltext

1
for (int i = 0; i <= 7; i++)


Das gibt einen "Out-Of-Range" Zugriff. Die Abbruchbedingung sollte eigentlich i < 7 lauten.

Dieses i != 0 ist irgendwo auch unnötig, da verkürzt sich das Ganze schonmal auf:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for ( int i = 1; i < 7; ++i )
{
      if(myvector[i] == (myvector[i-1]+1)) 
      {       
            counter++; 
      } 
      else 
      { 
            if (counter < 4) 
            { 
                  not_found = true; 
            } 
      } 
}


Dann willst du doch 4 (?) zusammenhängende überall im Array erkennen können, oder? Was ist dann z.B. mit den Zahlen: 1, 7, 8, 9, 10, 11, 99? Dafür muss die Logik etwas angepasst werden:

C-/C++-Quelltext

1
2
3
4
5
6
7
for (int i = 1; i < 7 && counter < 4; i++) 
{ 
      if(myvector[i] == (myvector[i-1]+1)) 
            counter++; 
      else 
            counter = 0;
} 


Und dann könntest du natürlich auch iteratoren verwenden. Du verwendest ja schließlich std::vector<int>. ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
for ( std::vector<int>::const_iterator it = myvector.begin()+1; 
      counter < 4 && it != myvector.end(); ++it )
{ 
      counter = ( ( *it-*(it-1) ) == 1 ) 
            ? counter + 1
            : 0;
}

12

10.08.2009, 10:09

mh... ja statt dem <=7 hatte ich sizeof(myvector)/sizeof(int), aber das hat gar nicht geklappt. ich bekomm beim <=7 keinen fehler...

so den rest muss ich mir noch mal anschau... danke jedenfalls für die hilfen...

habs dann auch gar nicht mehr wirklich getestet sondern hab mich nur auf ohr gehaut..


so habs kurz getetestet: 11,2,3,4,5,6,9 diese zahlenfolge wird als straight erkannt und 11,2,3,10,5,6,9 nicht. also keine ahnung aber bei mir gehts. und einen out of the bounds error bekomm ich wie gesagt auich nicht. ich teste auf < 4 weil wenn wenn er 4 mal den counter erhöht hat, dann hat er insgesammt schon 5 in einer reihe. und wenn eben erst ab der 3ten zahl die 5er zeihe kommt, erkennt er auch wunderbar...

was macht iteratoren besser als mein geliebtes i?


lg Aly

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

10.08.2009, 10:31

Zitat von »"AlymcGeel"«

mh... ja statt dem <=7 hatte ich sizeof(myvector)/sizeof(int), aber das hat gar nicht geklappt. ich bekomm beim <=7 keinen fehler...


Es ist aber ein Fehler, weil dein Array/Vector genau 7 Elemente hat wird das letzte mit 6 Indiziert!

Zitat von »"AlymcGeel"«

so habs kurz getetestet: 11,2,3,4,5,6,9 diese zahlenfolge wird als straight erkannt und 11,2,3,10,5,6,9 nicht. also keine ahnung aber bei mir gehts. und einen out of the bounds error bekomm ich wie gesagt auich nicht. ich teste auf < 4 weil wenn wenn er 4 mal den counter erhöht hat, dann hat er insgesammt schon 5 in einer reihe. und wenn eben erst ab der 3ten zahl die 5er zeihe kommt, erkennt er auch wunderbar...


Wieso hast du nicht mal die Zahlen getestet die ich gepostet hab?

Zitat von »"AlymcGeel"«


was macht iteratoren besser als mein geliebtes i?


Das ist halt der Standardweg um durch einen std::vector<T> zu iterieren und hilft z.B. out_of_range Zugriffe zu vermeiden...

14

10.08.2009, 11:45

ok du hattest recht. meine variante hat die straight bei deinen zahlen nicht erkannt. habs mit deiner probiert und geht wunderbar.
und ja mit dem <=7 hast ja auch recht, aber warum meckert mr.g++ nicht ?

so hab jetzt im endeffekt deine lösung genommen (ohne iterator) danke dafür auch wenns mich ein bisschen wurmt, dass mein pfusch nicht hingehaut hat... wird schon noch werden.

lg Aly

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

10.08.2009, 11:57

Was hast du denn gegen Iteratoren?

16

10.08.2009, 12:01

ich weiß nicht wirklich. ich seh keine offensichtlichen vorteile davon. Und ich bin im zuge des c++ lernens immer mit am index int die arrays und vectoren durchgangen bin also is es drinn...

so ich muss sowieso was fragen. ich checks nicht wirklich warum meine lösung nicht geht.
es sind ein paar unnötige sachen dabei sowie die if bedingung für die erste zahl klar, aber warum erkennt meine lösung deine zahlenreihe net gscheit?

lg Aly

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

10.08.2009, 12:16

Zitat von »"AlymcGeel"«

ich weiß nicht wirklich. ich seh keine offensichtlichen vorteile davon. Und ich bin im zuge des c++ lernens immer mit am index int die arrays und vectoren durchgangen bin also is es drinn...


Als Programmierer ist es doch immer gut für neue Vorschläge offen zu sein! ;)

Zitat von »"AlymcGeel"«


so ich muss sowieso was fragen. ich checks nicht wirklich warum meine lösung nicht geht.
es sind ein paar unnötige sachen dabei sowie die if bedingung für die erste zahl klar, aber warum erkennt meine lösung deine zahlenreihe net gscheit?


Weil deine Lösung davon ausgeht, dass die zusammenhängende Sequenz immer am Anfang des Arrays steht.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

18

10.08.2009, 12:31

Ja.. Das erste if war unnötig.. Kam wohl noch von mir. :)

Ich habe aber mit Absicht keine Iteratoren verwendet, weil es in diesem Beispiel um einiges lesbarer und intuitiver ist den Zugriffsoperator zu benutzen. Im übrigen sehe ich auch keinen Vorteil hier Iteratoren zu nehmen, weil der Zugriff ohnehin von einem RA-Iterator ausgeht. Wenn man das ganze jetzt noch generisch gestalten will und std::advance benutzen möchte meinetwegen, aber in einem solchen Beispiel fände ich das ein wenig übertrieben..

Nichtsdestotrotz ist es natürlich gut Iteratoren kennen zu lernen. Schadet nie. ;)

19

10.08.2009, 12:48

na gut leude... dann werd ich anfangen iteratoren zu verwenden. stimmt eh , ich sollte mich nicht davor verschließen...

ah ok.. werd mir die beiden codes noch mal anschaun...

lg Aly

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

20

10.08.2009, 14:42

Hmm was ist denn eigentlich der Vorteil von iteratoren...
bei std::list ist es ja klar... aber bei std::vector ?...

Naja es bringt vtl ein bisschen leserlichkeit... aber sonst ?

Werbeanzeige