Эксперт-убийца терминала...

 
После перехода на билд 188 от 17.01 возникла проблема - при тестировании эксперта терминал намертво зависал. До апдейта проблемы не было. Стандартные эксперты проходили тестирование без проблем...

В общем, после несколькочасовой локализации проблемы имеем:

int init()
  {
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
   string c = "DeltaClose = " + DoubleToStr(GetDeltaClose2(), 6);
   f2(c);
   return(0);
  }

double GetDeltaClose1() {
	return(Close[1] - Close[2]);
}

double GetDeltaClose2(int dShift = 1) {
	return(Close[dShift] - Close[dShift + 1]);
}

bool f1(string cOperation) {
	if (false) {
		f2("aaa");
	}
	return(true);
}

bool f2(string cMessage) {
	if (false) {
		f1("bbb");
	}
	return(true);
}



Компиляция такого эксперта проходит без проблем, но попытка его тестирования приводит к смерти терминала. При этом, если в start() заменить GetDeltaClose2() на GetDeltaClose1(), то вместо зависания имеем

There has been a critical error
Time        : 2006.01.19 02:31
Program     : Client Terminal
Version     : 4.00 (build: 188, 17 Jan 2006)
Owner       : MetaQuotes Software Corp. (MetaTrader)
OS          : Windows XP Professional 5.1 Service Pack 2 (Build 2600)
Processors  : 1, type 586, level 6
Memory      : 261616/84672 kb
Exception   : C0000005
Address     : 004614EE
Access Type : write
Access Addr : 00000000

Registers   : EAX=02490090 CS=001b EIP=004614EE EFLGS=00010217
            : EBX=016E62B0 SS=0023 ESP=01E1BC90 EBP=00E33210
            : ECX=00000005 DS=0023 ESI=00E8F110 FS=003b
            : EDX=00000016 ES=0023 EDI=00000000 GS=0000

Stack Trace : 00000000 E5400000 C70C468A 00000000
            : 00000000 00000000 00000000 00000000
            : 00000000 00000000 00000000 00000000
            : 00000000 00000000 00000000 00000000
Modules     :
          1 : 00400000 00286000 C:\Program Files\MetaTrader 4\terminal.exe
          2 : 01B00000 00006000 C:\Program Files\Punto Switcher\correct.dll
          3 : 10000000 00005000 C:\WINDOWS\system32\prio.dll
          4 : 20000000 002CD000 C:\WINDOWS\system32\xpsp2res.dll
          5 : 5B260000 00038000 C:\WINDOWS\system32\UxTheme.dll
          6 : 61EC0000 0000E000 C:\WINDOWS\system32\MFC42LOC.DLL
          7 : 698B0000 00058000 C:\WINDOWS\system32\hnetcfg.dll
          8 : 71A30000 00040000 C:\WINDOWS\system32\mswsock.dll
          9 : 71A70000 00008000 C:\WINDOWS\System32\wshtcpip.dll
         10 : 71A80000 00008000 C:\WINDOWS\system32\WS2HELP.dll
         11 : 71A90000 00017000 C:\WINDOWS\system32\WS2_32.dll
         12 : 72CD0000 00008000 C:\WINDOWS\system32\msacm32.drv
         13 : 72CE0000 00009000 C:\WINDOWS\system32\wdmaud.drv
         14 : 73D90000 000FE000 C:\WINDOWS\system32\MFC42.DLL
         15 : 746E0000 0004B000 C:\WINDOWS\system32\MSCTF.dll
         16 : 76350000 00005000 C:\WINDOWS\system32\MSIMG32.dll
         17 : 76380000 00049000 C:\WINDOWS\system32\comdlg32.dll
         18 : 76B20000 0002E000 C:\WINDOWS\system32\WINMM.dll
         19 : 76C20000 0002E000 C:\WINDOWS\system32\WINTRUST.dll
         20 : 76C80000 00028000 C:\WINDOWS\system32\IMAGEHLP.dll
         21 : 77110000 0008C000 C:\WINDOWS\system32\OLEAUT32.dll
         22 : 773C0000 00102000 C:\WINDOWS\WinSxS\X86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\COMCTL32.dll
         23 : 774D0000 0013D000 C:\WINDOWS\system32\ole32.dll
         24 : 77A70000 00095000 C:\WINDOWS\system32\CRYPT32.dll
         25 : 77B10000 00012000 C:\WINDOWS\system32\MSASN1.dll
         26 : 77BC0000 00007000 C:\WINDOWS\system32\midimap.dll
         27 : 77BD0000 00015000 C:\WINDOWS\system32\MSACM32.dll
         28 : 77C00000 00058000 C:\WINDOWS\system32\msvcrt.dll
         29 : 77D30000 00090000 C:\WINDOWS\system32\USER32.dll
         30 : 77DC0000 000AC000 C:\WINDOWS\system32\ADVAPI32.dll
         31 : 77E70000 00091000 C:\WINDOWS\system32\RPCRT4.dll
         32 : 77F10000 00046000 C:\WINDOWS\system32\GDI32.dll
         33 : 77F60000 00076000 C:\WINDOWS\system32\SHLWAPI.dll
         34 : 7C800000 000F6000 C:\WINDOWS\system32\kernel32.dll
         35 : 7C900000 000B1000 C:\WINDOWS\system32\ntdll.dll
         36 : 7C9C0000 00818000 C:\WINDOWS\system32\SHELL32.dll

Call stack  :
0045C5A0:4F4E [004614EE] ?ExecuteRecursive@CExpertInterior



В общем, большой радости мне это все не принесло... Хотелось бы комментариев - может, я где-то ошибаюсь?..

 
Обязательно проверим. Спасибо за локализацию.
 
Ещё раз спасибо за код. Проблему устранили. Это - наша ошибка, а не Ваша
 
Пожалуйста. Я ведь тоже должен приносить какую-то пользу ;)
Я не понаслышке знаю, что такое разобрать 30 кБ чужого кода, чтобы докопаться до истины.

Отдельное спасибо за Ваш труд, а я готов всегда помогать по мере возможности.
 
Я уже отправил форму с ошибко - ерунда с рекурсией и параемтрами массива.
Сейчас сижу и думаю как переделать удобный рекурсивный вызов в индикаторе на какое-нибудь извращение и надеюсь на скорый выход следующего билда с исправлениями :-(
Ниже - текст индикатора с комментариями.
/*
Бага компилятора: несовместимость рекурсии и элемента массива в параметре.
Пример приведен ниже.  В билде 186 всё работало "на ура" ... Но больше всего поразило то, что ошибка проявляется даже отсутствии рекурсии в резльтирующем коде (линкер убирает рекурсивную функцию как неиспользуемую).
Эффект залючается в зависании териминала при попытке присоединения индикатора к графику.
Для устранения эффекта в примере достаточно либо закомментировать рекурсивный вызов либо вместо строчки с комментарием "freezes indicator" раскомментировать строчку "works good"
Далее пример: 

*/
#property indicator_separate_window
#property indicator_buffers 1

//---- indicator buffers
double buffer1[];

string test1[3];

//-- Initialization ----------------------------------
int init() {

  //---- additional buffers are used for counting
  IndicatorBuffers(1);

  //---- indicators
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(0,buffer1);

  for(int p=0; p < 3; p++) {
    test1[p] = "s" + p;
  }
  
  return(0);
}

//-- Finalization ----------------------------------
int deinit() {  return(0); }
  
//-- Recursive function ----------------------------
int SelfCall() {

  if(false) return( SelfCall() ); 
    
  return (1);
}

//-- Called function -------------------------------
int Sub1(string sParam)
{
  Print("Sub1 called!!");
  return( StringLen(sParam) );
}
 
//-- Callee function ----------------------------------
int Sub2(int i1, int i2, int i3) {
  Print("Sub2 called");
  string s = test1[i1];
  int retVal;
  //retVal = Sub1(s); // works good
  retVal = Sub1( test1[i1]); //freezes indicator
  return( retVal );
}   
  
//-- Indicator start ----------------------------------
int start() {
  
  int i = Sub2(0,0,0);

//----
  return(0);
  
}
//+------------------------------------------------------------------+


На всякий случай, чтоб никто лишний раз голову не ломал,почему у него всё валится. :-)

 
УРА!
Наткнулся на новость про обновление билда:
"Выпущен мобильный терминал MetaTrader 4 Mobile build 188"
Скачал - поставил - всё заработало.

Спасибо Metaquotes за оперативное исправление! :-)

Буду искать следующую ошибку ;-)))
 
Точнее - "Выложен обновленный билд 188"

Всё! спать! :-))
Причина обращения: