Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Попробуй вот так сделать
...
Сделал все как ты написал. В результате переменная res_str не изменилась (как была из пробелов так и осталась).
Еще в твоем коде
library Ping;
procedure sum(str1, str2, res_str : PChar); stdcall;
...
Я сначало твой вариант попробывал и потом еще исправил так
library Ping;
procedure sum(str1, str2: PChar; var res_str : PChar); stdcall;
А у тебя этот пример работает или ты не проверял???
Может я кривой.
Я думаю проблема в моей DLL, так как она на Delphi написана, она по своему, наверно, с типами работает. Хотя числовые типы у меня все работают отлично!!!
Может кто-нибудь знающий приведет примерчик, любой самый простой.
Нет, со строками не проверял. Я просто свои соображения сказал как бы это могло работать. Вообще со строками думаю лучше работать в коде MQL4.
Вот с массивами типа Double работал.
В коде эксперта можешь объявить массив типа
double my_array[MAX_SIZE]
либо
double my_array[];
а в какой нибудь функции эксперта вызвать ArrayResize(my_array, MAX_SIZE);
то есть здесь ты можешь установить размер массива в любом месте эксперта и передать в DLL а в DLL принимаешь его через указатель PDouble
Ну а как с указателями в делфи рабоать и обращаться к нужным элементам я думаю ты знаешь или прочтёшь в хелпе.
Если ты передаёшь массивы по указателю то var писать не надо - ты же элементы массива будешь менять а не сам указатель. Так что ты можешь свободно работать скопией указателя в стеке функции и var писать не надо.
Я сделал так: вместо array of Double создал тип TArr1Double, вот:
type
TArr1Double = array of Double;
{$R *.res}
procedure exm1(Arr1Double: TArr1Double); stdcall;
begin
Arr1Integer[0] := 7.3;
Arr1Integer[1] := 8.444;
end;
exports
exm1;
begin
end.
procedure exm1(var Arr1Double: TArr1Double); stdcall;
...
А в MQL4 без разницы (для массива) есть или нету указателя & перед идентификатором. Данные все равно сохраняются. В прочем, как и в других языках программирования. ))
elritmo проверь пожалуйста, ты так имел ввиду или нет??
Я все прочитал в хелпе и в гугле: PDouble = ^Double - т.е. это только указатель на число Double. Как его использовать для массива я так и не нашел. Может покажешь на примере?
Вот PChar - это указатель на динамический массив. Но для строк PChar пока не понимаю почему не работает.
type
TArr1Integer = array of Integer;
procedure exm2(Arr1Integer: TArr1Integer); stdcall;
...
У меня так и с целыми числами работает
type
TArr1Integer = array of Integer;
procedure exm2(Arr1Integer: TArr1Integer); stdcall;
...
Я даже не пробовал подубные конструкции опасаясь что может моут быть проблемы. Но если у тебя так рабоатет то и я попробую. Вообще то странно передаётся же си массив простой а принимается как делфийский динамический. Ну возможно приведение типа из PDouble к TArrDouble делает всё как надо.
Если так рабоатет то отлично - проверь на стабильность и можешь пользоваться
Если использовал бы PDouble для массива то получилось бы обращенеи к элементам массива так:
library Ping;
{$R *.res}
procedure exm1(Arr1Double: PDouble); stdcall;
begin
Arr1Double^ := 7.3;
Inc(Arr1Double);
Arr1Double^ := 8.444;
end;
exports
exm1;
begin
end.
А товой код что то не правильный ты спутал Arr1Double с Arr1Integer
procedure exm1(Arr1Double: TArr1Double); stdcall;
begin
Arr1Integer[0] := 7.3;
Arr1Integer[1] := 8.444;
end;
DLL на Delphi
procedure exm1(str: PChar); stdcall;
begin
str[0] := 'q';
str[1] := 'w';
str[2] := 'e';
...
end;
...
Если сделать так
procedure exm1(str: PChar); stdcall;
begin
str := 'qwe';
end;
...
procedure exm1(str: PChar); stdcall;
var
ch: PChar;
begin
ch[0] := 'q';
ch[1] := 'w';
ch[2] := 'e';
str := ch;
end;
...
В MQL4 надо выделить строку достаточной длинны для записи (У меня каракули добавлял в конец строки, если в DLL использоывались индексы, которые выхдят за пределы длинны строки).
...
Если ты передаёшь массивы по указателю то var писать не надо - ты же элементы массива будешь менять а не сам указатель. Так что ты можешь свободно работать скопией указателя в стеке функции и var писать не надо.
procedure exm1(str: PChar); stdcall;
begin
StrSpy(str, 'qwe');
end;
str должна в MQL быть проинициализирована вот так
for(i = 0; i < 4; i++) str = str + " ";
...
А товой код что то не правильный ты спутал Arr1Double с Arr1Integer
procedure exm1(Arr1Double: TArr1Double); stdcall;
begin
Arr1Integer[0] := 7.3;
Arr1Integer[1] := 8.444;
end;
...
...
Если использовал бы PDouble для массива то получилось бы обращенеи к элементам массива так:
library Ping;
procedure exm1(Arr1Double: PDouble); stdcall;
begin
Arr1Double^ := 7.3;
Inc(Arr1Double);
Arr1Double^ := 8.444;
end;
...
У меня так и с PInteger, тоже работает, сам проверил!
Ну и как работает или нет?