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

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

1

30.04.2006, 16:23

Klassen in Listen

Ich habe eine Liste lMinen und will mit dem Iterator die Membervariablen der Mine auf die der Iterator gerade zeigt, lesen. (Mittels for Schleife)

Ich hab schon alles mögliche probiert: i.XPos ....
Klappt alles nicht ... ???

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

30.04.2006, 16:52

hä?? Bisschen genauer wenns geht, und ein bisschen vom Code... was sind lMinen?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

3

30.04.2006, 17:14

C-/C++-Quelltext

1
2
3
4
5
6
7
8
std::list<iMinen> _liste;
// ...

std::list<iMinen>::Iterator it;

for (it = _liste.begin(); it != _liste.end(); it++)
{
  it->XPos = 0; // der iterator ist sowas (ähnliches!) wie ein Pointer

}

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

4

30.04.2006, 17:22

Tja, lMinen sind die gelegten Minen auf der Karte.

Jede Mine soll in der Schleife durchgegangen werden und mit den Membervariablen XPos und YPos angezeigt werden...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CMine 
{
    public:
     int XPos;
     int YPos;
    
}; 

list<CMine> lMinen; //Die List der Minen

list<CMine>::iterator i; //und der Iterator


...
...

for(i = lMinen.begin(); i != lMinen.end(); ++i)
{
... 
hier sollen dann die Daten der Mine ausgewertet werden.
d.h. es soll auf die Membevariablen X- und YPos zugegriffen werden.
...
}


Ist's so verständlicher??? :)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

30.04.2006, 17:25

das Vorgehen sollte eigentlich aus meinem Code ersichtlich sein.

entweder du nutzt den -> operator oder du dereferenzierst i und nutzt den . operator

C-/C++-Quelltext

1
2
3
i->XPos
// oder

(*i).XPos

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

6

30.04.2006, 17:32

Es funzt nur die zweite Möglichkeit...
Aba auch nur eingeschränkt:
Der Compiler schmeißt mich dann mit 3 Fehlern aus der include-Datei map.h zu... Illegal structure operation ...
Aba in der eigentlichen cpp ist alles okay...
Einer davon liegt hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
    while (first != last)
    {
        iterator next = first;
        ++next;
        if (*first == value) erase(first);  // <- In dieser Zeile

        first = next;
    }

Ich kapiers nich...

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

7

30.04.2006, 17:36

Ich bin mir grad garnich sicher, ob es iterator und erase so global überhaupt gibt. Zeig doch bitte mal die Deklaration deiner Klasse

// ach ne... haste ja schon^^

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
std::list<CMine> Minen(5);
std::list<CMine>::iterator it;
for (it = Minen.begin(), int i=0; it != Minen.end(); it++, i++)
{
  it->XPos = 2*i;
  it->YPos = i;
}
it = Minen.begin();
while (it != Minen.end())
{
  if (it->Xpos == 4) it = Minen.erase(it);
  it++;
}

Testen, Fehler posten.
beim Nutzen von std::list<>::erase() wird ein gültiger iterator zurückgegeben - das ist wichtig, da der alte nach dem Löschen nicht mehr existiert. Bin allerdings jetzt nicht sicher, ob das so fehlerfrei ist.

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

8

30.04.2006, 18:50

Wie gesagt: Der Compiler akkzeptiert kein

C-/C++-Quelltext

1
it->XPos = ... ;

Er meckert sogar bei deiner for-Schleife:

C-/C++-Quelltext

1
for (it = Minen.begin(), int i=0; it != Minen.end(); it++, i++)

Ich kann irgendwie nicht auf die Memberv. zugreifen...
Die Variante (*i).XPos = ... funktioniert fast, nur wie gesagt (ich meinte)
es taucht ein Fehler in der eingebundenen Headerdatei list.h auf
Fehler:

C-/C++-Quelltext

1
2
3
[C++ Error]list.h(676): Illegal structure operation.
[C++ Error]list.h(690): Illegal structure operation.
[C++ Error]list.h(707): Illegal structure operation.

Wenn ich " it->XPos = ... " benutze, dann kommt:

C-/C++-Quelltext

1
[C++ Error]Pro1.cpp(157): Pointer to structure requires on left side of -> or ->*.


Warum hast du bei deinem Beispiel noch die Variable i benutzt???
Was bringt die (bzw. was bringt's nicht) ;)
Beschreibt dein Vorgehen bitte n bissel besser, für n Noob wie mich ;p

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

9

30.04.2006, 23:29

Ich hab meinen Code jetzt mal selbst getestet :)

1 Welchen Compiler nutzt du?
2 Ich hoffe, du hast <list> und nicht <list.h> includiert?
3 Es gibt tatsächlich Probleme mit dem initialisieren von i und gleichzeitigem Zuweisen vom iterator
die Variable i hab ich verwendet um XPos und YPos zu initialisieren. Dabei sollten die Werte unterschiedlich sein aber ich wollt nich alles einzeln schreiben.

Ich poste jetzt nochmal ein komplettes Prog, wie es bei mir funktioniert - mit Kommentaren ;)

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
// Header

#include <list>
#include <iostream>

// Klasse

class CMine
{
    public:
        int XPos;
        int YPos;
};

int main()
    {
// Liste von CMine mit 5 Elementen

    std::list<CMine> Minen(5);
// Iterator

    std::list<CMine>::iterator it;
// int zum füllen der XPos und YPos Werte

    int i=0;
// for-Schleife (diesmal funktionsfähig

    for (it = Minen.begin(); it != Minen.end(); it++)
        {
// XPos und YPos Werte zuweisen

        it->XPos = 2*i;
        it->YPos = i;
// i erhöhen ;)

        i++;
        }
// Iterator zurücksetzen

    it = Minen.begin();
// while-Schleife

    while (it != Minen.end())
        {
// das 3. Element der Liste wird gelöscht und it wird auf das nächste Element gesetzt

        if (it->XPos == 4) it = Minen.erase(it);
// nur wenn XPos nicht 4 ist muss it manuell auf das nächste Element

        else it++;
        }
// Standardinput leeren

    fflush(stdin);
// darauf warten, dass der Benutzer Enter drückt

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

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

10

01.05.2006, 11:50

1. Im Momemt benutze ich den Borland C++ Builder...
Da wird wenn ich keine Konsolenanwendung auswähle kein 'int main()' benutzt. Ist bei Fensteranwendungen stark vereinfacht...
2. Ich habe <list> includiert!
3. Jep, gibt es. Ich kann dem Iterator nichts zuweisen.

Das Progg hat wieder das obengennante Problem:
ICH KANN DEM ITERATOR KEINEN WERT ZUWEISEN!!!! :crying:

Ich werds mal mit nem anderen Compiler versuchen vielleicht liegts an Borland...

Werbeanzeige