alexey_public
Когда обращаешься к ДЛЛ она там внутри выделяет сколько ей нужно. Функция возвращает указатель на первый элемент плюс отдельно кол-во элементов. Всё что нам нужно - использовать этот указатель как начало нашего массива в дельфи. Выделять такой же массив второй раз в дельфи и туда копировать содержимое - работает, но это кривовато... Память, выделенная в С, насколько я знаю всегда линейна.
Вот только что проверил другую идею:
в С диначический массив объявлен как указатель, т.е. int *tag;
в интерфейсе к ДЛЛ из дельфи я описываю эту структуру просто как нетипизированный указатель, т.е.
tag : Pointer;
теперь в вызывающей проге создаю
если отключить проверку индексов массива через {$R-}, то всё работает! никаких двойных затрат памяти![](/rotate.svg)
p.s. кстати new считается устаревшим вариантом, рекомендуют SetLength();
Когда обращаешься к ДЛЛ она там внутри выделяет сколько ей нужно. Функция возвращает указатель на первый элемент плюс отдельно кол-во элементов. Всё что нам нужно - использовать этот указатель как начало нашего массива в дельфи. Выделять такой же массив второй раз в дельфи и туда копировать содержимое - работает, но это кривовато... Память, выделенная в С, насколько я знаю всегда линейна.
Вот только что проверил другую идею:
в С диначический массив объявлен как указатель, т.е. int *tag;
в интерфейсе к ДЛЛ из дельфи я описываю эту структуру просто как нетипизированный указатель, т.е.
tag : Pointer;
теперь в вызывающей проге создаю
если отключить проверку индексов массива через {$R-}, то всё работает! никаких двойных затрат памяти
p.s. кстати new считается устаревшим вариантом, рекомендуют SetLength();