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

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

1

05.02.2008, 23:14

Arrays umwandeln

Hallo mal wieder,
ich stehe jetzt so ziemlich auf dem Schlauch, obwohl das Problem doch nicht so schwer sein kann :?
Ich versuche sozusagen ein Array eines Typs in einen Array anderes Typs zu umwandeln. Um dies etwas zu veranschaulichen, füg' ich bisschen Code hinzu:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Es wird eine Struktur und eine Klasse etworfen, wobei die Klasse einen Zeiger auf ein Objekt diese Struktur besitzt. Dass die Struktur  leer ist, tut jetzt nichts zur Sache ;)


struct MyStruct;

class MyClass
{
MyStruct* pMemStruct;
};

// Definition einer Funktion, die einen Array an MyClass-Objekten als Parameter bekommt

void Func(MyClass* pClassArray)
{
    // Hier liegt nun das Problem: Die zweite Funktion erwartet nun einen Array von Struktur-Objekten, die von pClassArray irgendwie subtrahiert werden müssen.

   // Doch wie soll man dies realisieren?

   Func2(...);
}

void Func2(MyStruct* pStructArray)
{
// do something

}


Ich hofe, ich habe es klar und deutlich formuliert und würde mich über mögliche Lösungsvorschläge freuen ;)
To go back to the drawing board is not everyone's cup of tea! :-)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

05.02.2008, 23:37

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
// Es wird eine Struktur und eine Klasse etworfen, wobei die Klasse einen Zeiger auf ein Objekt diese Struktur besitzt. Dass die Struktur  leer ist, tut jetzt nichts zur Sache ;)


struct MyStruct;

class MyClass
{
public:
MyStruct* pMemStruct;
};

// Definition einer Funktion, die einen Array an MyClass-Objekten als Parameter bekommt

void Func(MyClass* pClassArray)
{
    // Hier liegt nun das Problem: Die zweite Funktion erwartet nun einen Array von Struktur-Objekten, die von pClassArray irgendwie subtrahiert werden müssen.

   // Doch wie soll man dies realisieren?

   Func2(pClassArray->pMemStruct);
}

void Func2(MyStruct* pStructArray)
{
// do something

} 


Ist es etwa das, was du willst?

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

3

06.02.2008, 12:10

Zitat

Func2(pClassArray->pMemStruct);

Ehhh... pClassArray ist schon wirklich ein Array mit mehr als einem Eintrag. Sowas wird doch sicher nicht gehen ;)
To go back to the drawing board is not everyone's cup of tea! :-)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

06.02.2008, 12:20

Dann stell deine Frage doch evtl etwas genauer. Was erwartet z.B. Func2?
Ich hab dich so verstanden:

Der Zeiger pClassArray zeigt auf ein Array! von MyClass Objekten. Was du tun willst ist für alle Arrayeinträge die jeweiligen MyStruct Objekte in ein Array zu sammeln und an Func2 zu übergeben?!

Zeigt pMemStruct auch auf ein Array von MyStruct Objekten, oder nur auf eine Instanz? Und wie willst du feststellen wieviel Einträge das von pClassArray gezeigte Array hat?
@D13_Dreinig

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

5

06.02.2008, 13:28

Zitat von »"David_pb"«

Dann stell deine Frage doch evtl etwas genauer. Was erwartet z.B. Func2?

Hmm...ich dachte, ich hätte dies mit der Erklärung eigentlich gut hingekrigt :(
Also laut dem Code

C-/C++-Quelltext

1
2
3
4
void Func2(MyStruct* pStructArray)
{
// do something

}

erwartet die Funktion Func2 einen Array an Struktur-Objekten.

Zitat von »"David_pb"«

Der Zeiger pClassArray zeigt auf ein Array! von MyClass Objekten. Was du tun willst ist für alle Arrayeinträge die jeweiligen MyStruct Objekte in ein Array zu sammeln und an Func2 zu übergeben

Genau das will ich tun ;)

Zitat von »"David_pb"«

Zeigt pMemStruct auch auf ein Array von MyStruct Objekten, oder nur auf eine Instanz?

Ja, es zeigt nur auf eine einzige Instanz.

Zitat von »"David_pb"«

Und wie willst du feststellen wieviel Einträge das von pClassArray gezeigte Array hat?

Eigentlich gar nicht, denn die Frage habe ich nicht gestellt :?:
Aber, es wäre nett, wenn jemand sagen würde wie man das tatsächlich tut ;) habe jetzt eben auf die Frage eingegangen und leider nichts Vernünftiges gefunden. Es wäre natürlich einfacher die Anzahl an Einträgen per Parameter zu übergeben, aber wie kriegt man dies heraus mit dem sizeof-Operator, fallst überhaupt?
To go back to the drawing board is not everyone's cup of tea! :-)

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

6

06.02.2008, 13:41

Cast ?

C-/C++-Quelltext

1
Func2(  reinterpret_cast<MyStruct*>(pClassArray)  )


Oder C-Stiel:

C-/C++-Quelltext

1
Func2(  (MyStruct*)pClassArray  )




//// ############### Sorry ####################

Alles Blödsinn, hab net richtig gelesen

So vieleicht ?

C-/C++-Quelltext

1
2
3
4
Func2(pClassArray[index]->pMemStruct); 

// oder

Func2((pClassArray + index)->pMemStruct);

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

06.02.2008, 13:44

Also erstmal das Problem:

Zitat von »"Progater"«

Es wäre natürlich einfacher die Anzahl an Einträgen per Parameter zu übergeben, aber wie kriegt man dies heraus mit dem sizeof-Operator, fallst überhaupt?


Die Lösung der Wahl wäre in diesem Fall, in der Tat, ein weiterer Parameter der die Anzahl der Arrayeinträge angibt. Mit dem sizeof-Operator kommst du hier nicht besonders weit. Alternativ wäre es aber auch möglich ein std::vector<> zu verwenden.

Zweites Problem:
Du könntest in einer Schleife durch alle pClassArray gezeigten Elemente iterieren und ein weiteres Array mit den Zeigern der jeweiligen MyClass-Elemente anlegen, welches du dann an Func2 übergibst.

Oder du rufst Func2 für jedes Element deines MyClass-Arrays auf. Dann bekommst du, per Iteration, natürlich aber immer nur ein MyStruct-Element übergeben, statt eines ganzen Arrays.
@D13_Dreinig

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

8

06.02.2008, 14:05

Also dies mit einzelnen Elementen geht schon mal gar nicht (aus performance-Gründen). Es muss leider ein vollständiger Array auf einmal übergeben werden.

Zitat von »"David_pb"«


Du könntest in einer Schleife durch alle pClassArray gezeigten Elemente iterieren und ein weiteres Array mit den Zeigern der jeweiligen MyClass-Elemente anlegen, welches du dann an Func2 übergibst.

Du meinst hier ein weiteres Array an MyStruct-Elementen.
Also hier liegt auch das Problem. Ich habe schon Verschiedenes ausprobiert und könnte jetzt zeigen was mir da alles eingefallen ist, aber das tue ich lieber nicht :oops:
To go back to the drawing board is not everyone's cup of tea! :-)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

06.02.2008, 14:11

Pseudocode:

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);
}

void Func2(const std::vector<MyStruct*>& data)
{
    // ...

}


Evtl shared_ptr statt rohen Zeigern verwenden, oder boost::ptr_vector.
@D13_Dreinig

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

10

06.02.2008, 14:26

Jop, ich bedanke mich natürlich, dass du so viel Interesse für mein Problem zeigst. Dieses Vorschlag könnte natürlich gehen, aber leider habe ich nicht erwähnt, dass Func2() auf keine Fall geändert werden kann.
Also ganz klar gesagt, diese Methode stammt aus einer Library, die ich mit der Methode Func sozusagen kapseln möchte. Sorry, dass ich es erst jetzt erwähne :oops:

Zitat von »"David_pb"«

Evtl shared_ptr statt rohen Zeigern verwenden, oder boost::ptr_vector.

Meine Kenntnisse über die STL sind leider sehr begrenzt, da ich sie ziemlich selten verwende. Was heisst den das, wenn ich so dreist fragen darf?
To go back to the drawing board is not everyone's cup of tea! :-)

Werbeanzeige