Скачать MetaTrader 5

На суд просвещённой публики.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Закажи разработку и отслеживай ее через мобильный телефон.
khorosh
8203
khorosh 2014.01.07 17:46 

В ветке для новичков был задан вопрос, чем отличается return от return(0). Я ответил: во втором случае функции возвращается ноль, в первом случае ничего не возвращается. В ответ на это получил щелчок по носу))) от глубокоуважаемого мной модератора, известного высококвалифицированного программиста sergeev .

"ой ой. ааагромнгое зхаблуждение, приводящее к поиску ошибок там где их нет.

функция возвращает некое неопределенное число, вполне возможно что вернет 0, хотя не факт.

поэтму не путайте человека. иначе напорется и будет не рад. "

"нет и еще раз нет!

не учите новичков глупостям."

И им был предложен эксперимент:

int F1() { return; }

int F2() { }

int a=F1(), b=F2();

Print(a);

Print(b);

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

Поэтому я проделал другой эксперимент идея которого в том, чтобы один раз вызывать функцию создав условия для того, чтобы она принимала значение 1, при втором вызове проверяем какова будет реакция на операторы return и return(0).

int start()
  {
//----
  
   Print("F1(1)=",F1(1));
   Print("F1(0)=",F1(0));
   
   Print("F2(1)=",F2(1));
   Print("F2(0)=",F2(0));
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
int F1(bool z)
   {
    if(z)
      {
       return(1);
      }
    else
      {
       return(0);
      }
   }
int F2(bool z)
   {
    if(z)
      {
       return(1);
      }
    else
      {
       return;
      }
   }

Результат таков:

2014.01.07 22:32:14 2009.01.02 06:00 Pustoy EURUSD,M15: F2(0)=1

2014.01.07 22:32:14 2009.01.02 06:00 Pustoy EURUSD,M15: F2(1)=1

2014.01.07 22:32:14 2009.01.02 06:00 Pustoy EURUSD,M15: F1(0)=0

2014.01.07 22:32:14 2009.01.02 06:00 Pustoy EURUSD,M15: F1(1)=1

Как видим у функции F2(), в которой использовался оператор return ранее принятое значение функции = 1 не изменилось, поэтому можно сделать заключение, что этот оператор ничего не возвращает и не изменяет предыдущее значение функции. Ну а оператор return(0), как и ожидалось изменил значение функции на ноль, так как возвращает ноль.

Может я где то ошибся и имеются пробелы в логике, - прошу специалистов выражать своё мнение.

Victor Nikolaev
Модератор
14524
Victor Nikolaev 2014.01.07 17:59  

Если используется

void start(){return;}

то ничего возвращать не надо.

Если используется

int start() {return(0);}

то что-то надо вернуть

khorosh
8203
khorosh 2014.01.07 18:11  
Vinin:

Если используется

то ничего возвращать не надо.

Если используется

то что-то надо вернуть


Это понятно, вопрос был в другом. Возвращает ли что-нибудь оператор return функции. Моё мнение было, что ничего не возвращает. Сергеев считает, что возвратить может что угодно.
Рустам
3597
Рустам 2014.01.07 20:22  
поддерживаю sergeev, вернутся может все что угодно, особенно при циклическом вызове функции. прецеденты были. то же касается неинициализированных переменных.
Комбинатор
15934
Комбинатор 2014.01.07 20:28  
Всего, что не описано в документации явно, следует избегать. В MQL5 компилятор в этом смысле лучше кстати и не даст вернуть значение не того типа.
o_o
Модератор
23717
o_o 2014.01.07 20:43  
khorosh:

Как видим у функции F2(), в которой использовался оператор return ранее принятое значение функции = 1 не изменилось, поэтому можно сделать заключение, что этот оператор ничего не возвращает и не изменяет предыдущее значение функции.

Сижу и тяну лыбу, вроде и не смешно, но чет хихи


запустите и убедитесь, что у функции нет "предыдущего" значения. // с чего вам пришла идея, что у функции есть память? это ж не переменная

int start()
{
        Print(F1()); Sleep(10);
        Print(F1());
}
//+------------------------------------------------------------------+
int F1()
{
        if (GetTickCount()>0) return;
}


а есть неизвестно что из стека. // хотя может и не из стека а из воздуха


и смотрите в будущем не доведи вас использовать функции, без всех путей.

bool F(int a) { if (a) return(false); }

напоритесь в результате на TRUE а может и на FALSE. смотря как повезет

благо в новом MQL4++ есть режим strict для предотвращения вот этого непотребства.

TarasBY
1742
TarasBY 2014.01.07 21:10  

А вы вернитесь к контексту заданного (упомянутого) вопроса. КАКАЯ разница в том или другом случае, что вернёт функция start()??? - задача return в start() прерывание исполнения кода. Делаете из мухи слона. :(

P.S. У меня start(), init(), deinit(), как правило, void.

khorosh
8203
khorosh 2014.01.07 22:28  
sergeev:

Сижу и тяну лыбу, вроде и не смешно, но чет хихи


запустите и убедитесь, что у функции нет "предыдущего" значения. // с чего вам пришла идея, что у функции есть память? это ж не переменная


а есть неизвестно что из стека. // хотя может и не из стека а из воздуха


и смотрите в будущем не доведи вас использовать функции, без всех путей.


напоритесь в результате на TRUE а может и на FALSE. смотря как повезет

благо в новом MQL4++ есть режим strict для предотвращения вот этого непотребства.

Это хорошо, что вы улыбаетесь, я тоже часто улыбаюсь. И это хорошо, когда технические вопросы выясняют с улыбкой, а не на ножах. Значит у нас есть дипломатические способности.) Я не понимал что даёт ваш первый тест и не понимаю ваш второй тест, а вы мой тест понимаете? Ведь результаты налицо. Можете вместо 1 возвращать ретурном любое число и оно сохраняется в значении функции. Но значение сохраняется только как у локальной переменной внутри одного запуска функции старт. При выходе из старта оно теряется и я это проверил, если хотите могу предоставить ещё один тест, который это показывает. В моём тесте представлены результаты полностью подтверждающие то, что я сказал: - return ничего не возвращает функции, а return(0) возвращает ноль. Результатов ваших тестов у меня нет, так что пока я остаюсь при своём мнении.

khorosh
8203
khorosh 2014.01.07 22:36  
TarasBY:

А вы вернитесь к контексту заданного (упомянутого) вопроса. КАКАЯ разница в том или другом случае, что вернёт функция start()??? - задача return в start() прерывание исполнения кода. Делаете из мухи слона. :(

P.S. У меня start(), init(), deinit(), как правило, void.

Так теперь речь идет не о функции старт, а вообще любой. Весь сыр бор возник, когда Сергеев опроверг моё высказывание, что return(0) возвращает функции ноль, а return не возвращает ничего. Если вы также несогласны с этим моим высказыванием, посмотрите код моего теста и результаты его работы.
khorosh
8203
khorosh 2014.01.07 22:55  
FAQ:
поддерживаю sergeev, вернутся может все что угодно, особенно при циклическом вызове функции. прецеденты были. то же касается неинициализированных переменных.
return только завершает работу функции, но никакого значения функции не передаёт. И то что вы думаете, что вернуть может в функцию что угодно, это только кажется, так как в функции внутри старта может оставаться ранее переданное ей значение, если кроме оператора return в ней используется оператор return(x), который ранее ей передал результаты каких нибудь вычислений.
khorosh
8203
khorosh 2014.01.07 23:00  
sergeev:

...


и смотрите в будущем не доведи вас использовать функции, без всех путей.


напоритесь в результате на TRUE а может и на FALSE. смотря как повезет

благо в новом MQL4++ есть режим strict для предотвращения вот этого непотребства.

Не надо уводить разбор вполне конкретного вопроса в сторону. Мы ведь здесь не собираемся разбирать все возможные ошибки начинающих программировать. Для этого существует специальная ветка, в которой у нас и возникли разногласия.
1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий