2016-08-22 15 views
5

Używam D i interfejs z niektórych bibliotek C. W rezultacie muszę przekonwertować tablice D na wskaźniki C (np. Short *). Obecnie rzuciłem je tak:Tablica wskaźnik od C do D

int[] dArray = [0, 1, 2, 3, 4]; 
myCFunction(cast(int*) dArray); 

Czy to jest niebezpieczne? Próbowałem zrobić:

myCFunction(&dArray); 

Ale to daje funkcję int [] * zamiast int *. Widzę, że w C++ niektórzy biorą pierwszy taki element:

myCFunction(&dArray[0]); 

Ale czy ten wskaźnik nie wskazywałby tylko na pierwszy element? Jestem nowy w odniesieniu do wskaźników i referencji, ponieważ pochodzę ze świata Java.

Jak przekonwertować tablicę na wskaźnik, aby można było przekazać ją do funkcji C?

+2

Czy nie działa funkcja 'myCFunction (dArray)'? –

+1

elementy w tablicy sąsiadują w pamięci, więc '& dArray [0]' jest rzeczywiście adresem tylko do pierwszego elementu; jednak pozostała część elementów to +1, +2, itd. z tego przesunięcia. Ponadto, przekazanie tablicy rozkłada ją na wskaźnik do pierwszego elementu. 'myCFunction (dArray)' lub 'myCFunction (& dArray [0])' powinny działać – yano

+0

@EugeneSh. Tak nie jest. Kompilator skarży się, że funkcja myCFunction (int *) nie przyjmuje parametrów myCFunction (int []); – jython234

Odpowiedz

11

D, tablica jest faktycznie (koncepcyjnie) to:

struct { 
    size_t length; 
    void* ptr; 
}; 

Zwykłym sposobem na uzyskanie wskaźnika z tablicy jest użycie pola .ptr. W twoim przypadku: myCFunction(dArray.ptr);

Ale nie tylko wskazują, że wskaźnik do pierwszego elementu

Ponieważ elementy są przechowywane w sposób zwarty w pamięci, wskaźnik do pierwszego elementu jest wszystko, czego potrzebujemy. Po prostu dodajemy offset do tego wskaźnika, jeśli chcemy uzyskać adresy innych elementów.

Jeszcze jeden punkt: zwykle, jeśli funkcja C chce wskaźnika tablicy, ma również argument dotyczący długości tablicy. W większości przypadków można go podać jako dArray.length, ale czasami jest to pytanie o rozmiar w bajtach, a nie o liczbę elementów.

+1

Również tutaj znajduje się link do specyfikacji: https://dlang.org/spec/arrays.html#array-properties – WebFreak001