Любые вопросы от ПРОФИ к СУПЕРПРОФИ - 1. - страница 20

 

Дано:

В функции init() советника инициализируется MQL-евский генератор ПСП: MathSrand(...). При запуске терминала из шаблона подгружаются несколько (для определенности, пускай три) копии советника. Загрузка происходит быстро, поэтому велика вероятность (на самом деле, почти всегда так и есть) того, что функции TimeLocal() и TimeCurrent() выдают одинаковые значения во всех копиях.

Вопрос:

Какими ухищрениями добиться того, чтобы ГПСЧ инициализировался в разных копиях советника разными числами? Другими словами, где (с минимальными затратами на программирование) добыть элемент случайности?

 
alsu:

Дано:

В функции init() советника инициализируется MQL-евский генератор ПСП: MathSrand(...). При запуске терминала из шаблона подгружаются несколько (для определенности, пускай три) копии советника. Загрузка происходит быстро, поэтому велика вероятность (на самом деле, почти всегда так и есть) того, что функции TimeLocal() и TimeCurrent() выдают одинаковые значения во всех копиях.

Вопрос:

Какими ухищрениями добиться того, чтобы ГПСЧ инициализировался в разных копиях советника разными числами? Другими словами, где (с минимальными затратами на программирование) добыть элемент случайности?

GetTickCount ?
 
sergeev:
GetTickCount ?


может попереть, но не факт...

миллисекунда для программы может быть целой вечностью))

 
alsu:

может попереть, но не факт...
вариант 2 - с помощью глобальных переменных создать "семафоры", для последовательной инициализации экспертов.
 
sergeev:
вариант 2 - с помощью глобальных переменных создать "семафоры", для последовательной инициализации экспертов.
во, это ближе к делу, спасибо.
 

Вопрос по получению строк из dll в mql.

функция mysql_fetch_row из libmysql.dll возвращает тип MYSQL_ROW

Этот тип определен как: typedef char** MYSQL_ROW

как добраться до этого возвращаемого массива строк?

 
Размеры массива известны?
 
Zhunko:
Размеры массива известны?
да, известно число строк.

но длина каждой строки нет.

в том примере по ссылке есть еще одна фигня - получение указателя *lengths.
Получается тоже массив... но как до него добраться...

	unsigned long *lengths;
	lengths = mysql_fetch_lengths(result);
	for(i = 0; i < num_fields; i++)
	{
		printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
	}

вот что получается в MQL при простом передаче результата mysql_fetch_row на string

p0ƒu0ƒ;1;a

где
p0ƒu0ƒ - я так понял адрес (8 байт) нужной строки
;1;a - это её полезные данные


если же присвоить на int, то будет вместо p0ƒ адрес 42152040


	          
 
declspec (dllexport) char* WINAPI Func(const char* szBufString,
                                       const int   nSizeBuf)
 {
  MYSQL_ROW aszString; 
  memcpy_s(szBufString, nSizeBuf + 1, aszString[номер ячейки], strlen(aszString[номер ячейки]));
  return(szBufString);
 }

Если указатель на строку не меняется в процессе работы программы, можно возвращать указатель на строку без копирования в буфер.

declspec (dllexport) char* WINAPI Func()
 {
  MYSQL_ROW aszString;
  return(aszString[номер ячейки]);
 }
 

то есть в MQL никак? даже MQL5 ?

Zhunko:
Если указатель на строку не меняется в процессе работы программы, можно возвращать указатель на строку без копирования в буфер.

просто
return aszString[номер ячейки]
Причина обращения: