вопросы: - страница 4

 
Это означает, что вместо значения "С" передается ссылка-адрес "&С",
т.е. самой "с" в теле функции Gipo нет. "С" осталось в вызвающей проге. Также "С" может быть глобальной.
Очень удобно. Это кусочек Си - косвенная адресация, Си-мышление.
Одна печаль, поскольку об этой адресации нет в описании языка (но есть в трансляторе),
постольку косвенная адресация может когда нибудь незаметно исчезнуть. (Может об этом разработчиков спросить?).
 
Korey:
Это означает, что вместо значения "С" передается ссылка-адрес "&С",
т.е. самой "с" в теле функции Gipo нет. "С" осталось в вызвающей проге. Также "С" может быть глобальной.
Очень удобно. Это кусочек Си - косвенная адресация, Си-мышление.
Одна печаль, поскольку об этой адресации нет в описании языка (но есть в трансляторе),
постольку косвенная адресация может когда нибудь незаметно исчезнуть. (Может об этом разработчиков спросить?).
вот это уже интереснее, если только разработчики позже не уберут эту возможность
 

https://docs.mql4.com/ru/basis/variables/formal

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

Пример:

void func(int& x, double& y, double& z[])
{
double calculated_tp;
...
for(int i=0; i<OrdersTotal(); i++)
{
if(i==ArraySize(z)) break;
if(OrderSelect(i)==false) break;
z[i]=OrderOpenPrice();
}
x=i;
y=calculated_tp;
}

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

Параметры, передаваемые по ссылке, нельзя инициализировать значениями по умолчанию.
 

Приятно что не уберут, оказывается в документации это есть.
Хотя кто то из великих в 2008г. предлагал ссылку на переменную описывать как массив... Ну да ладно.
также, с учетом возмoжного человеческого непонимания:
в описании функции эквивалентно и абсолютно правильно будет все вот это:

func(int   &array[], int&    array[],   int array[],   int &array[50],   int&   array[50],   int array[50])


(Даже не спрашиваем зачем в описании функции допустимо array[50]))))

 
Korey:

Приятно что не уберут, оказывается в документации это есть.
Хотя кто то из великих в 2008г. предлагал ссылку на переменную описывать как массив... Ну да ладно.
также, с учетом возмoжного человеческого непонимания:
в описании функции эквивалентно и абсолютно правильно будет все вот это:

func(int   &array[], int&    array[],   int array[],   int &array[50],   int&   array[50],   int array[50])


(Даже не спрашиваем зачем в описании функции допустимо array[50]))))

Не будет. В смысле эквивалентно не будет. Вотличие от С, где массивы не передаются по значению (только по ссылке), в МКЛ есть возможность передачи по значению. Разница в том, что массиву 

int array[]
нельзя присвоить значение внутри процедуры - компилятор такую конструкцию даже не пропустит ;).

Вы ж, вроде, ратовали за то, что МКЛ это не совсем С и его нужно изучать как отдельный язык ? или я чего перепутал ?

//---------------------------------------------------------------------------------------

Всему есть Единственная и по сущуству правильная Объяснительная - это специализированный язык,
на котором былые Си-привычки только вредят. Не сравнивайте MQL-4 и Си, - только настроение себе испортите.
//---------------------------------------------------------------------------------------

ЗЫ Вы и Компостер повеселили меня слегка. Вы разбазариванием рессурсов ( теперь точно знаю, что амеры таки тупые, как говорит Задорнов. Эти "тупари" с УоллСтрит почему-то уверены, что большее стат преимущество имеет не столько тот у кого лучше система прогнозирования, а тот у кого быстрее выполняются алгоритмы и короче пинг до брокера :) . Вы вообще-то в курсе, что МТ не получает поток котировок пока проводит расчеты экспертов\скриптов\индикаторов ? Да еще разработчики численных методов тоже тупые - зачем-то выдумывают хранение матриц в профильном виде да еще и без нулевых элементов, да еще и алгоритмы обработки ускоряют  - во "придурки" рессурсов то хватает :) ). А вот я сомневаюсь, что бы кто-то из профи спецом ухудшал свой стиль программирования специально для МТ ;).


А Компостер сравнением вызова процедуры с операцией присваивания, да еще и утверждением что вызов процедуры чуть ли не самая быстрая операция (это слегка утрирую :) Интересно, он окромя книжек по МКЛ чего нить вообще читал по программированию ? знает, например, скока операций производится при вызове процедуры, как формируются стеки, чем ФИФО от ЛИФО отличается ? И как потом очищаются .... и все это сравнить с операцией присваивания - одной из самых быстрых (если интеджеры) ?

Ваши с Компостером подходы к разработке вселяют оптимизму. Вот бы это еще в уши и руки разработчиков фильтров котировочного потока на сервере - тока помечтать остается :).


ЗЗЫ а ссылку на массивы предлагали не от хорошей жизни -в МКЛ отсутствует адресная арифметика и параметр по ссылке передать из библиотеки невозможно (может Вы просто еще их не использовали ?) - выход передавать по ссылке не параметр, а ссылку на массив и обращаться к нулевому элементу - это работает.


ИМХО, Прежде чем чего-нить "втирать" новичкам неплохо бы изучить матчасть, дабы не вводить их в заблуждение  ;).


Успехов.

ЗЗЗЫ Специально для Компостера - в аттче скрипт, которы наглядно демонстрирует, что обращение к вызовам функций на порядки медленнее. Изучайте, разбирайтесь (в зависимости от скорострельности компа увеличивайте размерность параметра N, пока не останется нулевого времени исполнения циклов - тогда реально увидите разницу) и не позорьте программистов тупыми сравнениями, особенно когда сами не в теме, а есть тока ссылки на то, что кто-то когда-то пробовал, тока Вы не разобрались что к чему :).

Файлы:
 
VladislavVG:

А Компостер сравнением вызова процедуры с операцией
присваивания
, да еще и утверждением что вызов процедуры чуть ли не самая быстрая операция (это слегка утрирую :)

Интересно, где я приводил это сравнение?


VladislavVG писал (а):
Интересно, он окромя книжек по МКЛ чего нить вообще читал по программированию ? знает, например, скока операций производится при вызове процедуры, как формируются стеки, чем ФИФО от ЛИФО отличается ? И как потом очищаются....

Я и книжки по MQL не читал =)
Я никогда не говорил что являюсь профессиональным программистом. Более того, постоянно признаю что учиться мне еще долго (не "на публику", для себя).

По крайней мере, я не понтуюсь и не говорю о том, чего не знаю.


VladislavVG писал (а):

ИМХО, Прежде чем чего-нить "втирать" новичкам неплохо бы изучить матчасть, дабы не вводить их в заблуждение ;).

ИМХО, "втирает" здесь пока один человек, и это не я.



VladislavVG писал (а):
ЗЗЗЫ Специально для Компостера - в аттче скрипт, которы наглядно демонстрирует, что обращение к вызовам функций на порядки медленнее. Изучайте, разбирайтесь (в зависимости от скорострельности компа увеличивайте размерность параметра N, пока не останется нулевого времени исполнения циклов - тогда реально увидите разницу) и не позорьте программистов тупыми сравнениями, особенно когда сами не в теме, а есть тока ссылки на то, что кто-то когда-то пробовал, тока Вы не разобрались что к чему :).

Поосторожнее на поворотах, мы не на зоне...

Замерять время выполнения программы с помощью TimeLocal() - оригинально. Запишу себе с пометкой "совет профессионального программиста".


Чтоб вы не утруждали себя поисками упомянутой мной темы, приведу цитату здесь:

Rosh писал (а) (19.02.2008 18:15):
Вот скрипт для проверки разницы.


//+------------------------------------------------------------------+
//|                                        CheckCalculationSpeed.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/ru/"
 
#property show_inputs
 
 
//+------------------------------------------------------------------+
//|  implemented Test functiom                                       |
//+------------------------------------------------------------------+
double test()
   {
   int    res_int=0,i;
   double res_double=0;
//----
   for(i=0;i<=10000000;i++)
     {
      res_int+=i*i;
      res_int++;
      res_double+=i*i;
      res_double++;
     }
   return(res_double);
   }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
  double Impl=test();
  double Custom=iCustom(NULL,0,"Test",5,0,0);
//----
   Print("Implemented retuns ",Impl,",   iCustom returns ",Custom,", diiff=",Impl-Custom);
   
//----
   int i,start,stop;
   //Measuring time for test function
   start=GetTickCount();
   for (i=0;i<100;i++) test();
   stop=GetTickCount();
   int testTime=(stop-start)/1000.0;
 
   //Measuring time for direct calculation
   int    res_int=0,j;
   double res_double=0;
 
   start=GetTickCount();
   for (j=0;j<100;j++) 
      {
      for(i=0;i<=10000000;i++)
        {
         res_int+=i*i;
         res_int++;
         res_double+=i*i;
         res_double++;
        }
     }     
   stop=GetTickCount();
   int customTime=(stop-start)/1000.0;
   string text=StringConcatenate("Time for implemented function test() is ",testTime,"  seconds");
   text=StringConcatenate(text,"\n Time for direct Calculation block  is ",customTime,"  seconds");
   Comment(text);
 
//----
   return(0);
  }
//+------------------------------------------------------------------+

А вот результаты работы скрипта.




Как видите, использование отдельной функции вполне оправдано - разница по времени для цикла в миллиард проходов всего одна секунда. Зато насколько проще разрабатывать код!

 
komposter:
VladislavVG:

