Christian wrote:
>
> In native Code konnte ich folgendes machen:
>
> void func(char *szResult)
> {
> strcpy(szResult, "ddd");
> };
>
> und die Variable die als szResult übergeben wurde,
> wurde auf ddd gesetzt ...
Das stimmt eigentlich nicht.
Du übergibst hier nicht eine Variable (zumindest keine
Stringvariable), sondern du übergibst die Adresse der
Variablen, also des Arrays in dem du den Text gespeichert
haben möchtest.
Die Adresse die übergeben wird, wird aber nicht geändert.
Dein Aufrufer hat ein Array zur Verfügung:
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
und beim Aufruf wird die Startadresse des Arrays der Funktion
in einer neuen lokalen Variablen szResult zur Verfügung gestellt:
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
^
|
| szResult
| +---------+
+---------o |
+---------+
>
> Managed:
>
> void func(String *strResult)
> {
> strResult = S"123";
> };
>
Hier passiert aber was ganz anderes:
Der Aufrufer hat ein Stringobjekt und einen Pointer darauf:
String* pTest = S"abcd";
pTest
+-------+ +--------+
| o--------->| abcd |
+-------+ | |
+--------+
Während des Aufrufes wird beid er Übergabe wieder eine lokale
Variable angelegt, die die Adresse des Stringobjektes enthält
(im Grunde eine Kopie von pTest)
pTest
+-------+ +--------+
| o--------->| abcd |
+-------+ +->| |
| +--------+
|
strResult |
+-------+ |
| o-------+
+-------+
Du erwartest jetzt, dass bei
strResult = S"123";
der Inhalt des Objektes getauscht wird. Genau das passiert
aber nicht. Es wird ein neues Objekt angelegt und ein
Zeiger darauf in strResult abgelegt
pTest
+-------+ +--------+
| o--------->| abcd |
+-------+ | |
+--------+
strResult
+-------+ +-------+
| o-------->| 123 |
+-------+ | |
+-------+
und damit ist auch klar, dass wenn die Funktion beendet wird
und die lokalen Variablen aufgelöst werden, strResult samt
zugehörigem Objekt (hoffentlich) entsorgt werden und dass
pTest immer noch auf das Objekt verweist auf welches er schon
vor dem Aufruf verwiesen hat.
Was du tun musst: Du musst die Adresse von pTest übergeben, nicht
die Adresse die in pTest enthalten ist.
pTest
+-------+ +--------+
+-->| o--------->| abcd |
| +-------+ | |
| +--------+
|
| strResult
| +-------+
+------o |
+-------+
Jetzt kannst du über strResult direkt den Adresswert in pTest
manipulieren:
Entweder du machst das so:
1 | void func(String ** strResult)
|
2 | {
|
3 | *strResult = S"123";
|
4 | };
|
5 |
|
6 | int main()
|
7 | {
|
8 | String* pTest = S"abcd";
|
9 | func( &pTest );
|
10 | }
|
oder aber mehr C++ like
1 | void func(String * & strResult)
|
2 | {
|
3 | strResult = S"123";
|
4 | };
|
5 |
|
6 | int main()
|
7 | {
|
8 | String* pTest = S"abcd";
|
9 | func( pTest );
|
10 | }
|
Disclaimer: Alles hier beschriebene ist IMHO, da ich weder
Erfahrung mit managed C++ habe noch einsehe, wozu man das
überhaupt braucht. Entweder ich programmiere C++, dann brauche
ich das Zeugs nicht oder aber ich will managed arbeiten. Dann
nehme ich C#