Ошибки, баги, вопросы - страница 1016
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да, спасибо, я ошибся при упрощении исходного кода - сейчас переписал ошибку по-другому
Предыдущее удалил, чтобы не путатьсяЭто ужасно. Действительно ругается. Как страшно жить...
--
Слух, а оно тебе нахрена? Ежели не секрет.
На Лиспе советник пишешь? Я канешна снимаю шляпу, но таки советую перейти на Хаскел.
;-)
Слух, а оно тебе нахрена? Ежели не секрет.
Просто в MQL5 нет inline функций (по форме) и я использую вместо них - параметрические макросы
Да я тоже использую. Только не такой жуткой вложенности. )))
Для справки: mql5 переводит в инлайн-подстановки все мелкие функции. Другими словами - можно считать, что ключевое слово "inline" стоит в каждой пользовательской функции по умолчанию.
Решение же подставлять макрос или компилять в функцию принимает в итоге компилятор (точно так же, как и С++, кстати). Так что нет смысла пытаться таким образом что-либо ускорить, все простые функции и так инлайнятся.
// И кстати - с контролем типов! :)
Для справки: mql5 переводит в инлайн-подстановки все мелкие функции. Другими словами - можно считать, что ключевое слово "inline" стоит в каждой пользовательской функции по умолчанию.
https://www.mql5.com/ru/forum/1111/page1013#comment_520221
Там B() в 1.mqh как бы должна быть inline - но всё вместе - не компилируется нормально - только по отдельности. СервисДеск ссылаясь на неоднозначность вызова не стал глубоко вникать в суть проблемы и рекомендовал организовать проект по-другому. А как по другому? Всё работает только если убрать реализацию B() из .mqh в .ex5. А какой же это тогда по форме inline?
К слову сказать в MQL4 тот пример работает - без ошибок, хотя там B() и не inline по сути, зато по форме - inline
А я не для ускорения, а для удобства. По сути они может и 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
Совсем не поэтому. Уверен, что пример по ссылке не скомпилируется в С++.
// Лень проверять. Просто нелогично. Если мне непонятно как собирать рекурсивно организованный исходник, то и компилятор не поймёт.
К слову сказать в MQL4 тот пример работает - без ошибок, хотя там B() и не inline по сути, зато по форме - inline
Да не верю. Хотя.. поскольку там нет перезагрузки функций, возможно там компилятор и не пытается тебе намекнуть на неправильную перезагрузку - просто тупо игнорирует повторные определения.
Компилируется и в MQL4 (!) и в С/C++ если написать inline перед B()
Там вообще нет рекурсии там по сути есть
int A( int ) и #define B() A( 0 )
там вообще всё очень просто - если не лень - посмотрите на свежую голову - только разделяйте объявление и реализацию функций :)
Там B() в 1.mqh как бы должна быть inline - но всё вместе - не компилируется нормально - только по отдельности. СервисДеск ссылаясь на неоднозначность вызова не стал глубоко вникать в суть проблемы и рекомендовал организовать проект по-другому. А как по другому?
Всё работает только если убрать реализацию B() из .mqh в .ex5. А какой же это тогда по форме inline?
Сам же и ответил:
Там инлайн нормальный. Проблема там вообще не в инайновости B(), а в её повторном определении.
Совершенно верно - просто С/С++ понимает (через ключевое слово inline), что это не повторное определение, а MQL5 - не понимает, хотя мог бы отличить по имени компилирумого модуля и указанного в #import. А как уж MQL4 понимает - не знаю.
Короче нельзя определить реализацию функции в .mqh и использовать ее без проблем в любом .ex5
Совершенно верно - просто С/С++ понимает, что это не повторное определение, а MQL5 - не понимает
С/С++ способны это понять ТОЛЬКО при компиляции статической либы. Поскольку в объектном файле информация об именах исходников сохранена (именно для распознавания повторной компиляции).
С динамически линкуемой библиотекой это номер не пройдёт. А если и пройдёт, то вовсе не по причине распознавания повторной компиляции, а по причине наличия "правил приоритета" на случай совпадения имён в текущем исходнике и DLL. В некоторых языках такие правила определены (в делфи в частности, возможно и в некоторых компиляторах С/С++ есть).