А Компостер сравнением вызова процедуры с операцией
присваивания
, да еще и утверждением что вызов процедуры чуть ли не самая быстрая операция (это слегка утрирую :)

Интересно, где я приводил это сравнение?



Здесь. Я же написал, что сравнение "слегка утрирую".

//----------------------------------------------------------------

sasa999 писал (а):

и еще непонятно - если вызов функции самая медленная операция, тогда почему например КimIV в своих примерах използует почти все только из набора функций?

Это Ваш ответ :

Вас дезинформировали =)
На вызове функции теряется очень мало (недавно Rosh приводил результаты сравнения).

//----------------------------------------------------------------

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


По поводу "мерять производительность" - При такой разнице все равно чем пользоваться. 

Для того, чтобы сравнить величины порядка метров с величинами порядка десятков метров не обязательно брать линейку с миллиметровой шкалой.


По поводу зоны не понял ?


ЗЫ если Вы считате, что я чего-то "втираю" потрудитесь привести неверные высказывания и количественные оценки. Пока же я Вам показал на основании чего я сделал свои выводы.


Успехов.

 

И что "этот человек", т.е. я втирает?
Раз уж человеком обозвали, объяснюсь)))
Вообще то ветка началась с того, что новичек, "при вступлении во Храм", не нашел своего логического объяснения,
-почему return каждый раз разный, почему некто параметры для функций присваивает отдельно, а не в вызове.
Ну я привел пример, как транслятор исправляет ошибки в описании функции.
А ранее, прошелся по &ссылке, опять же потому,
что в некотором кол-ве постов некие ГУру предлагают простую переменную в описании обзывать массивом.)))
Никаких терок тут нет.

Добавлю следующее. Сила и красота Си в развитой передаче параметров. От этого вся сила Си.
в функциях сила!!!
Например опять же у меня программирование давно уже не знания, а рефлексы.)))
Здесь поясняю: при программировании,
первое что делаю - проектирую входные/выходные данные, тестирую.
Второе - изобретаю метаязык из функций или же объектов.
Третье - пишу на метаязыке верхнюю часть проги, и уточняю объекты/функции, уточняю удоство передачи параметров.
Четвертое - пишу уточненные объекты/функции.
Иначе не могу. Стошнит.

Так вот, этот MQL-4 НЕ ПОЗВОЛЯЕТ работать так привычно.
-Спроектируешь вход/выход, ан адресации такой в MQL-4 нет.
-изобретешь метаязык под задачу, И опять же нельзя выполнить задумку, формальные параметры так не адресуются.

Но настоящий то ум не спрячешь. В нем Думатель взрощен.
Думатель - Он видит, - везде фигурные скобки, Думатель напрягается чтобы их не пропустить }}},
И ВКЛЮЧАЕТ взрощенный Думатель РЕФЛЕКС, этО якобы сИ.
по рефлексу начинается проектирование мозжечком, а то вот так то сделать, а здесь эдак. но - опаньки....MQL-4

 
VladislavVG:

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


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


Но есть несколько "но":

1. Я действительно говорил о целесообразности применения функций. И более чем уверен, топик-стартера интересовал именно этот вопрос (можем у него спросить). То, что увидели вы в моих словах - лично ваши проблемы. Особенно, учитывая тот факт, что увидели "это" только вы.

2. Я не сравнивал вызов функции с операцией присваивания.


К этим "но" прибавляем несколько ваших высказываний:

А Компостер сравнением вызова процедуры с операцией присваивания, да еще и утверждением что вызов процедуры чуть ли не самая быстрая операциято слегка утрирую :)

и все это сравнить с операцией присваивания - одной из самых быстрых (если интеджеры) ?

1. Сравнения не было.
2. Утверждения не было.
3. Фраза "слегка утрирую" с улыбочкой - плохое оправдание откровенной клевете. По крайней мере, не достаточное для меня.


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


Есть еще одно, на дессерт:

и не позорьте программистов тупыми сравнениями особенно когда сами не в теме, а есть тока ссылки на то, что кто-то когда-то пробовал, тока Вы не разобрались что к чему :)

1. Сравнение, которого не было, оказывается, тупое. И я, соответственно, тупой?
2. "Тока" надо было сначала разобраться в чем я разобрался, а в чем нет. А пока - только безосновательная клевета.
3. Улыбочка, опять же, не оправдание.


VladislavVG писал (а):
ЗЫ если Вы считате, что я чего-то "втираю" потрудитесь привести неверные высказывания и количественные оценки.


Под термином "втирание" лично я подразумеваю навязывание своего мнения окружающим.

Надеюсь, я достаточно подробно ответил что именно в ваших высказываниях я считаю "втиранием".