Передача параметров по ссылке - страница 2

 
Давайте для начала вспомним, что такое Арифметика. Вот, например, как это описано здесь - http://www.krugosvet.ru/articles/15/1001515/1001515a1.htm
 
ну что такое структура? - для сержантов и домохозяек это всего лишь массив адресных ссылок, т.е. статически распределнный (при компиляции) массив указателей.
О чем дальше говорить Если передается структура, Но не передается массив)))
 

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

Структура - это вовсе не массив адресных ссылок (массив адресных ссылок можно рассматривать только как один частный случай структуры). Структура - это набор данных любых типов, хранящихся совместно.

Не путайте понятия "передавать" и "возвращать". В mql5 можно передавать в качестве параметра и массивы, и структуры, и любые типы данных, в том числе и по ссылке.

Зачем возвращать из функции что-либо сложнее атомарных типов?

 

1.
структура это развитие массива. Если со структурой -"можно" а с массивом -"нельзя" то это исскуственное ограничение.

2.
Если бы МТ был платный, вот тогда спор имел бы хоть какой то смысл. А так - вы делаете как можете, мы используем как получится.
3.
Более того, я согласен (т.е не против) с исскуственными ограничениями в МТ))))

4.

Спор можно окончить очень просто - я удаляю свои посты - вы свои, = зачем мне критиковать Вашу Епархию.
Удаляем?

 

1. Массив - это совсем другая сущность. Структура - набор данных любых типов, ограниченный описанием. Массив совокупность однотипных данных, ограниченная размерностью.

2. Не понял фразы

3. Нет искусственных ограничений. Ограничение по возврату массива - естественное, во-первых, из-за отсутствия адресной арифметики, во-вторых из соображений безопасности кода.

Представляете, что будет, если позволить такое

int[] FuncThatReturnedArray(void)
  {
   int ret_array[1000];
...
   return(ret_array);
  }

Порча возвращённого массива гарантирована.

4. Я не собираюсь удалять свои посты

 
nt start()
  {   
      double m1[10][10][10]; string m2[10];
      my_func(m1,m2);
      Print(m1[3][1][2],"  string=",m2[0]);   
   return(0);
  }
  
void my_func(double& array[][][], string& array2[])
{
array2[1]="gghghgh";
array2[0]=array2[1]+"56565535367";
array[3][1][2]=7777777;
}
 
Пример адресной арифметики Metalang
трехмерный массив комментировать небуду.
а вот со строками - в функцию передается адрес (ссылка на) массив указателей (адресов) символльных строк.
далее функция делает с элементами строковго массива все что хочет. Т.е. строки ==элемент массив азаново инициируются., т.е. динамически распределляется память.
Это означает 
что Metalang использует в случае массива строк косвенную адресацию вида *array[].
P.S.Забыл дописать что строка это массив байт ограниченный нулем,
-как видите при возврате по значению массива байт ничего страшного не происходит.
 

Ещё раз. Адресная арифметика предполагает произвольное изменение адресов, указывающих в оперативную память, причём прямое изменение, а не опосредованное. Причём именно изменение адресов, а не содержимого, хранящегося по этим адресам.

char *cp=some_string_address;
int   str_len=0;
if(cp!=NULL)
  {
   while(*cp++!=0) str_len++;
  }

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

char *cp=some_string_address;
int  *ip=cp;
//---
cp++;
ip++;
В результате одной и той же операции инкремента указатели cp и ip будут указывать на разные ячейки памяти
 
адресная арифметика была всегда. Когда появились ** и && это просто удобство, но не новое изобретение.
Это просто, очень просто сделать, поскольку работа компилятора ни в чем таком принципиальном не изменяется.
- Компиллятор и без программиста собирает эти адреса,, и сам распределяет ** &&..
То что вы называeтe адресной арифметикой и которой якобы нет это не сама адресная арифметика а ее интерфейс
Т.е. в Metalang адресная арифметика есть, однако к ней нет программного интерфейса.
____Возврат инициированной в функции символьной строки, которая в свою очередь элемент массива возможен и - работает прекрасно,
а вот возврат массива не возможен, увы))) якобы нельзя.
 

Передача структуры по ссылке - с удовольствием :) - но сегодня это работает только в пределах одного модуля. А как мне отдать структуру на переработку функции из другого модуля и получить ее назад?


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


А может есть какой-нибудь платный нормальный клиентский API (для С/С++)? Как раньше был бесплатный.

Или механизм какой-нибудь типа callback'а, что бы можно было выполнять операции в терминале по инициативе dll-ки. Без этого полноценно в dll-ку логику не вынести, разве что сделать API для API метатрейдера, что бы его в dll юзать для получения торговых параметров, но без такого callback'а придется весь массив данных из MT кидать в dll по каждому тику.

 
stringo писал (а) >>

1. Массив - это совсем другая сущность. Структура - набор данных любых типов, ограниченный описанием. Массив совокупность однотипных данных, ограниченная размерностью.

1. Для MQL - верно, для других языков (например мой любимый PHP) не верно.

2. В PHP с массивами можно делать ВСЁ.

3. Ссылка в описании на массивы:

http://www.php.net/manual/ru/language.types.array.php

http://www.php.net/manual/ru/book.array.php

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