Ну шар мне подсказывает что у вас в цикле используется ранее объявленная переменная. Или используйте другое имя например j, или просто приравнивайте без объявления i=0;. А вообще без кода, можно только гадать.
Ну, как бы это мне казалось очевидным, поэтому решил на расписываться на эту тему, благо привел сообщение компилятора. Но если конкретнее, то счетчик в каждом цикле объявляется следующим образом:
for(int i=0; i<100; i++)
Интересует, как раз, именно обязательность использования различных имен счетчиков и нельзя ли все таки, как-то применять функцию вместе с #property strict (чтобы не заниматься переименованиями)?
В некоторых функциях у меня много где используются и другие одинаковые имена локальных переменных (которые объявляются и работают только в области своей видимости - внутри ближайших фигурных скобок). Эти функции тоже никак не получится использовать в библиотеке без тотальной (именной) переделки?
p.s. повторюсь на всякий случай, что если функцию использовать в одном файле с основным кодом, все работает отлично и без ошибок
Ну похоже где-то на более высоком уровне у вас уже объявлена переменная. Поэтому и ругается. Смотрите внимательней.
Хорошо, набросал простой код для примера:
//+------------------------------------------------------------------+ //| test_library.mq4 | //| (c) | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property library #property copyright "(c)" #property link "https://www.mql5.com" // #property strict //+------------------------------------------------------------------+ //| Пример функции | //+------------------------------------------------------------------+ void function(int z) { if(z==2) { for(int i=0; i<100;i++) { i++; } } if(z==5) { for(int i=0; i<100;i++) { i++; } } }
и вот в таком виде, когда #property strict закомментирован получаю от компилятора:
'i' - variable already defined
Ну, как бы это мне казалось очевидным,
Вам уже предложили показать проблему в коде, а что нам то очевидно? Вам "клаву лень топтать"? Мне не лень, держите мой пример, у меня ошибок не возникло:
файл mylib:
#property library #property strict int MyFactorial(int N) export { int i,res; res = 1; for(i=1;i<N;i++){ res*=i; } return(res); }
файл скрипта:
#property strict #import "mylib.ex4" int MyFactorial(int N); #import void OnStart() { int i,N; for(i=1;i<10;i++) { N=MyFactorial(i); Print("i = ",i," , N = ",N); Sleep(123); }
ошибок компилятора нет, результат скрипта:
2018.06.10 00:08:25.121 Script tst EURUSD,M1: removed
2018.06.10 00:08:25.112 tst EURUSD,M1: uninit reason 0
2018.06.10 00:08:24.987 tst EURUSD,M1: i = 9 , N = 40320
2018.06.10 00:08:24.862 tst EURUSD,M1: i = 8 , N = 5040
2018.06.10 00:08:24.737 tst EURUSD,M1: i = 7 , N = 720
2018.06.10 00:08:24.612 tst EURUSD,M1: i = 6 , N = 120
2018.06.10 00:08:24.487 tst EURUSD,M1: i = 5 , N = 24
2018.06.10 00:08:24.363 tst EURUSD,M1: i = 4 , N = 6
2018.06.10 00:08:24.238 tst EURUSD,M1: i = 3 , N = 2
2018.06.10 00:08:24.113 tst EURUSD,M1: i = 2 , N = 1
2018.06.10 00:08:23.988 tst EURUSD,M1: i = 1 , N = 1
2018.06.10 00:08:23.988 tst EURUSD,M1: initialized
2018.06.10 00:08:23.941 Script tst EURUSD,M1: loaded successfully
ЗЫ: с ужасом вижу, что факториал не правильно посчитал! ))))))
ЗЫЗЫ: хм, видимо в mylib пропустил <=, должно быть for(i=1;i<=N;i++)
Вам уже предложили показать проблему в коде, а что нам то очевидно? Вам "клаву лень топтать"? Мне не лень, держите мой пример, у меня ошибок не возникло:
файл mylib:
файл скрипта:
ошибок компилятора нет, результат скрипта:
ЗЫ: с ужасом вижу, что факториал не правильно посчитал! ))))))Каюсь, было чуть лень) но выше уже выставил, надеюсь теперь понятнее суть вопроса... и допустим у меня в функции не 2 а 53 цикла и для каждого нужен свой счетчик.
Что делать, чтобы использовать ее в библиотеке?
@Igor Makanu большое спасибо за пример! Просмотрел его более внимательно и заметил что вы использовали постмодификатор export
я делал без него, но с ним все заработало и с #property strict - в этом и была суть вопроса, немного не туда копал )
@Igor Makanu большое спасибо за пример! Просмотрел его более внимательно и заметил что вы использовали постмодификатор export
я делал без него, но с ним все заработало и с #property strict - в этом и была суть вопроса, немного не туда копал )
а чего тут копать? я не пишу себе библиотеки, я инклудниками обычно собираю свои проекты - прочитал справку там все написано, читайте справку, потом поиском по форуму, не получится, тогда спрашивайте
удачи!
а чего тут копать? я не пишу себе библиотеки, я инклудниками обычно собираю свои проекты - прочитал справку там все написано, читайте справку, потом поиском по форуму, не получится, тогда спрашивайте
удачи!
Ну, я так и не смог найти в справке инструкции о том как вообще создавать и пользоваться своими библиотеками... причем до сих пор. Поделитесь как вы это сделали?
Ну, я так и не смог найти в справке инструкции о том как вообще создавать и пользоваться своими библиотеками... причем до сих пор. Поделитесь как вы это сделали?
в метаэдиторе ставите курсор на директиву компилятора #import и нажимаете F1 - в справке автоматически откроется статья
"Импорт функций (#import)"
бегло читаете и не забываете кликать на все ссылке в справке
ЗЫ: можете попробовать в метаэдиторе нажать Ctrl+F1.... ;)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет!
Вопрос к знатокам, помогите разобраться, как правильно писать функции, чтобы их можно было без проблем использовать в своей библиотеке.
Не получается, например, использовать самописную функцию с несколькими циклами перебора, которая отлично работает в одном файле с кодом (с #property strict).
Если в библиотечном файле также добавляю #property strict файл компилируется, но функция не работает. В логах получаю такое: Cannot find 'function' in 'test_library.ex4'
А если без #property strict компилятор начинает ругаться, что-то вроде:
'i' - variable already defined
Почему так и значит ли это, что для всех счетчиков в функции нужно придумывать индивидуальные имена и в библиотеке нельзя использовать #property strict?