Я хочу перевести данные из библиотеки Python в dll C++ для работы с матрицей, а затем получить данные обратно. Я создаю массив (c_double * 102)(c_double(0)) в Python (первый и второй члены массива говорят о размере матрицы).
Из Python у меня есть правильные данные (проверяются более простой функцией, например, суммой элементов массивов). и возвращаю его), но когда я пытаюсь заполнить матрицу, она всегда заполняется нулями.
(код Python):
В Python у меня есть класс, который переводит list(list()) в (c_types * 102)(0) для соединения с моей dll, и вроде как работает правильно. Также я использую указатели для передачи данных
class tu_matrix:
body = (c_double * 102)(c_double(0))
ptr = POINTER(c_double * 102)
def load(self, data = list(list())):
self.data = data
self.n_size = len(data)
self.m_size = len(data[0])
for i in range(self.n_size):
for j in range(self.m_size):
self.body[2+i*self.m_size + j] = c_double(data[j])
ptr = pointer(self.body)
def calcMatrix():
tu_matrix1.load(matrix1)
tu_matrix2.load(matrix2)
# Args for matrix_sum
matrix_lib.matrix_sum.argtypes = [POINTER(c_double * 102),
POINTER(c_double * 102)]
# Return type of matrix_sum
matrix_lib.matrix_sum.restype = POINTER(c_double * 102)
# Получение указателей на массивы
ptr1 = pointer(tu_matrix1.send()) # first array pointer
ptr2 = pointer(tu_matrix2.send()) # second array pointer
# Вызов функции, передающей массивы
result_ptr = matrix_lib.matrix_sum(ptr1, ptr2)
result_array = result_ptr.contents # get content from pointer
# translation to list
list_of_lists = []
for i in range(0, 102, 10):
sublist = [result_array[i + j] for j in range(10) if i + j < 102]
list_of_lists.append(sublist)
print(list_of_lists)
return result_ptr
(функция для преобразования данных):
В моем коде на C++ я заполняю вектор данными из Python и в этот момент ловлю ошибку с неправильными данными . Все в нулях, когда я пытаюсь использовать, я думаю, что проблема с личным классом, потому что простые массивы или типы данных работают нормально.
template
void matrix::arr_to_matrix(double arr[102]) {
this->body.clear();
for (int i = 0; i < (int)arr[0]; i++) {
vector line;
for (int j = 0; j < (int)arr[1]; j++) {
// vec[m] = arr[i * m + j];
line.push_back(arr[2 + i * (int)arr[1] + j]);
}
this->body.push_back(line);
}
this->size_n = (int)arr[0];
this->size_m = (int)arr[1];
this->empty_matrix = false;
this->zero_matrix = false;
this->was_calc_det = false;
}
(функция dll):
static double result[102];
extern "C" __declspec(dllexport) double* matrix_sum(double arr1[102], double arr2[102]) {
// Sum of matrix for python c-types data
matrix m1({ { 1,1 }, { 2,2 } });
matrix m2({ { 1,1 }, { 2,2 } });
m1.arr_to_matrix(arr1);
m2.arr_to_matrix(arr2);
m1 += m2;
int n = m1.line_size();
int m = m1.column_size();
result[0] = n;
result[1] = m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
result[2 + i * m + j] = m1.val(i, j);
}
}
return result;
}
Если я удалю строки m1.arr_to_matrix(arr1); m2.arr_to_matrix(arr2); он инициализируется с помощью списка инициализации и работает правильно, но в этом случае теряется весь смысл создания интерфейса Python. Когда я запускаю программу без Python и проверяю, она работает правильно:
(работает)
int main () {
double* arr1 = new double[102];
double* arr2 = new double[102];
for (int i=0; i
Подробнее здесь: https://stackoverflow.com/questions/791 ... types-data
Инициализация вектора dll с данными ctypes ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Absl::Log Инициализация в DLL завершается сбоем при вызове с использованием ctypes в Windows
Anonymous » » в форуме C++ - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-