Forum: PC-Programmierung C++/CLI Ausschnitt aus Array an Funktion übergeben


von Boris (Gast)


Lesenswert?

Hallo,

ich stehe da gerade vor einem nicht so leichten Problem mit CLI Arrays.

In C ist ja folgendes möglich:
1
int a[10];
2
...
3
funktionsaufruf(&a[5]);

Ich übergebe also ein Array an eine Funktion, aber nicht komplett, 
sondern erst ab dem 6 Feld.

Aber wie geht das in C++/CLI (.NET). C möchte ich nicht verwenden.
1
array<int> ^a = gcnew array<int>(10)
2
...
3
funktionsaufruf(  ???  )


Hat da jemand eine Idee?

Grüße,
Boris

von Arc N. (arc)


Lesenswert?

Boris schrieb:
> Hallo,
>
> ich stehe da gerade vor einem nicht so leichten Problem mit CLI Arrays.
>
> In C ist ja folgendes möglich:
>
>
1
int a[10];
2
> ...
3
> funktionsaufruf(&a[5]);
>
> Ich übergebe also ein Array an eine Funktion, aber nicht komplett,
> sondern erst ab dem 6 Feld.

Nicht wirklich...

>
> Aber wie geht das in C++/CLI (.NET). C möchte ich nicht verwenden.
>
>
1
array<int> ^a = gcnew array<int>(10)
2
> ...
3
> funktionsaufruf(  ???  )
>
>
> Hat da jemand eine Idee?

interior_ptr<> oder pin_ptr<>, da das ein verwaltetes Array ist und 
somit die GC dazwischenfunken kann.
http://msdn.microsoft.com/en-us/library/y0fh545k.aspx

von Oliver R. (superberti)


Lesenswert?

Hi,

das sieht für mich nach einem typischen Problem aus, wenn man alten 
C/C++ Code nach .NET portiert. Mach es einfach so, wie es auch alle 
.NET-Funktionen bei Array-Teilmengen machen: Offset im Array und Anzahl 
mitgeben!
Und wenn Du keinen triftigen Grund dafür hast C++/CLI zu verwenden, dann 
nimm lieber besser gleich C#, das ist für .NET eindeutig die bessere 
Wahl!

Gruß,

von Boris (Gast)


Lesenswert?

Hallo,

danke für Eure Ideen. Ich habe jetzt tatsächlich das gesamte Array und 
einen Offset übergeben.

Die Sache mit interior_ptr habe ich auch schon gesehen. Das Problem ist 
nur, daß ich dann einen C++ Pointer habe. Würde möglicherweise auch 
gehen, aber spätestens wenn man mit der Compilereinstellung /clr:safe 
compiliert geht weigert sich der Compiler, da Pointer als unsicher 
gelten.

Warum kein C#? Weil ich mich damit erst beschäftigen müßte. Mir 
persönlich gefällt C++ eben besser. Da weiß ich im Normalfall wenigstens 
was ich tue
;-) Außerdem besteht ein anderes Modul des Programms aus Funktionen die 
das Windows API verwenden und nur mit /clr compiliert werden können.

Aber mal so nebenbei: Gibt es für das oben beschriebene Problem den in 
C# eine Lösung ohne einen Offset mit zu übergeben? Einen Offset mit zu 
übergeben bedeutet ja auch, ihn bei jedem Zugriff zum Arraystart hinzu 
zu addieren, was ja eigentlich nunnötig ist, wenn die Referenz gleich 
auf die richte stelle zeigt.

Grüße,
Boris

von Oliver R. (superberti)


Lesenswert?

Hallo Boris,

> Hallo,
>
[...]
>
> Warum kein C#? Weil ich mich damit erst beschäftigen müßte. Mir
> persönlich gefällt C++ eben besser. Da weiß ich im Normalfall wenigstens
> was ich tue

Und genau dort unterliegst Du einer Täuschung! C++/CLI ist etwas 
vollkommen anderes als reines C++. Und mit der Mischung von "altem" 
C/C++ wird das ganze noch viel verwirrender. Der Lernaufwand ist 
keineswegs geringer, als mit C#, im Gegenteil. Gerade .NET-Einsteiger 
verwenden gerne C++/CLI weil man's ja kennt. Die Ernüchterung kommt dann 
ganz schnell beim Zusammenspiel mit dem Framework. Sieht scheiße aus und 
viele Vorteile von C# (IntelliSense, keine Header usw.) verschekt man 
einfach.

> ;-) Außerdem besteht ein anderes Modul des Programms aus Funktionen die
> das Windows API verwenden und nur mit /clr compiliert werden können.
>
> Aber mal so nebenbei: Gibt es für das oben beschriebene Problem den in
> C# eine Lösung ohne einen Offset mit zu übergeben? Einen Offset mit zu
> übergeben bedeutet ja auch, ihn bei jedem Zugriff zum Arraystart hinzu
> zu addieren, was ja eigentlich nunnötig ist, wenn die Referenz gleich
> auf die richte stelle zeigt.

Nein, in reinem .NET gibt es dafür keine Möglichkeit, da Du nur eine 
Referenz auf das GESAMTE Array-Objekt hast. Teilmengen dieser Objekte 
gibt es nicht. Da aber viele Array-Funktionen auch dieses Offset 
benutzen, hält sich die Addiererei in Grenzen. Falls man doch mal in 
Verlegenheit kommt, für native C/C++-Libs Array-Pointer zu benötigen, 
dann bleibt nur die Sache mit den unsafe-Pointern.

Gruß,

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.