05. oktober 2006 - 15:42Der er
10 kommentarer og 1 løsning
Import fra unmanaged kode
Hej eksperter
Jeg har følgende funktion i C (defineret i en dll (beagle.dll)):
Beagle c_beagle_open_ext ( int port_number, BeagleExt * beagle_ext );
hvor BeagleExt er en struct defineret ved:
struct BeagleExt { BeagleVersion version; int features; };
hvor BeagleVersion er en struct, der blot indeholder en masse ints.
Jeg vil gerne benytte c_beagle_open_ext i C#, så jeg gør følgende:
[DllImport("beagle.dll")] private static extern int c_beagle_open_ext(int port_number, ref BeagleExt beagle_ext);
Her er BeagleExt en struct i C#, der er defineret nøjagtigt som i C (og med [StructLayout(LayoutKind.Sequential)])
Jeg kalder nu min eksterne funktion med:
BeagleExt be = new BeagleExt(); c_beagle_open_ext(Port,ref be);
Dette går godt forstået på den måde, at den returnerede int er som forventet, og be indeholder den korrekte mængde ints i struct'en BeagleVersion, men features forbliver 0, mens det er forventet, at den skulle være 3. Denne værdi får jeg, hvis jeg kalder funktionen fra et C program. Hvis jeg sætter features til -1 inden kaldet til c_beagle_open_ext, er den også -1 bagefter! C-koden ændrer altså ikke værdien som den burde, og som den gør, når det er et rent C/C++ program.
Er der nogen, der kan give mig en forklaring på, hvad der er galt?!?!?
hmm... structsene er erklæret som: [StructLayout(LayoutKind.Sequential)] private struct BeagleExt { public BeagleVersion version; public UInt32 features; } [StructLayout(LayoutKind.Sequential)] struct BeagleVersion { public UInt16 software; public UInt16 firmware; public UInt16 hardware; public UInt32 hw_revs_for_sw; public UInt32 drv_revs_for_sw; public UInt16 api_req_by_sw; };
I C er der brugt u16 og u32 (som jeg går ud fra er defineret som hhv 16 og 32 bits unsigned integers)
Kan der så være noget galt her ift. det du skriver?
Hmm... Det ser ud til at virke, når Pack=1 begge steder, men jeg forstår altså ikke helt hvorfor?! Alle de benyttede data er enten 2 eller 4 bytes, så hvor mange måder kan der lige være at lægge det i hukommelsen på? Det er compileren, der står for det ikke?
Smid et svar og du får nogle meget velfortjente point :)
hvis du har et array med en million elementer og der er noget i den som ligger skævt så kan det koste rigtigt meget i performance - har du en enkelt struct med noget som ligger skævt betyder det intet
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.