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

 
Zhunko:

Правильный программист игнорирует недокументированные возможности. Ибо, они могут в любой момент измениться. Ранее работавший код перестанет работать.

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


В связи с результатами нового теста это пост следует откорректировать. Правильно будет так:

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

 
TheXpert:
Не игнорирует, а осознанно избегает, вот так правильно.

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

Так, то ж синонимы.
 
khorosh:


В связи с результатами нового теста это пост следует откорректировать. Правильно будет так:

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

Вставлю ещё "свои пять копеек" для "самого большого". Нужно различать "для всех случаев" и "частный случай". Для общего случая, к сожалению, вы опять не правы: если функция имеет тип возвращаемого значения void, то даже компилятор не даст вам к return что-либо "приклеить", следовательно, функция ничего не возвратит. А если, тип возвращаемого значения отличен от void, т.е. функция должна возвратить какое-то значение, то, если вы будете использовать оператор return без возвращаемого значения, то результат получите тот, который уже получили (функция вернёт "стэковое" значение).

P.S. Такой подход "матёрых программистов" встречается на каждом шагу: использование частных программных решений, не применимых к общему случаю. Простой пример:

    if (OrdersTotal() > 0) // и дальнейшая торговля от этого условия.

:)))

 
TarasBY:

Вставлю ещё "свои пять копеек" для "самого большого". Нужно различать "для всех случаев" и "частный случай". Для общее случая, к сожалению, вы опять не правы: если функция имеет тип возвращаемого значения void, то даже компилятор не даст вам к return что-либо "приклеить", следовательно, функция ничего не возвратит. А если, тип возвращаемого значения отличен от void, т.е. функция должна возвратить какое-то значение, то, если вы будете использовать оператор return без возвращаемого значения, то результат получите тот, который уже получили (функция вернёт "стэковое" значение.

P.S. Такой подход "матёрых программистов" встречается на каждом шагу: использование частных программных решений, не применимых к общему случаю. Простой пример:

:)))

Читайте все посты, а не через один. О функции типа void я уже написал во 2й странице.


TarasBY:

...А если, тип возвращаемого значения отличен от void, т.е. функция должна возвратить какое-то значение, то, если вы будете использовать оператор return без возвращаемого значения, то результат получите тот, который уже получили (функция вернёт "стэковое" значение.

Об этом я и толкую и доказываю тестами, что оператор return ничего функции не передаёт независимо от того какой тип имеет функция . А если бы, как тут некоторые выражаются, передавал что попало, то в буфере бы не сохранялось значение последней вызванной функции, а было бы что попало.

И не надо меня пугать какими то осложнениями, я не собираюсь использовать этот оператор не по правилам. А в тесте его использовал лишь для того, чтобы доказать, что он ничего не передаёт функции.

 
khorosh:

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

вот с такой формулировкой согласен.

 
sergeev:

вот с такой формулировкой согласен.

В ветке для новичков я и сказал, что оператор return ничего не передаёт функции. А return(0) передаёт ноль. Почему вы воспротивились этому так и не понял.)
 
khorosh:
В ветке для новичков я и сказал, что оператор return ничего не передаёт функции. А return(0) передаёт ноль. Почему вы воспротивились этому так и не понял.)


потому что верная фраза - это так как вы написали выше. согласно её это должнро быть написано так:

return(0) передаёт ноль. задает в общей ячейке функций значение 0.


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

int start()
{
        Print("результат F1=",F1(1)); // здесь вернет значение= GetTickCount
        Print("результат F1=",F1(2)); // а здесь= MathAbs
}
//+------------------------------------------------------------------+
int F1(int q)
{
        int a=MathAbs(123);
        if (q==1) a=GetTickCount();
        Print("внутри F1=",a);
        return;
}


исходя из этого можно сделать приближенный вывод, что return фактически есть тоже некая функция в трактовке MQL4. Которая помещает в этот "стек" свое значение.

это значение и будет использовано в качестве результата.

поэтому если return было использовано неверно (в стиле return; как для void функций) то и значение возьмется то что было там по результату последней функции. в примере верху сначала getTick а во втором MathAbs

 
khorosh:
В ветке для новичков я и сказал, что оператор return ничего не передаёт функции. А return(0) передаёт ноль. Почему вы воспротивились этому так и не понял.)


С Ассемблером не общался уже почти тридцать лет, остались обрывки воспоминаний.

return не передает что-то функции, а возвращает в вызывающую программу некое значение(адрес) через не помню какой регистр(из шестнадцати).

В языке Си нет понятия подпрограммы(Subroutine, значение регистра менять не имеет права), есть только функция(Function, меняет значение регистра), поэтому любая из оных может изменить содержимое этого регистра.

Как поставлен в MQL контроль этого дела, известно только богу и разработчикам.

Как-то так, или около того...

Причина обращения: