Ошибки, баги, вопросы - страница 1016

 
A100:

Да, спасибо, я ошибся при упрощении исходного кода - сейчас переписал ошибку по-другому

Предыдущее удалил, чтобы не путаться

Это ужасно.  Действительно ругается.  Как страшно жить...

--

Слух, а оно тебе нахрена?  Ежели не секрет.

На Лиспе советник пишешь?  Я канешна снимаю шляпу, но таки советую перейти на Хаскел.

;-)

 
MetaDriver:

Слух, а оно тебе нахрена?  Ежели не секрет.

Просто в MQL5 нет inline функций (по форме) и я использую вместо них - параметрические макросы, что в общем не совсем правильно, поскольку отсутствует контроль типов
 
A100:
Просто в MQL5 нет inline функций (по форме) и я использую вместо них - параметрические макросы

Да я тоже использую.  Только не такой жуткой вложенности.  )))

Для справки: mql5 переводит в инлайн-подстановки все мелкие функции.  Другими словами - можно считать, что ключевое слово "inline" стоит в каждой пользовательской функции по умолчанию.

Решение же подставлять макрос или компилять в функцию принимает в итоге компилятор (точно так же, как и С++, кстати). Так что нет смысла пытаться таким образом что-либо ускорить, все простые функции и так инлайнятся.

// И кстати - с контролем типов! :)

 

 

MetaDriver:

Для справки: mql5 переводит в инлайн-подстановки все мелкие функции.  Другими словами - можно считать, что ключевое слово "inline" стоит в каждой пользовательской функции по умолчанию.

А я не для ускорения, а для удобства. По сути они может и inline, но не по форме(!). Сложности возникают если определить inline в .mqh и потом использовать в нескольких .ex5. Сейчас попробую найти ссылку

https://www.mql5.com/ru/forum/1111/page1013#comment_520221 

int B() { return ( A( 0 ) ); }

Там B() в 1.mqh как бы должна быть inline - но всё вместе - не компилируется нормально - только по отдельности. СервисДеск ссылаясь на неоднозначность вызова не стал глубоко вникать в суть проблемы и рекомендовал организовать проект по-другому. А как по другому? Всё работает только если убрать реализацию B() из .mqh в .ex5. А какой же это тогда по форме inline?

К слову сказать в MQL4 тот пример работает - без ошибок, хотя там B() и не inline по сути, зато по форме - inline

 
A100:

А я не для ускорения, а для удобства. По сути они может и inline, но не по форме(!).

И далась тебе форма. 

" Кто такой Студебеккер? Это ваш родственник Студебеккер? Папа ваш Студебеккер?"  (ц) Остап Ибрагимыч

Сложности возникают если определить inline в .mqh и потом использовать в нескольких .ex5.

Никаких сложностей.  Если не делать логических ошибок и правильно понимать как работает компилятор.  // Не в частностях, а в целом.  Общие принципы понимать.

Сейчас попробую найти ссылку

https://www.mql5.com/ru/forum/1111/page1013#comment_520221 

Здесь по сути функция B() inline 

от ошибок типа "ambiguous call to overloaded function with the same parameters" мне не удалось избавиться, они не возникали только если ее поместить в отдельный .ex5

У тебя там принципиально нераспознаваемая рекурсия на уровне исходного кода.  Компилятор ещё по божески на тебя наорал, прямо по существу. Ты там пытаешься подключить к инклюднику либу, в которую задефайнен тот же инклюдник, который ты компилируешь. Ну так и чего ты хотел? Если б ты был компилятором, как бы ты поступил?

Может для тебя это и новость, но инлайн-функция прописанная в DLL никак не может использоваться в качестве макроса за пределами этой DLL.  // В runtime исходного кода уже не существует

Видимо вторая новость для тебя :  все либы в mql(4, 5) - динамически подключаемые. То бишь DLL по сути.

Итого имеем:  на самом деле ты пытался из либы обратиться к самой себе, обращающейся к самой себе, обращающейся к самой себе......  и т.д.

Согласись, гораздо хуже было бы, если бы это всё скомпилировалось без возражений, а потом во время исполнения либа попыталась бы грузить саму себя рекурсивно до исчерпания памяти.... :))

?

Потому в С/С++ и есть ключевое слово inline 

Совсем не поэтому.  Уверен, что пример по ссылке не скомпилируется в С++.

// Лень проверять.  Просто нелогично.  Если мне непонятно как собирать рекурсивно организованный исходник, то и компилятор не поймёт.

 
A100:

К слову сказать в MQL4 тот пример работает - без ошибок, хотя там B() и не inline по сути, зато по форме - inline

Да не верю.  Хотя.. поскольку там нет перезагрузки функций, возможно там компилятор и не пытается тебе намекнуть на неправильную перезагрузку - просто тупо игнорирует повторные определения.
 
MetaDriver:
Да не верю.  Хотя.. поскольку там нет перезагрузки функций, возможно там компилятор и не пытается тебе намекнуть на неправильную перезагрузку - просто тупо игнорирует повторные определения.

Компилируется и в MQL4 (!) и в С/C++ если написать inline перед B()

Там вообще нет рекурсии там по сути есть

int A( int ) и #define B()   A( 0 )

там вообще всё очень просто - если не лень - посмотрите на свежую голову - только разделяйте объявление и реализацию функций :)

 
A100:

Там B() в 1.mqh как бы должна быть inline - но всё вместе - не компилируется нормально - только по отдельности. СервисДеск ссылаясь на неоднозначность вызова не стал глубоко вникать в суть проблемы и рекомендовал организовать проект по-другому. А как по другому?

Сам же и ответил:


Всё работает только если убрать реализацию B() из .mqh в .ex5. А какой же это тогда по форме inline?

Там инлайн нормальный.  Проблема там вообще не в инайновости B(),  а в её повторном определении.  Поскольку либа является DLL-кой, информация о включенных в неё инклюдниках (их именах) уже отсутствует во время повторной компиляции 1.mqh (первая компиляция была во время формирования либы), поэтому при компиляции инклюдника обнаруживается повторно определяемая функция B(), притом поскольку параметры те же самые, то компилятор считает это ошибочной (некорректной) попыткой перезагрузить функцию.  Имеет полное право.  Очень даже вежливо, мог бы и матом послать.
 
MetaDriver:
Сам же и ответил:
Там инлайн нормальный.  Проблема там вообще не в инайновости B(),  а в её повторном определении.

Совершенно верно - просто С/С++ понимает (через ключевое слово inline), что это не повторное определение, а MQL5 - не понимает, хотя мог бы отличить по имени компилирумого модуля и указанного в #import. А как уж MQL4 понимает - не знаю.

Короче нельзя определить реализацию функции в .mqh и использовать ее без проблем в любом .ex5 

 
A100:
Совершенно верно - просто С/С++ понимает, что это не повторное определение, а MQL5 - не понимает

С/С++  способны это понять ТОЛЬКО при компиляции статической либы.  Поскольку в объектном файле информация об именах исходников сохранена (именно для распознавания повторной компиляции).

С динамически линкуемой библиотекой это номер не пройдёт.  А если и пройдёт, то вовсе не по причине распознавания повторной компиляции, а по причине наличия "правил приоритета" на случай совпадения имён в текущем исходнике и DLL.  В некоторых языках такие правила определены (в делфи в частности, возможно и в некоторых компиляторах С/С++ есть).

Причина обращения: