Laden...

Pointer und Array in C#

Erstellt von Flite vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.034 Views
F
Flite Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren
Pointer und Array in C#

Hallo!

Ich habe ein kleines Problem mit C#.

Ich möchte eine Funktion mit folgender Definition aufrufen:
[DllImport("FTD2XX.dll")] public static extern int FT_Write(int handle, char* buffer, int BytesToWrite, int* BytesWritten);

Hierzu möchte ich einen Buffer mit 5 deklarieren:
char[] buffer = new char[5];

Dann setze ich den Buffer.
buffer[0] = (char)0x7E;
buffer[1] = (char)10;
buffer[2] = (char)0;
buffer[3] = (char)0;
buffer[4] = (char)0xE7;

Und übergebe dann die Adresse zur Funktion:
int c = FTDI.FT_Write(handle,&buffer,5,&bytesWritten);

Beim Kompilieren kommt dann eine Fehlermeldung:
Argument '2': kann nicht von 'char[]' zu 'char' konvertiert werden

Was mache ich falsch und wie soll ich es richtig machen?

Vielen Dank!
Herzliche Grüße
Flite

17 Beiträge seit 2006
vor 18 Jahren

Hi!

Ändere mal die Funktionsdeklaration zu:

[DllImport("FTD2XX.dll")] public static extern int FT_Write(int handle, string buffer, int BytesToWrite, IntPtr BytesWritten);

Und übergibt statt einem char[] einen string.

F
Flite Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren

Hallo!

Funktioniert leider so nicht. Vielleicht sollte ich folgendes dazusagen:

Die FTD2XX.dll kommt nicht von mir - die ist festgelegt.
In der mitgelieferten Headerdatei ist die Funktion wie folgt definiert.

FT_STATUS WINAPI FT_Write(
FT_HANDLE ftHandle,
LPVOID lpBuffer,
DWORD nBufferSize,
LPDWORD lpBytesWritten
);

Vielleicht hilft das weiter?

Viele Grüße
Flite

S
1.047 Beiträge seit 2005
vor 18 Jahren

Beim Kompilieren kommt dann eine Fehlermeldung:
Argument '2': kann nicht von 'char[]' zu 'char' konvertiert werden

Was mache ich falsch und wie soll ich es richtig machen?

also wenn ich mich richtig an meine c-stunden erinnere, ist ein char[] im grunde das gleiche wie ein char*, von daher hättest du nicht mit dem & operator arbeiten brauchen

der & operator gibt die in dem fall die adresse eines char[] zurück, daher das char[]* was mit einem char** äquivalent wäre... und du brauchst ja nur ein char* =)

ich weiß allerdings nicht wie man das nun in pinvoke umsetzt... zeiger gibts ja nicht mehr, die sind eigentlich nur in unsafe blöcken erlaubt...

vielleicht hilft die diese seite hier weiter http://www.pinvoke.net/
wenn du dir die beispiele anschaust findest du vielleicht einen hinweise dazu, wie du deine datentypen umwandeln mußt

S
8.746 Beiträge seit 2005
vor 18 Jahren

Unter 2.0 sollte es so gehen

[DllImport("FTD2XX.dll")] public static extern int FT_Write(int handle, [in] byte[] buffer, int BytesToWrite, [out] int BytesWritten);

unter 1.1 so:

[DllImport("FTD2XX.dll")] public static extern int FT_Write(int handle, [MarshalAs(UnmanagedType.LPArray)] byte[] buffer, int BytesToWrite, ref int BytesWritten);