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

06.02.2008, 14:31

Hmm man merksts ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Func(const std::vector<MyClass*>& data)
{
    std::vector<MyStruct*> foo(count);
    std::vector<MyClass*>::const_iterator it = data.begin();

    for ( ; it != data.end(); ++it )
      foo.push_back(*it);

    Func2(&foo[0]);
}

void Func2(MyStruct* pStructArray) 
{
    // ...

} 
Wäre drin, wenn du nicht in MyClass schon einen Zeiger verwendet hättest ... (std::vector versichert, dass die Daten an einem Stück im Speicher liegen ... deswegen geht &foo[0] ...)
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

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

12

06.02.2008, 15:29

Nun gut, ich muss wohl mehr Zeit in STL inverstieren, sonst wird das auf lange Zeit nichts :D

Trotzdem, ich kann dieses Code-Fragment nicht ordnungsgemäß zum Arbeiten bringen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Func(const std::vector<MyClass*>& data)
{
    std::vector<MyStruct*> foo(count);  // Also count beschreibt die Anzahl an Elementen, die bekannt ist (wenn ich das richtig verstanden habe)...

    std::vector<MyClass*>::const_iterator it = data.begin();

    for ( ; it != data.end(); ++it )
      foo.push_back(*it);   //... dann wird dieser reservierte Speicher erst gar nicht angerührt, denn es werden einfach neue Elemente hinzugefügt ??

// Und noch was: wieso wird hier ein Zeiger auf MyClass übergeben, wenn man doch MyStruct erwartet. Auf jeden Fall habe ich die Zeile so geändert:

foo.push_back((*it)->pMemStruct) // Ich hofe ich habe somit keinen großen Fehler begangen.


    Func2(&foo[0]);  // Das will der Compiler nicht kompilieren. Deswegen ändere ich die Zeile so: 

    Func2(foo[0]); // Leider wird hier nur ein Element übergeben, wenn ich mich nicht täusche...

}

void Func2(MyStruct* pStructArray)
{
    // ...

}
To go back to the drawing board is not everyone's cup of tea! :-)

13

06.02.2008, 15:31

Hmm naja warum ist pMemStruct ein Zeiger und keine Referenz? Und sonst musst du wohl pMemStruct dereferenzieren ... sonst kommst du mit nem einfachen Zeiger nicht mehr hin.
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

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

14

06.02.2008, 20:27

Sollte man nicht auch noch die Anzahl der Elemente des Arrays übergeben, weil das Array an sich doch "zerfällt" und nicht erhalten bleibt ...

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

15

06.02.2008, 20:57

Zitat von »"Deviloper"«

Hmm naja warum ist pMemStruct ein Zeiger und keine Referenz?

Weil das alles unnötig kompliziert macht. Nun, mir fällt nichts mehr ein, ausser dass ich den Struktur-Member ganz einfach als Value lasse:

C-/C++-Quelltext

1
2
3
4
class MyClass
{
MyStruct pMemStruct;
}; 

dann kann man nämlich folgendes auch ganz einfach anwenden:

C-/C++-Quelltext

1
Func2(&pClass[0].pMemStruct);

Aber das ist bestimmt sehr langsam. Trotzdem würde ich gerne wissen, ob man an dieser Stelle, die Performance etwas vernachlässigen kann.
To go back to the drawing board is not everyone's cup of tea! :-)

16

06.02.2008, 23:46

Zitat

Weil das alles unnötig kompliziert macht.
Nein. Das macht es definitiv nicht. Weiß nicht wer euch immer einbleut das Zeiger das allheilmittel wären. Referenzen sollten Zeigern sogar bevorzugt werden und sind als solche auch einfacher zu handhaben.

In deinem Beispiel würdest du dir das Kopieren sparen ...
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

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

17

07.02.2008, 11:22

Zitat von »"Deviloper"«

Zitat

Weil das alles unnötig kompliziert macht.
Nein. Das macht es definitiv nicht. Weiß nicht wer euch immer einbleut das Zeiger das allheilmittel wären. Referenzen sollten Zeigern sogar bevorzugt werden und sind als solche auch einfacher zu handhaben.

Ich habe das jetzt auf mein Beispiel bezogen und das Initialisieren der Referenz in der Initialisierungsliste ist hier wirklich unnötig:
1. weil ich die Referenz nicht bereits im Konstruktor initialisieren möchte, sondern per eine dafür vorgesehene Funktion auf eine Adresse zeigen lassen will. Das ist zwar etwas fehlerbehaftet, dafür ist aber der zweite Punkt von Bedeutung...
2. weil dieselbe Klasse sozusagen als "Zwischenspeicher" verwendet wird, es soll immer auf eine andere Adresse (pMemStruct) zeigen und mit der Referenz geht das bekanntlich schlecht.

PS: Natürlich sind die Referenzen immer die erste Wahl, die man vor den Zeigern trifft. Zeiger sind jedoch unverzichtbar, wenn man sein Programm übersichtlich gestalten möchte. Jedenfalls sehe ich das so. Auf jeden Fall nehme ich immer Referenzen, wenn es um const-correctness geht ;)
To go back to the drawing board is not everyone's cup of tea! :-)

Werbeanzeige