ошибка C00000FD

 

Всех приветствую.


Пользуясь вот этим примером https://www.mql5.com/ru/articles/18 написал небольшую dll'ку в VS Express 2010 для того, чтобы заменить одну из функций своего советника (а при удачном раскладе перенести удачный опыт на всю остальную вычислительную часть).


В длл функция у меня объявлена так:

extern "C" __declspec(dllexport) int __stdcall Criterion(int &TradeSignal)

{

бла бла бла

и в конце:

return(TradeSignal);

}

TradeSignal - это торговый сингнал, который предполагается использовать далее. Он принимает значения 10 (покупай), 20 (продавай) и 0 (кури бамбук).

Название функции я также прописал в def файле (до того она выдавала ошибки 126 и 127, но по форуму я вроде с ними разобрался) и прицепил этот .деф к своему проекту, скомпилировал все вместе.

Из советника функция объявлена так:

#import "MyFirstDll.dll"
int Criterion(int& TradeSignal);

#import


а потом вызывается:

int start()

бла бла бла

TradeSignal=Criterion(TradeSignal);


Вроде все по примерам с форума и из статьи... но в итоге получаю:


There has been a critical error
Time : 2010.06.21 01:28
Program : Client Terminal
Version : 4.00 (build: 226, 24 Mar 2009)
OS : Windows XP Professional 5.1 Service Pack 3 (Build 2600)
Processors : 2 x X86 (level 6)
Memory : 2097151/2097151 kb

Exception : C00000FD

Причем нигде не могу найти описания, что такое C00000FD везде написано про другие ошибки...

Подскажите горе-программеру, что делать, пожаллста. :(


 
как устоявшийся совет - попробуйте на предыдущем билде проделать этот бла бла бла.
 
sergeev:
как устоявшийся совет - попробуйте на предыдущем билде проделать этот бла бла бла.

Понятно, думал без этого можно будет обойтись.

Сейчас попробуем все подчистить...

 

Да, кстати, ошибка выходит при оптимизации.

При обычной штатной работе еще не пробовал...


*ушел все сносить и чистить реестр*

 

Ситуация не изменилась... Кроме того, т.к. рынок открылся, проверил ЕА и на "живом" графике - то же самое, вылетает с критом:


There has been a critical error
Time : 2010.06.21 02:43
Program : Client Terminal
Version : 4.00 (build: 224, 15 May 2009)
OS : Windows XP Professional 5.1 Service Pack 3 (Build 2600)
Processors : 2 x X86 (level 6)
Memory : 2097151/2097151 kb
Exception : C00000FD
Address : 10011917
Access Type : NA
Access Addr : 00000000

Registers : EAX=03012000 CS=001b EIP=10011917 EFLGS=00010206
: EBX=FFFFFFFF SS=0023 ESP=0310FAD0 EBP=0310FAD8
: ECX=02D3F034 DS=0023 ESI=010EE310 FS=003b
: EDX=0116AA58 ES=0023 EDI=00000000 GS=0000

Stack Trace : 004587D5 00463D37 004555B1 7C80B729
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000


... и далее список длл"ек.

 

skakoon:

В длл функция у меня объявлена так:

extern "C" __declspec(dllexport) int __stdcall Criterion(int &TradeSignal)

{

бла бла бла

и в конце:

return(TradeSignal);

}

TradeSignal - это торговый сингнал, который предполагается использовать далее. Он принимает значения 10 (покупай), 20 (продавай) и 0 (кури бамбук).

Название функции я также прописал в def файле (до того она выдавала ошибки 126 и 127, но по форуму я вроде с ними разобрался) и прицепил этот .деф к своему проекту, скомпилировал все вместе.

Из советника функция объявлена так:

#import "MyFirstDll.dll"
int Criterion(int& TradeSignal);

#import
 

....................................................

Ситуация не изменилась... Кроме того, т.к. рынок открылся, проверил ЕА и на "живом" графике - то же самое, вылетает с критом:


 Попробуйте так :


extern "C" __declspec(dllexport) int __stdcall Criterion(int TradeSignal)

{

бла бла бла

и в конце:

return(TradeSignal); 

}



Из советника :

#import "MyFirstDll.dll"
int Criterion(int TradeSignal);

#import



а потом вызывается:

int start() 

бла бла бла

TradeSignal=Criterion(TradeSignal);

Удачи. 

 
VladislavVG:

Попробуйте так :

Удачи.



Да, попробовал заменить обращение к переменной по ссылке, на обращение по значению, но вроде ничего не изменилось. В статье вроде говорится, что простые переменные можно вызывать и по ссылке, и по значению. Еще я пробовал ставить return(0) вместо return(TradeSignal)...

М.б. код какой-то в целом неверный?... дело в том, что там есть один массив, я его элементы рассчитываю вне функции, а в функции он просто определен, так, что она вроде (по моему замыслу...) при импорте должна брать внешние элементы массива и работать с ними...

Вот такой код в целом, элементы массива я выделил (код приведен с поправкой на вызов переменной по значению).

Сама функция - это по сути две МАшки (одна чуть быстрее, со сдвигом; а вторая медленнее). Пересекаясь, они и генерят первичные сигналы, которые потом фильтруются советником...

extern "C" __declspec(dllexport) int __stdcall Criterion(int TradeSignal)
{
//---- indicator Red parameters
double ExtMapBufferRed; //--значение Bear Average
double sumRed=0;
int iRed;
int posRed; //-- Индекс первого непросчитанного бара для медвежьей линии
//---- indicator Green parameters
double sumGreen=0;
double ExtMapBufferGreen; //--значение Bull Average
int iGreen;
int posGreen;
int TrendStatus[1000000]; //Массив статусов "Bull" или "Bear"
int TrendStatusIndex=1; // Вспомогательная переменная массива значений тренда
//------- Глобальные массивы данных, которыми будет оперировать динамическая библиотека -------------------+
double iCloseH1[10]; // Массив цен закрытия баров для расчетов на графике периода Н4
//---- initial accumulation----------------------------------------------------------------------------------------------------------------------------------------------------//
posRed=9; //-- Выбирается бар №9 [период Bear + сдвиг Bear].
for(iRed=1;iRed<7;iRed++,posRed--) //-- Просуммированы последние 6 баров (от 9го до 2го);
{
sumRed+=iCloseH1[posRed-1];
}
posGreen=3;
for(iGreen=1;iGreen<3;iGreen++,posGreen--) //-- Просуммированы последние 6 баров (для iRed от 1 до 6);
{
sumGreen+=iCloseH1[posGreen];
}
//---- main calculation loop--------------------------------------------------------------------------------------------------------------------------------------------------//
sumRed+=iCloseH1[posRed-1]; //--Для posRed= 3 и 2 прибавляем значение бара[posRed]...
ExtMapBufferRed=(sumRed/7); //--... рассчитываем среднее значение баров...
sumRed-=iCloseH1[posRed+7]; //--... и убираем бары №11, и №10
posRed--;

while(posGreen>=0)
{
sumGreen+=iCloseH1[posGreen];
ExtMapBufferGreen=sumGreen/3;
sumGreen-=iCloseH1[posGreen+2];
posGreen--;
}
//----Вычисление торговых критериев
if (ExtMapBufferGreen>ExtMapBufferRed) TrendStatus[TrendStatusIndex]=10; // Если Bull > Bear то тренд Bull
if (ExtMapBufferGreen<ExtMapBufferRed) TrendStatus[TrendStatusIndex]=20; // Если Bull < Bear то тренд Bear
if (ExtMapBufferGreen==ExtMapBufferRed) TrendStatus[TrendStatusIndex]=TrendStatus[TrendStatusIndex-1]; // Если Bull = Bear то тренд такой же, как был до того

if (TrendStatusIndex<100000)TrendStatusIndex++; else TrendStatusIndex=1;

if (TrendStatus[TrendStatusIndex-2]==20 && TrendStatus[TrendStatusIndex-1]==10) TradeSignal=10; // 10 - открытие Buy
if (TrendStatus[TrendStatusIndex-2]==10 && TrendStatus[TrendStatusIndex-1]==20) TradeSignal=20; // 20 - открытие Sell
if (TrendStatus[TrendStatusIndex-2]==TrendStatus[TrendStatusIndex-1]) TradeSignal=1; // 1 - значимых критериев нет, обнуляем торговый критерий
return(TradeSignal);
}




 
В статье есть описание примера работы с массивом, но там, как я понимаю, массив наоборот заполняется в dll и передается из нее в эксперт... так что тот пример,видимо, не подходит для данного случая...
 
skakoon:

Вот такой код в целом, элементы массива я выделил (код приведен с поправкой на вызов переменной по значению).

Сама функция - это по сути две МАшки (одна чуть быстрее, со сдвигом; а вторая медленнее). Пересекаясь, они и генерят первичные сигналы, которые потом фильтруются советником...




Не понятно как цены закрытия попадают в локальный массив 

double iCloseH1[10]; - он описан внутри функции 

extern "C" __declspec(dllexport) int __stdcall Criterion(int TradeSignal){}

Это, наверное, не весь код модуля - здесь, на первый взгляд, проблем не видно. Единственно, что Вы будете суммировать мусор из массива  iCloseH1 так как обнуление его при декларации не гарантировано.

Удачи. 

 
VladislavVG:


Не понятно как цены закрытия попадают в локальный массив

double iCloseH1[10]; - он описан внутри функции

extern "C" __declspec(dllexport) int __stdcall Criterion(int TradeSignal){}

Это, наверное, не весь код модуля - здесь, на первый взгляд, проблем не видно. Единственно, что Вы будете суммировать мусор из массива iCloseH1 так как обнуление его при декларации не гарантировано.

Удачи.


Да, судя по всему проблема в этом ... к сожалению, это в общем почти весь код модуля ... я думал, что передача данных осуществляется проще, т.е. библиотека сама их подхватит.

Нашел несколько похожих тем на форуме про передачу double массивов в длл, попытаюсь разобраться... было бы проще если бы где-то были выложены коды ошибок с расшифровкой.


Спасибо большое, что потратили время, постараюсь разобраться )

 
VladislavVG:


Не понятно как цены закрытия попадают в локальный массив

double iCloseH1[10]; - он описан внутри функции

Это, наверное, не весь код модуля - здесь, на первый взгляд, проблем не видно. Единственно, что Вы будете суммировать мусор из массива iCloseH1 так как обнуление его при декларации не гарантировано.

А прошу прощения не сразу понял вопрос.


Массив с таким же именем был объявлен в качестве внешнего в теле эксперта:

double iCloseH1[10], // Массив цен закрытия баров для расчетов на графике периода Н1

int i; // Счетчик для наполнения массивов

start()

{

for (i=0; i<10; i++)
{
iCloseH1[i]=iClose("EURUSD", PERIOD_H1,i);

}

TradeSignal=Criterion( TradeSignal); // -- вызов функции из длл

бла бла бла


Ну и примерно такой же вариант кода был с ArrayCopySeries()

За совет спасибо, за обнулением при декларации прослежу..

Причина обращения: