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

11

30.08.2008, 19:00

Hm soll jetzt das true nur weiter gereicht werden oder das objekt?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

12

30.08.2008, 19:04

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
{
    std::list<Object*>::iterator it(std::find(myList.begin(), myList.end(), std::mem_fun(&Object::GetChoose));

    if (it == myList.end()) { std::cerr << "FEHLER: Kein Element mit \"true\"!\n"; return false; }

    (*it)->Choose(false);

    // next item == end of list? next_item = first item

    if (++it == myList.end()) it = myList.begin();

    (*it)->Choose(true);
}

wenn du nur das true weiterreichen willst ... sonst geht dads fast genau so ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

13

30.08.2008, 19:05

Und wie mach ich das wenn m_itChoose gleich dem m_spriteStaticList.end()-1 ist ;) ?

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

14

30.08.2008, 19:14

Ich verstehe dein Problem nicht. Der Fall wird doch explizit abgefangen:
wenn m_itChoose gleich m_spriteStaticList.end()-1 ist, wird ++m_itChoose damit gleich m_spriteStaticList.end(), so dass m_itChoose wieder auf den Anfang der Liste gesetzt wird.

15

30.08.2008, 19:34

Das ist mein jetziger Code:

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
std::list<CStatic*>::iterator i;
    m_itChoose = m_spriteStaticList.begin();
    i = m_spriteStaticList.begin();
    while((*i)->GetChoose()==false)
    {
        m_itChoose++;
        i++;
    }
    i = m_spriteStaticList.begin();
    for(i = m_spriteStaticList.begin(); i != m_spriteStaticList.end(); i++)
    {
        (*i)->Choose(false);
    }
    m_itChoose++;
    if(m_itChoose == m_spriteStaticList.end())
    {
        m_itChoose=m_spriteStaticList.begin();
        (*m_itChoose)->Choose(true);
    }
    else
    {
        (*m_itChoose)->Choose(true);
    }


klappt alles, danke

16

30.08.2008, 19:48

Jo und der ist einfach wesentlich schlechter, als alles was bisher gepostet wurde ;) Du hast zu viele Schleifen! Und Variablen ;) Und wenn du mal den Fall hast, dass alle false sind, hast du auch ein Problem :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
if(m_itChoose == m_spriteStaticList.end())
    {
        m_itChoose=m_spriteStaticList.begin();
        (*m_itChoose)->Choose(true);
    }
    else
    {
        (*m_itChoose)->Choose(true);
    }

C-/C++-Quelltext

1
2
3
4
if(m_itChoose == m_spriteStaticList.end())
        m_itChoose=m_spriteStaticList.begin();
        
(*m_itChoose)->Choose(true);
... ist kürzer und vom logischen auch korrekter.

Aber sorry du lässt dich ja ungerne belehren. const und co brauchst du ja auch nicht, du findest deinen Style ja so perfekt und gut :) hf.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

17

30.08.2008, 19:59

Du bist dir offensichtlich so sicher, dass getChoose() immer für ein Element true liefert, dass du den Fall, dass dem nicht so ist, nicht abfängst (und so nach wie vor einen Laufzeitfehler in diesem Fall verursachst).

Andererseits scheinst du aber durchaus damit zu rechnen, dass mehr als ein Element für getChoose() true liefert, so dass du nicht nur das soeben heraus gesuchte Element auf false zurücksetzt, sondern gleich die ganze Liste.

Denk mal drüber nach.

18

30.08.2008, 21:16

@ Seegel:
Mein Code soll erstma versuchen zu klappen.
Ich werde sowieso alles nochma neu schreiben.
@devil:Mir gehts ersma ums Prinzip, bevor ich loslege und alles auf Deviloper-Art mache und nix verstehe was ich schreibe ;) -> nicht bös gemeint :D

@moi:Ich möchte nur verstehen, was ich schreibe.

C-/C++-Quelltext

1
2
3
4
if(m_itChoose == m_spriteStaticList.end())
        m_itChoose=m_spriteStaticList.begin();
       
(*m_itChoose)->Choose(true);

Das ist verständlich und wird übernommen ;)

C-/C++-Quelltext

1
    while((*i)->GetChoose()==false && i != m_spriteStaticList.end())
hab ich auch mal geändert , sicher ist sicher ;)

EDIT:
"Jo und der ist einfach wesentlich schlechter, als alles was bisher gepostet wurde Wink" , tut mir leid, ich programmiere erst seit einem halben Jahr mit c++....

EDIT2:

Jetzt muss ich nochmal das verschieben in die andere Richtung coden :D

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

19

30.08.2008, 23:05

Zitat von »"Unknown"«

C-/C++-Quelltext

1
    while((*i)->GetChoose()==false && i != m_spriteStaticList.end())
hab ich auch mal geändert , sicher ist sicher ;)

Ist es nicht. So ist das Problem nicht gelöst.

Tipp: was passiert, wenn i == m_spriteStaticList.end() ?

Unterstellen wir mal, die Bedingung bewirkt das, was du höchst wahrscheinlich beabsichtigt hast (was sie nicht tut !). Was bewirkt die Tatsache, das i gleich m_spriteStaticList.end() ist, im weiteren Ablauf ?

Aber nochmal ganz allgemein betrachtet, scheint mir der Ansatz, das ausgewählte Element durch einen Member-Variable zu markieren, ungünstig (vorsichtig ausgedrückt).
Das zwingt dich zu den ganzen Verrenkungen, um sicherzustellen, dass immer nur genau ein Element choose auf true gesetzt hat.
Da du sowieso eine Variable hast, die das fragliche Element speichert (genauer: einen Iterator darauf, m_itChoose), hast du doch die nötige Information bereits.
Nur so als Anregung. Mach damit, was du meinst.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

20

31.08.2008, 11:35

Zitat von »"S.Seegel"«

...


Ich weiss auch nicht, aber das ist ja immernoch in etwa das, was ich ihm am Anfang geschrieben habe.

Zitat von »"ich"«

Was ist den jetzt, wenn alle Elemente in der Liste true sind? - Dann wirst du einen Zugriff auf eine Variable haben, die keine ist.


Vielleicht hätte ich noch erwähnen sollen, dass die dereferenzierung auf l.end() auch ein Fehler ist.

Selbst, dass er da einen viel zu grossen Umweg macht, habe ich geschrieben. Und ihr habt ihm jetzt ja sehr gute Ratschläge und Beispiele gepostet. So schwer sind die ja nicht zu verstehen. OK. Das von Deviloper ist jetzt nicht so das, was ich einem Anfänger anbieten würde, aber S.Seegel hat dir einen leicht verständlichen Ansatz gegeben.

Werbeanzeige