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

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

1

08.01.2011, 08:38

Ändern einer Variablen eines Structs eines Vectors

Sehr geehrtes Forum, ich habe eine Frage:

Wie kann ich eine Variable ändern, die in einem Struct ist, und dieses Struct in einem Vector?

Wenn ich das so mache, geht es nicht, wieso?

Der Wert wird nicht verändert :

C-/C++-Quelltext

1
2
3
4
5
vector<Objekt>::iterator it; 
for(it=objects.begin(); it<objects.end(); it++) 
{ 
it->rect.x += object_speed; 
}


Objekt hat als Variablen :
int pic;
SDL_Rect rect;

Rect ist ein SDL_Rect, und ist auch ein Struct, dass die Variablen:
int x,y,w,h;
besitzt.

Was kann ich machen um x zu manipulieren?

M.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

08.01.2011, 08:58

Was kann ich machen um x zu manipulieren?

Referenzen/Pointer statt Values speichern.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

3

08.01.2011, 09:07

und wie sollte ich dass dann machen?

sollte das dann : vector<Objekt*> heißen?
Und sollte ich dann so elemente hinzufügen :
Objekt o = new Objekt;
vector.push_back(&o);?

geht das wirklich gar nicht anders?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

08.01.2011, 09:19

Wenn du "new" verwendest, bekommst du ohnehin einen Pointer.
Also so:

C-/C++-Quelltext

1
2
Object* o = new Object();
vector.push_back(o);
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

5

08.01.2011, 09:56

Die Sache ist die, ich habe Methoden, die diesen Vector, und viele andere, übergeben werden soll, dann soll mit ihnen gearbeitet werden, mal nur inhalt ausgelesen und gezeichnet, mal geändert werden, ich arbeite mit Iteratoren.

Aber Iteratoren sind doch auch Pointer oder?

Damit habe ich nämlich gerade sehr große Probleme,
es ist schwer alles zu schildern, und den ganzen Code zu zeigen, ist auch sinnlos,
ich probiere hier mal die schwerwiegensten Probleme aufzuzeigen :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Also ein Vector, der so initialisiert wurde, wird dann so über geben : 
vector<Objekt*> vector; 
Object* o = new Object(); vector.push_back(o); 

// an diese Methode 
void Game::drawObjects(vector<Objekt*> objects,bool b) 
{ 
vector<Objekt*>::iterator it; 
int zahl = 0; 
for (it=objects.begin(); it<objects.end(); it++) 
{ 
if(b) 
drawObject(it,true); 
else 
drawObject(it,false); 
zahl++; 
} 
}


Aber wie soll drawObjekt jetzt jedes Element empfangen, benutze ich einen Iterator, ist es ja ein ** Pointer auf einen Pointer, oder etwa nicht?
Und die Funktion drawObject sieht so aus:

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
46
47
void Game::drawObject(Objekt** o,bool b) 
{ 
if(b) 
{ 
switch(o->pic) 
{ 
case 1: apply_surface(*o->rect.x,o->rect.y,imageCollection,sScreen,&carAright); 
break; 
case 2: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&carBright); 
break; 
case 3: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&carCright); 
break; 
case 4: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&carDright); 
break; 
case 5: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&treeL); 
break; 
case 6: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&treeM); 
break; 
case 7: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&treeB); 
break; 
case 8: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&turtle); 
break; 
}; 
} 
else 
{ 
switch(o->pic) 
{ 
case 1: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&carAleft); 
break; 
case 2: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&carBleft); 
break; 
case 3: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&carCleft); 
break; 
case 4: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&carDleft); 
break; 
case 5: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&treeL); 
break; 
case 6: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&treeM); 
break; 
case 7: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&treeB); 
break; 
case 8: apply_surface(o->rect.x,o->rect.y,imageCollection,sScreen,&turtle); 
break; 
}; 
} 
}

Und dann kommt eine Fehler meldung, z.B. dass die Zeile : switch(o->pic)
einen Fehler enthält. Die Fehlermeldung der Zeile sieht so aus :

Quellcode

1
F:\C++ Projekte\Games\The Frog Game\Game.cpp|547|error: request for member `pic' in `*o', which is of non-class type `Game::Objekt*'|


Ich habe jetzt keine Ahnung was ich tun soll, ach und noch etwas, Objekt ist ein struct, wenn man es mit dem new Operator in den "Space" ladet, darf man dann überhaupt () benutzen, ein Struct hat doch gar keinen Konstructor oder?

Ich weiß das du bestimmt die Antwort weißt und dass das Anfänger Fragen sind,
aber ich habe irgendwie bei solchen Sachen mit Mehrfach pointern einfach Probleme,

danke für deine Hilfe und deine Geduld mit mir,
m.f.G. Developer_X

PS:
Um es vielleicht klarer zu machen, was Objekt ist, hier das Struct dazu :

C-/C++-Quelltext

1
2
3
4
5
 struct Objekt
 {
  SDL_Rect rect;
  int pic;
 };
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

08.01.2011, 11:30

C-/C++-Quelltext

1
2
3
4
5
vector<Objekt>::iterator it; 
for(it=objects.begin(); it<objects.end(); it++) 
{ 
it->rect.x += object_speed; 
}

das sollte eigentlich gehen...

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

08.01.2011, 11:54

C-/C++-Quelltext

1
2
3
4
5
vector<Objekt>::iterator it; 
for(it=objects.begin(); it<objects.end(); it++) 
{ 
it->rect.x += object_speed; 
}

das sollte eigentlich gehen...


Abgesehen davon, dass man eigentlich als Abbruchbedingung einer solchen Schleife nicht it<objects.end(); sondern it != objects.end(); schreibt, da der Vergleich sicherer ist, muss der Code eigentlich funktionieren. Wenn du jedoch die Elemente des Vectors in einer Funktion änderst, die ihn als Parameter übernimmt, klappt es so nicht, weil du nur eine lokale Kopie änderst. In diesem Fall würde es sich anbieten den Vector als Referenz oder Pointer an eine Funktion zu übergeben.

Wenn du einen Iterator it vom Typ Objekt** hast, musst du mit (*it)->Variable auf die Elemente zugreifen.

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

8

08.01.2011, 11:54

Ach jetzt funktioniert es, ich musste einfach nur mit referenzen in drawObjects

arbeiten.


Ich danke euch allen trotzdem!
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

08.01.2011, 17:57

Es wäre auch kein Problem gewesen, wenn die Objekte innerhalb der Liste Pointer gewesen wären. Nicht performant, aber funktional. Problem sind halt die erzeugten Kopien durch die Verwendung von Werten statt Referenzen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

10

08.01.2011, 23:17

Ich habe jetzt keine Ahnung was ich tun soll, ach und noch etwas, Objekt ist ein struct, wenn man es mit dem new Operator in den "Space" ladet, darf man dann überhaupt () benutzen, ein Struct hat doch gar keinen Konstructor oder?

Und wie ein struct einen Konstruktor hat. Ein Struct ist im Grunde eine Klasse. Der Unterschied ist egtl. nur, dass bei einer Klasse standardmäßig alle Member "private" sind, bei einem struct "public". Du kannst aber genauso Konstruktoren, Funktionen etc. erstellen.
Und zu deinem Draw-Problem:

C-/C++-Quelltext

1
2
3
4
for( std::vector<object*>::iterator it = objects.begin(); it != objects.end(); it++ )
{
    draw_object( *it, true );
}


Dann hast du einen einfache Funktion draw_object( object*, bool ). Sprich durch den Dreferenzierungsoperator "*" wird aus dem iterator wieder ein object.

Werbeanzeige