импорт из DLL - страница 2

 

alexjou 19.03.2006 03:44
Нормально воспринимается в качестве возврата функции из импортированной DLL только int.
А double? То есть для дробных чисел надо делать арифметику с масштабированием? У меня возвращаются почти исключительно double. Никаких несообразностей пока что не замечал. Может, я что-то не так делаю?
Александр, я скомпелировал DLL код DCT-преобразования, который Вы приводили на форуме. Но индикатор сделать ну никак не выходит. Не приведете текст mq4, был бы крайне признателен. Где то наверняка подводные камни в передаче параметров и возвращаемых значений.
Будет наглядный пример работы с DLL.
 
RickD:
string нужно возвращать как char*.
Увы, нет. Тип string - это структура, содержащая два разнотиповых поля (int и char*), насколько я понял. Следовательно размерность типов не будет соотвествовать и просто потеряется часть адреса. В таких случаях обычно возвращают void* и потом преобразовывают к типу данных (разве что можно создать тип, который будет виден обоими компиляторами ;) ). В СС++ без проблем, а вот с учетом отсутствия в MQL4 возможности создавать свои типы и такой функции как sizeof(), да и просто без должного опыта работы с адресной арифметикой этим просто вредно заниматься. Попытайтесь обойтись стандартными типами данных.

Удачи и попутных трендов.
 
Вы вообще про std::string говорите или другой тип?

VladislavVG:
RickD:
string нужно возвращать как char*.
Увы, нет. Тип string - это структура, содержащая два разнотиповых поля (int и char*), насколько я понял. Следовательно размерность типов не будет соотвествовать и просто потеряется часть адреса. В таких случаях обычно возвращают void* и потом преобразовывают к типу данных (разве что можно создать тип, который будет виден обоими компиляторами ;) ). В СС++ без проблем, а вот с учетом отсутствия в MQL4 возможности создавать свои типы и такой функции как sizeof(), да и просто без должного опыта работы с адресной арифметикой этим просто вредно заниматься. Попытайтесь обойтись стандартными типами данных.

Удачи и попутных трендов.
 
RickD:
Вы вообще про std::string говорите или другой тип?
Нет, про тот, что в МQL4.

Удачи и попутных трендов.
 
Так вам же пример вместе с МетаТрейдером поставляют:

MT4_EXPFUNC char* __stdcall GetStringValue(char *spar) { printf("GetStringValue takes "%s"n",spar); return(spar); }


VladislavVG:
RickD:
Вы вообще про std::string говорите или другой тип?
Нет, про тот, что в МQL4.

Удачи и попутных трендов.
 
Александр, я скомпелировал DLL код DCT-преобразования, который Вы приводили на форуме. Но индикатор сделать ну никак не выходит. Не приведете текст mq4, был бы крайне признателен. Где то наверняка подводные камни в передаче параметров и возвращаемых значений.
Будет наглядный пример работы с DLL.
Это крохотный кусочек большой библиотеки. Сделаю в наипростейшем виде и выложу здесь же.
 
Вот нашел у себя в архиве написанный во времена оны индикатор полностью на MQL. Выкладываю исходник и свежетранслированный. Подробнее о DCT-преобразовании:
1. The JPEG Still Picture Compression Standard / Gregory K. Wallace / IEEE Trans. on Consumer Electronics, December 1991
2. Форматы и алгоритмы сжатия изображений в действии / Дж. Миано / Addison-Wesley - "Триумф", М., 2003
3. MATLAB v. 6.0, v. 6.5, and later Help Files / Toolboxes: Signal Processing ToolBox; Image Processing ToolBox; Wavelet Toolbox; and some others / PDF help files are also available at: http://www.mathworks.com
Файлы:
dct.zip  15 kb
 
RickD:
Так вам же пример вместе с МетаТрейдером поставляют:
Возможно, Вы правы - нужно проверить. Тогда непонятно высказывание метаквотсов о невозможности передачи типов кроме int, double. И о том, что тип string - это их внутренний тип данных (смотрите посты выше по ветке) также наличие прагмы в тех же примерах (как раз описывает тип стринг). Возможно, пример показывает как передавать строковые константы в среду СС++ - хотя зачем тогда возвращаемый адрес ? - в любом случае нужно проверить.

Удачи и попутных трендов.
 
alexjou:
Вот нашел у себя в архиве написанный во времена оны индикатор полностью на MQL. Выкладываю исходник и свежетранслированный. Подробнее о DCT-преобразовании
Александр
Спасибо что откликнулись на мою просьбу.
Вообще суть просьбы была в другом.
Я сам не программист, но на работе мне написали DLL, вписав Ваши коды в пример из поставки МТ - sample_DLL. Я попробовал написать индикатор и у меня получается, что DLL доступна программе, а вот функция не вызывается GetDiffrDCTS(), о чем пишется в лог файл.
Я никогда еще не писал индикаторы с использованием DLL, и поэтому попросил Вас привести пример данного индикатора на mql именно с использованием DLL. Потом уже было место к размышлению и самостоятельному творчеству.

Поскольку с DLL пока не вышло я переписал коды (те что Вы давали на форуме на С++) на mql.
Все нормально работает, посижу сравню с Вашими, поскольку заметил один очень важный момент (может это моя ошибка), индикатор перерисовывается во времени....(тот что я написал)
Если это действительно так, то использовать его в реальной торговли конечно нельзя.

Поэтому вопросов, если не сложно будет ответить, два.
Все же, если есть пример индикаторов с использованием DLL, то скиньте для обучения, можно фрагменты кодов на С++ от того что используется. (gsb51@mail.ru)

И все же, перерисовывается ли DCT во времени или это моя ошибка при написании индикатора.

С уважением
Сергей
 
Все уже давно проверено лично.
Про тип стринг - их внутренний тип данных они конечно не очень написали, чем некоторых товарищей запутали. Есть ведь много типов стринг, которые не их внутренний тип данных.

VladislavVG:
RickD:
Так вам же пример вместе с МетаТрейдером поставляют:
Возможно, Вы правы - нужно проверить. Тогда непонятно высказывание метаквотсов о невозможности передачи типов кроме int, double. И о том, что тип string - это их внутренний тип данных (смотрите посты выше по ветке) также наличие прагмы в тех же примерах (как раз описывает тип стринг). Возможно, пример показывает как передавать строковые константы в среду СС++ - хотя зачем тогда возвращаемый адрес ? - в любом случае нужно проверить.

Удачи и попутных трендов.
Причина обращения: