Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов DLL, c передачей указателей в функцию 
:(
    Опции темы
And_
Дата 18.3.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Приветствую.
Помогите решить следующую проблему.
Хочу использовать нейросеть из нейропакета NeuroShell2 в проекте Delphi. Для этого существуют 3 функции, которые содержаться в NS2-32.dll
Из help-а нейрошела:

Цитата

OpenNet - Эта функция читает .DEF-файл и создает сеть. Она возвращает номер сети для дальнейших ссылок на эту сеть. Она также возвращает
количество входов, ожидаемых сетью, и количество выходов, на которых будут появляться ответы сети.

Прототипы и полные описания функций DLL для языка Си

OpenNet

int far PASCAL _export OpenNet(char far *defpath, int far *netnumber, int far *inputs, int far *outputs);


*defpath - это указатель на строку символов, содержащую путь к .DEF-файлу. Если путь содержит только имя файла, то этот файл должен быть
в текущем каталоге.

*netnumber - это указатель на целое число в Вашей программе, куда OpenNet поместит номер сети, который Вы будете использовать для
указания на сеть в функциях FireNet и CloseNet.

*inputs - это указатель на целое число в Вашей программе, куда OpenNet поместит ожидаемое сетью количество входов.

*outputs - это указатель на целое число в Вашей программе, куда OpenNet поместит ожидаемое количество выходов сети.


Если код возврата OpenNet отличен от нуля, это обычно происходит потому, что OpenNet не смогла найти действительного .DEF-файла в месте,
указанном переменной defpath.


Вот мой код, из которого пытаюсь вызвать функцию OpenNet.

Код

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses useNS2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  net_num, n_in, n_out: Integer;
begin
  nsOpenNet('C:\SOM1.DEF',net_num,n_in,n_out);
end;

end.


Код

unit UseNS2;

interface
  uses
  Dialogs, SysUtils;

  function OpenNet(defpath: pointer; netnumber: pointer;
                                  inputs: pointer; outputs: pointer): Integer;
  procedure nsOpenNet(DefPath: String; NetNum: Integer;
                        n_In: Integer; n_Out: Integer);

implementation
    function OpenNet; external 'NS2-32.dll';


procedure nsOpenNet(DefPath: String; NetNum: Integer;
                        n_In: Integer; n_Out: Integer);
var
  pDefPath: ^string;
  pNetNum,pn_In,pn_Out: ^Integer;
  r: Integer;
begin
  pDefPath := @DefPath;
  pNetNum  := @NetNum;
  pn_In    := @n_In;
  pn_Out   := @n_Out;

  ShowMessage(IntToStr(OpenNet(pDefPath,pNetNum,pn_In,pn_Out)));
end;


end.


Код возврата у меня всегда -65495. DEF-файл по указанному пути присутствует.
Посмотрите, не нахомутал ли я чего с указателями?
PM MAIL   Вверх
bems
Дата 18.3.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



нахомутал. pDefPath := @DefPath; неверно
Верно так pDefPath := pointer(DefPath);

Добавлено через 3 минуты и 42 секунды
и конвенцию pascal укажи


--------------------
Обижено школьников: 8
PM MAIL   Вверх
And_
Дата 18.3.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Цитата(bems @  18.3.2009,  19:25 Найти цитируемый пост)
и конвенцию pascal укажи 


А это еще что за зверь? 
Если можно, на пальцах, пожалуйста smile 
PM MAIL   Вверх
bems
Дата 18.3.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Код

function OpenNet(defpath: pointer; netnumber: pointer;
                                  inputs: pointer; outputs: pointer): Integer; pascal;


Добавлено через 2 минуты и 42 секунды
и вместо этого
pDefPath: ^string;

это:
pDefPath: PChar;

Это сообщение отредактировал(а) bems - 18.3.2009, 20:01


--------------------
Обижено школьников: 8
PM MAIL   Вверх
And_
Дата 18.3.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Поправил, ничего не изменилось. Функция возвращает -65495
PM MAIL   Вверх
bems
Дата 18.3.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



и обертка написана так, что даже когда візов функции из длл пройдет нормально, ее результаты не выдут за пределы обертки
Переделай хотя бы так
Код

procedure nsOpenNet(DefPath: String; out NetNum, n_In, n_Out: Integer);


Добавлено через 4 минуты и 44 секунды
дельфи случайно не 2009?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
And_
Дата 18.3.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



да, 2009
PM MAIL   Вверх
bems
Дата 18.3.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



тогда все свои string попробуй поменять на AnsiString

Добавлено через 1 минуту и 36 секунд
ну и до кучи pDefPath: PChar; меняй на pDefPath: PAnsiChar;


--------------------
Обижено школьников: 8
PM MAIL   Вверх
And_
Дата 18.3.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Заменил. Результат тот же ((
PM MAIL   Вверх
bems
Дата 18.3.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



гммм

давай сюда свою длл


--------------------
Обижено школьников: 8
PM MAIL   Вверх
And_
Дата 18.3.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Вот.
Там длл, русский хэлп, и som.def - файл с нейросетью.

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  NS2_32.rar 331,18 Kb
PM MAIL   Вверх
bems
Дата 18.3.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



а какие правильный значения n_In, n_Out?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
And_
Дата 18.3.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Функция должна записать в эти переменные такие значения: n_In=16, n_Out=15. 
Эти значения берутся из прочитанного .def файла.

Это сообщение отредактировал(а) And_ - 18.3.2009, 21:28
PM MAIL   Вверх
bems
Дата 18.3.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Посмотрел я хелп и понял - оно достаточно древнее чтобы 32-битный код был вновинку. Вопервых эта функция (несмотря на то, что там в хелпе) явно не pascal. Вроде бы stdcall, хотя не уверен. Так она хотя бы работае. Второе - она рабртает с 16-битными целыми (то есть прототип который они дают в хелпе остался от 16-битной версии длл-ки)

Короче правильное решение здесь - поискать чего-нибудь  посвежее, и с более тщательной докумеентацией.
А не "правильное" решение (решение "шоб работало"), вот оно:

Код

unit UseNS2;

interface

uses Dialogs, SysUtils, Windows;

function OpenNet(defpath: PAnsiChar; netnumber, inputs, outputs: PSmallInt): SmallInt; stdcall;

procedure nsOpenNet(const DefPath: AnsiString; out NetNum, n_In, n_Out: Integer);

implementation

function OpenNet; external 'NS2-32.dll';

procedure nsOpenNet(const DefPath: AnsiString; out NetNum, n_In, n_Out: Integer);
begin
  ShowMessage(IntToStr(OpenNet(PAnsiChar(DefPath), @NetNum, @n_In, @n_Out)));
  NetNum := NetNum and $0000FFFF;
  n_In := n_In and $0000FFFF;
  n_Out := n_Out and $0000FFFF;
end;
end.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
And_
Дата 18.3.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Да, вот теперь ноль возвращает. 
Спасибо, земляк, за то что времени не пожалел. ))
Мне, правда, непонятны некоторые танцы с бубном - сам бы не сделал, естественно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0960 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.