Консультация № 184961
26.12.2011, 01:26
0.00 руб.
0 8 0
Здравствуйте! У меня возникли сложности с таким вопросом:
Есть DLL , вот его код подгружу в приложение ,
пробую вызвать из длл функцию вылетает ошибка длл рабочий проверенный
необходимо подгрузить функцию из него

from ctypes import *
lib=windll.NeuroSolutionsAdapter
weightsPath= "C:\Python27\DLL1\DLLM.nsw"
dllpath="C:\Python27\DLL1\DLLM.dll"
import numpy as np
d1=np.zeros(5000000,dtype='d')
d2=np.zeros(5000000,dtype='d')
d3=np.zeros(5000000,dtype='int16')
d4=np.zeros(5000000,dtype='int16')
out='0'
inp='1,5'
print "inp vxod=" + inp
weightsPath= u"C:\Python27\DLL1\DLLM.nsw"
dllpath=u"C:\Python27\DLL1\DLLM.dll"
lib.CalcNeuralNet(dllpath,weightsPath,inp,out)
print "out=" +out ,"inp=" +inp
выводить полную чушь тоесть подаем на вход 1.5 на выходе то буквы не понятна не отрабатывает о
я мне нужно проста подгрузить функцию из это длл которая отрабатывае из другой длл с моими входными значениями


Приложение:
код длл
#include "stdafx.h"
#include "NSNetwork.h"

extern "C" __declspec(dllexport) int __stdcall CalcNeuralNet(
LPCWSTR dllPath_u, LPCWSTR weightsPath_u,
double* inputs, double* outputs)
{
// Преобразуем строки из Unicode в обычные
CString dllPath (dllPath_u);
CString weightsPath (weightsPath_u);

// Создание сети
NSRecallNetwork nn(dllPath);
if (!nn.IsLoaded()) return (1);

// Загрузка весов
if (nn.LoadWeights(weightsPath) != 0) return (2);

// Подача входных данных и расчет выходов
if (nn.GetResponse(1, inputs, outputs) != 0) return (3);

return 0;
}

Обсуждение

давно
Посетитель
7438
7205
26.12.2011, 06:07
общий
Здравствуйте.
Сажу честно, Phithon-а я не знаю, но зато знаю С.
И меня смущают Ваши данные, которые функция CalcNeuralNet ждет как адрес double.
Вот скажите, каков тип переменных inp и out? Чего-то мне кажется, что они - строки.
Возможно, достаточно записать:
out=0
inp=1.5
т.е. без кавычек и с точкой
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
26.12.2011, 06:35
общий
если без кавычек с точкой то так выходит
ArgumentError: argument 3: <type 'exceptions.TypeError'>: Don't know how to convert parameter 3
в теории он не понимает что это
можеть быть вы правы нада задать тип переменной
давно
Академик
20764
1861
26.12.2011, 10:14
общий
Адресаты:
Кончайте спамить. Я уже забыл, когда здесь был последний вопрос по теме.
давно
Посетитель
7438
7205
26.12.2011, 10:39
общий
Адресаты:
Это, по-Вашему, спам? Мне кажется, я по теме...
Только обратил внимание на возможное тонкое место. Высказал свои соображения.
Допускаю, что был неправ. Хотелось как-то оживить обсуждение проблемы.
Вы знаете в чем дело - отвечайте.


Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Академик
20764
1861
26.12.2011, 12:57
общий
Адресаты:
Извините, то, что здесь Python всё-таки присутствует, не заметил.
К сожалению про модуль windll я ничего не знаю - у меня linux. Про его родной механизм рассказать могу, только он куда менее дружелюбный. Вероятно, модуль windll всю чёрную работу и делает.
Но вообще передавать символьные строки вместо чисел - это явная ошибка, и в самом Python это должно вызвать exception (при попытке использования - при передаче ничего не проверяется)
давно
Посетитель
7438
7205
26.12.2011, 16:21
общий
Адресаты:
А какая разница, Windows ли, Linux?
Проблема в том, как правильно задать и передать вещественные числа куда-то средствами Phyton-а
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Академик
20764
1861
26.12.2011, 16:44
общий
Адресаты:
Разница в том, что windll - это внешний модуль, специфический для windows. В стандартном же способе надо сделать целый ряд шаманских действий для регистрации своего модуля, его объектов и методов в интерпретаторе, а самим методам передаются два абстрактных параметра (PyObject *self, PyObject *args), из которых параметры реальные ещё извлечь надо (API для этого, естественно, прилагается) Да и вообще чтобы вызвать из интерпретатора (любого) функцию на C, эту функцию надо писать специальную, да и помимо этого ещё повозиться. Для чего-то существующего надо обязательно писать функцию-прокси. Вероятно, windll всю эту черновую работу и делает, но тогда он должен проверять соответствие списка параметров сигнатуре и в случае несоответствий вызывать exception, как это принято в python
давно
Посетитель
7438
7205
27.12.2011, 16:48
общий
Посмотрите, может это Вам поможет.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа