Использование #property strict в библиотеке

 

Всем привет!

Вопрос к знатокам, помогите разобраться, как правильно писать функции, чтобы их можно было без проблем использовать в своей библиотеке.

Не получается, например, использовать самописную функцию с несколькими циклами перебора, которая отлично работает в одном файле с кодом (с #property strict). 

Если в библиотечном файле также добавляю #property strict файл компилируется, но функция не работает. В логах получаю такое: Cannot find 'function' in 'test_library.ex4'


А если без #property strict компилятор начинает ругаться, что-то вроде:

'i' - variable already defined


Почему так и значит ли это, что для всех счетчиков в функции нужно придумывать индивидуальные имена и в библиотеке нельзя использовать #property strict? 


 
Ну шар мне подсказывает что у вас в цикле используется ранее объявленная переменная. Или используйте другое имя например j, или просто приравнивайте без объявления i=0;. А вообще без кода, можно только гадать.
 
Konstantin Nikitin:
Ну шар мне подсказывает что у вас в цикле используется ранее объявленная переменная. Или используйте другое имя например j, или просто приравнивайте без объявления i=0;. А вообще без кода, можно только гадать.

Ну, как бы это мне казалось очевидным, поэтому решил на расписываться на эту тему, благо привел сообщение компилятора. Но если конкретнее, то счетчик в каждом цикле объявляется следующим образом:

for(int i=0; i<100; i++)

Интересует, как раз, именно обязательность использования различных имен счетчиков и нельзя ли все таки, как-то применять функцию вместе с #property strict (чтобы не заниматься переименованиями)?

В некоторых функциях у меня много где используются и другие одинаковые имена локальных переменных (которые объявляются и работают только в области своей видимости - внутри ближайших фигурных скобок). Эти функции тоже никак не получится использовать в библиотеке без тотальной (именной) переделки?

p.s. повторюсь на всякий случай, что если функцию использовать в одном файле с основным кодом, все работает отлично и без ошибок

 
Ну похоже где-то на более высоком уровне у вас уже объявлена переменная. Поэтому и ругается. Смотрите внимательней.
 
Konstantin Nikitin:
Ну похоже где-то на более высоком уровне у вас уже объявлена переменная. Поэтому и ругается. Смотрите внимательней.

Хорошо, набросал простой код для примера:

//+------------------------------------------------------------------+
//|                                                 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


 
leon_17:

Ну, как бы это мне казалось очевидным,

Вам уже предложили показать проблему в коде, а что нам то очевидно? Вам "клаву лень топтать"? Мне не лень, держите мой пример, у меня ошибок не возникло:

файл 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++)

 
Igor Makanu:

Вам уже предложили показать проблему в коде, а что нам то очевидно? Вам "клаву лень топтать"? Мне не лень, держите мой пример, у меня ошибок не возникло:

файл mylib:

файл скрипта:

ошибок компилятора нет, результат скрипта:

ЗЫ: с ужасом вижу, что факториал не правильно посчитал! ))))))

Каюсь, было чуть лень) но выше уже выставил, надеюсь теперь понятнее суть вопроса... и допустим у меня в функции не 2 а 53 цикла и для каждого нужен свой счетчик.

Что делать, чтобы использовать ее в библиотеке? 

 

@Igor Makanu большое спасибо за пример! Просмотрел его более внимательно и заметил что вы использовали постмодификатор export

я делал без него, но с ним все заработало и с #property strict - в этом и была суть вопроса, немного не туда копал )

 

 
leon_17:

@Igor Makanu большое спасибо за пример! Просмотрел его более внимательно и заметил что вы использовали постмодификатор export

я делал без него, но с ним все заработало и с #property strict - в этом и была суть вопроса, немного не туда копал )

 

а чего тут копать? я не пишу себе библиотеки, я инклудниками обычно собираю свои проекты - прочитал справку там все написано, читайте справку, потом поиском по форуму, не получится, тогда спрашивайте

удачи!

 
Igor Makanu:

а чего тут копать? я не пишу себе библиотеки, я инклудниками обычно собираю свои проекты - прочитал справку там все написано, читайте справку, потом поиском по форуму, не получится, тогда спрашивайте

удачи!

Ну, я так и не смог найти в справке инструкции о том как вообще создавать и пользоваться своими библиотеками... причем до сих пор. Поделитесь как вы это сделали?

 
leon_17:

Ну, я так и не смог найти в справке инструкции о том как вообще создавать и пользоваться своими библиотеками... причем до сих пор. Поделитесь как вы это сделали?

в метаэдиторе ставите курсор на директиву компилятора #import и нажимаете F1 - в справке автоматически откроется статья 

"Импорт функций (#import)"

бегло читаете и не забываете кликать на все ссылке в справке

ЗЫ: можете попробовать в метаэдиторе нажать Ctrl+F1.... ;)