Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Pointer und Array in C#
Flite
myCSharp.de - Member



Dabei seit:
Beiträge: 22

Themenstarter:

Pointer und Array in C#

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Jason
myCSharp.de - Member

Avatar #avatar-1841.gif


Dabei seit:
Beiträge: 17

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Flite
myCSharp.de - Member



Dabei seit:
Beiträge: 22

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sheitman
myCSharp.de - Member



Dabei seit:
Beiträge: 1.047

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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);
private Nachricht | Beiträge des Benutzers