Вопрос:

Указатель массива от C до D

c arrays pointers d

274 просмотра

1 ответ

125 Репутация автора

Я использую D и взаимодействую с некоторыми библиотеками Си. В результате я должен конвертировать D-массивы в указатели на C (например, short *). В настоящее время я просто разыгрываю их так:

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

Это небезопасно? Я пытался сделать:

myCFunction(&dArray);

Но при этом функция получает int [] * вместо int *. Я вижу, что в C ++ некоторые люди берут первый элемент, подобный этому:

myCFunction(&dArray[0]);

Но разве этот указатель не будет указывать только на первый элемент? Я новичок в указателях и ссылках, поскольку я пришел из мира Java.

Как бы я преобразовал массив в указатель, чтобы я мог передать его в функцию C?

Автор: jython234 Источник Размещён: 22.08.2016 09:25

Ответы (1)


11 плюса

1166 Репутация автора

Решение

В D массив на самом деле (концептуально) это:

struct {
    size_t length;
    void* ptr;
};

Обычный способ получить указатель из массива - использовать поле .ptr. В твоем случае:myCFunction(dArray.ptr);

Но разве этот указатель не будет указывать только на первый элемент

Поскольку элементы хранятся в памяти непрерывно, указатель на первый элемент - это все, что нам нужно. Мы просто добавляем смещение к этому указателю, если хотим получить адреса других элементов.

Еще один момент: обычно, если функция C хочет указатель массива, она также имеет аргумент для длины массива. В большинстве случаев вы можете дать его dArray.length, но иногда он запрашивает размер в байтах, а не количество элементов.

Автор: Cauterite Размещён: 22.08.2016 09:32
Вопросы из категории :
32x32