Скачать MetaTrader 5

Пример передачи массива на С

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Получи статус продавца и начни продавать свои сигналы!
Forex Trader
114257
Forex Trader 2007.08.09 19:23 
Искал по форуму но так и не нашел. Eсть только как в стеке несколько параметров предать. Может кто носом ткнет или поможет с простым примером желательно на С по передаче и обратному возврату в MT массива данных типа double.

Понимаю что вопрос может и элементарный, но моих знаний и опыта не хватает. Знаю только что есть заморочки с перераспределением памяти и утечкой памяти при некорректной работе приложения с DLL.
Forex Trader
114257
Forex Trader 2007.08.09 21:23  
<папка терминала>\experts\samples\
в папке Dll Sample лежит проект проект dll для Visual C++. Там
есть примеры функций с передачей в dll массивов.
Вот две из них.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC char* __stdcall GetStringValue(char *spar)
  {
   printf("GetDoubleValue takes \"%s\"\n",spar);
   return(spar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetArrayItemValue(const double *arr,const int arraysize,const int nitem)
  {
//----
   if(arr==NULL)
     {
      printf("GetArrayItemValue: NULL array\n");
      return(0.0);
     }
   if(arraysize<=0)
     {
      printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize);
      return(0.0);
     }
   if(nitem<0 || nitem>=arraysize)
     {
      printf("GetArrayItemValue: wrong item number (%d)\n", nitem);
      return(0.0);
     }
//----
   return(arr[nitem]);
  }
Forex Trader
114257
Forex Trader 2007.08.11 01:19  
Огромное спасибо, Lopatin !

Разобрался вроде как .. действительно под носом не заметил.

Только в этом примере к сожалению возврата массива нет,
подскажите можно ли как вернуть новый (пересчитанный)
массив обратно ? и не будет при этом утечки памяти ?
Forex Trader
114257
Forex Trader 2007.08.11 13:46  
Попробуй возвращать массив через параметры функции.
На С например:
__declspec(dllexport) void __stdcall mt4_exp_func(double* out_arr,int arr_size)
{
		for(int i=0;i<arr_size;i++)
			out_arr[i]=i;

}


Тогда на mql4 вызов функции:

 double array[3];
   mt4_exp_func(array,3);


То есть ты передаешь результаты из функции dll в массив array.

Forex Trader
114257
Forex Trader 2007.08.13 01:25  
Массив через параметры функции это как безопасное решение, пока мне этого хватит что бы разобраться ) А далее я так понял нужно через dllmain по завершении работы DLL-ки освобождать память, вопрос остался какие аттрибуты у памяти.


Такой вопрос еще, неделю(!) мучаюсь с lcc-win32 v2.4, и никак не могу добиться, что бы его DLL-ка работала с MT. Вместо пары-тройки мегабайт LCC пришлось разворачивать почти на гиг монстра MSVC. По lcc перечитал все форумы, все без единой ошибки или предупреждения, видна экспортируемая функция (a+b=c), MT с ручным подтверждением запрашивает (в эксперте) загружать функцию, при подтверждении - в журнале пишет ошибку 127. Тот же код почти без усилий компеллирует MSVC и все работает. Мне больше чем lcc и не нужно, может подскажите в чем может быть проблема или кто еще использует такой компайлер.
Forex Trader
114257
Forex Trader 2007.08.13 11:12  
Память работы функции DLL нужно освобождать, если ты в ней выделял память для каких-либо данных. При передаче указателя на массив в mql4 ты получаешь его адрес, при этом выделение памяти в самой dll функции не происходит.
По поводу lcc могу сказать, что им не пользовался. Но предполагаю, что компилятор искажает имя экспортируемой функции (добавляет свои символы к имени функции).
Используй какой-нить дампер (например, tdump или dumpbin) и посмотри в разделе экспорта имя своей функции.
Для того чтобы не компилятор не искажал имя экспортируемой функции можно создать def-файл и включить раздел EXPORTS в котором будет имя функции:
EXPORTS
MyFuncExp,
либо использовать директиву #pragma:
#pragma comment(linker, "/export:MyFuncExp=_MyFuncExp@8") .
ещё можно можно использовать спецификатор extern "C",
например:
extern "C" __declspec(dllexport) int __stdcall MyFuncExp()
{
return 321;
}
Forex Trader
114257
Forex Trader 2007.09.15 00:27  
Такой вопрос еще, неделю(!) мучаюсь с lcc-win32 v2.4, и никак не могу добиться, что бы его DLL-ка работала с MT. Вместо пары-тройки мегабайт LCC пришлось разворачивать почти на гиг монстра MSVC. По lcc перечитал все форумы, все без единой ошибки или предупреждения, видна экспортируемая функция (a+b=c), MT с ручным подтверждением запрашивает (в эксперте) загружать функцию, при подтверждении - в журнале пишет ошибку 127. Тот же код почти без усилий компеллирует MSVC и все работает. Мне больше чем lcc и не нужно, может подскажите в чем может быть проблема или кто еще использует такой компайлер.


Всё просто! LCC по умолчанию экспортирует функции, назначая им имена типа _yourfunc@12, вместо yourfunc. Чтобы заставить его это не делать, достаточно в Project -> Configuration -> Linker установить галку в "Do not include underscores in dll exports".
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий