Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
khorosh
9862
khorosh  

В ветке для новичков был задан вопрос, чем отличается 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
Модератор
15420
Victor Nikolaev  

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

void start(){return;}

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

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

int start() {return(0);}

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

khorosh
9862
khorosh  
Vinin:

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

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

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

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


Это понятно, вопрос был в другом. Возвращает ли что-нибудь оператор return функции. Моё мнение было, что ничего не возвращает. Сергеев считает, что возвратить может что угодно.
Рустам
3597
Рустам  
поддерживаю sergeev, вернутся может все что угодно, особенно при циклическом вызове функции. прецеденты были. то же касается неинициализированных переменных.
Комбинатор
16518
Комбинатор  
Всего, что не описано в документации явно, следует избегать. В MQL5 компилятор в этом смысле лучше кстати и не даст вернуть значение не того типа.
o_o
Модератор
24292
o_o  
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
1740
TarasBY  

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

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

khorosh
9862
khorosh  
sergeev:

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


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


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


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


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

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

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

khorosh
9862
khorosh  
TarasBY:

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

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

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

...


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


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

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

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