Задать вопрос
@LilaznEnzo

Почему не передаётся массив из c++ dll в python? Как реализовать?

Смысл функции в том, чтобы передать размер массива в dll, откуда будет выведен массив передаваемого размера. Массивы изначально рассчитываются в dll. Задача - передать все массивы из dll в python. Но не совсем выходит. Подскажите как сделать верно?

Код Python
def foo (a1):    #Функция, что вызывает функцию из dll с++
    f1.сFoo.restype = POINTER(c_float)
    result = POINTER(c_float)
    result = f1.сArray(a1)
    return result
r = foo(a1)  #a1 - размер массива, который ранее я получаю из того же dll файла


Код в header.h для dll
typedef struct size {
	x1;  //переменная в которую я записываю размер массива, а позже передаю его в py
};
typedef struct data2 {
	float arr[];
};
extern "C" __declspec(dllexport) void .... //просто объявление функций для расчёта


Основной код с расчётами (что к сути вопроса не относятся) на c++ в dll
extern "C" {
	__declspec(dllexport) float* сArray(int size, arr2* data2_arr) //да, в py я передаю одно значение размера, а тут ещё и структура. Но структуру из py мне не нужно передавать. Нужно просто взять из объявленной тут структуры массив и вывести его. Можно ли как то иначе объявить структуру? Учтём, что запись в неё массива ведётся из другой функции
	{
		float* array = new float[size]();
		for (int i = 1; i <= size; i++)
		{
			array[i] = data2_arr->arr[i];
		}
		return array;
	}
}
__declspec(dllexport) void cFoo2(/*иные расчётные переменные*/ size* data2_size, data2* data2_arr)
{
//множество расчётов

data2_size->size = x.size(); //записываю размер вектора x, который и передаётся в py через структуру
copy(x.begin(), x.end(), data2_arr->arr); //копирую вектор x в массив arr. На всякий уточню, я проверял, он копируется верно.
}


Если вызвать функцию cArray из c++ файла с указанием размера и структуры, то всё срабатывает, но мне нужно вывести и записать её не в c++, а вывести из dll в py-файл.
  • Вопрос задан
  • 133 просмотра
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы