Ошибки, баги, вопросы - страница 96

 

Чёто я запутался, подскажите кто знает.

Создал структуру, заполнил её данными, создал массив структур.

Как теперь передать в функцию массив но только на один елемент структуры ??????????????

struct Str
  {
   int               a;
   int               b;
                     Str(){a=2;b=3;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[10];
void OnStart()
  {
   Print("sum a=",OnStr(srt[].a));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr(const Str &x[].y)?????????????????????
  {
   int sum=0;
   for(int i=0;i<10;i++)
     {
      sum+=x[i].y;
     }
   return(sum);
  }
 

Предложение разработчикам, если возможно былоб хорошо совершать стандартные операции со структурами

не вот так:

struct Str
  {
   int               a;
   int               b;
                     Str(){a=2;b=3;};
                    ~Str(){};
  };
Str x;
Str y;
void OnStart()
  {
   x.a+=y.a;
   x.b+=y.b;   
  }

а вот так:

void OnStart()
  {
   x+=y;     
  }
копирование структур есть осталось дело за малым.
 
Urain:

Чёто я запутался, подскажите кто знает.

Создал структуру, заполнил её данными, создал массив структур.

Как теперь передать в функцию массив но только на один елемент структуры ??????????????


Никак. Да и незачем.

Потому что - кто мешает в функции суммирования именно тот элемент и суммировать?

Вот и код подправлен до "кошерного":

struct Str
  {
   int               a;
   int               b;
                     Str(){a=2;b=3;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[10];
void OnStart()
  {
   Print("sum a=",OnStr(srt));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr(const Str &x[])?????????????????????
  {
   int sum=0;
   for(int i=0;i<10;i++)
     {
      sum+=x[i].y;
     }
   return(sum);
  }

Только что-то типа ArraySize() в реальности надо употребить, а не 10 в цикле for внутри функции OnStr(). И вместо y в "sum+=x[i].y" реальное поле данных, определённое в структуре, суммировать (a или b, например).

 
Urain:

Предложение разработчикам, если возможно былоб хорошо совершать стандартные операции со структурами

не вот так:

а вот так:

копирование структур есть осталось дело за малым.

В C++ такое есть. Называется "operator overloading". Как должно работать, - задаёт программист с помощью соответствующей функции.

Однако, сей feature'е Renat сказал "нет". Не повезло, да?

 
simpleton:

Никак. Да и незачем.

Потому что - кто мешает в функции суммирования именно тот элемент и суммировать?

Вот и код подправлен до "кошерного":

Только что-то типа ArraySize() в реальности надо употребить, а не 10 в цикле for внутри функции OnStr(). И вместо y в "sum+=x[i].y" реальное поле данных, определённое в структуре, суммировать (a или b, например).

Как всегда когда привожу примеры суть улетела, но я не удивляюсь всему виной наверно моё костноязычье.

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

Пример привёл для простоты но наверно неудачный. Но в принципе спасибо за разьяснения.

Видимо действительно нужно долбить разработчиков чтоб разрешили "operator overloading".

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

Нда пришлось писать кучу методов на то чтоб просто сложить, умножить, разделить, две структуры,

самое паскудное что на другие структуры прийдётся всё это писать по новой.

PS так мало того методы отдают тип структуры те в ретурне такаяже структура которыми оперируем так вот вложеный вызов не проходит ???

результат сначало нужно сохранить во временную структуру а потом уже её передать на последующую обработку ?? не ясно зачем так сделано.

PPS хотя все параметры стоят const те возможности что будет изменение несуществующей переменной нет.

        

PPPS а сори структуры то передаються по ссылке, как можно ссылаться на несуществующую структуру(видимо пора отдыхать).

 
int sl_pips = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
Ошибочное замечание "possible loss of data due to type conversion"? (Build: 305)
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Urain:

Чёто я запутался, подскажите кто знает.

Создал структуру, заполнил её данными, создал массив структур.

Как теперь передать в функцию массив но только на один елемент структуры ??????????????

struct Str
  {
   int               a;
   int               b;
                     Str(){a=2;b=3;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[10];
void OnStart()
  {
   Print("sum a=",OnStr(srt[].a));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr(const Str &x[].y)?????????????????????
  {
   int sum=0;
   for(int i=0;i<10;i++)
     {
      sum+=x[i].y;
     }
   return(sum);
  }

simpleton:

Никак. Да и незачем.

Потому что - кто мешает в функции суммирования именно тот элемент и суммировать?

Вот и код подправлен до "кошерного":

Только что-то типа ArraySize() в реальности надо употребить, а не 10 в цикле for внутри функции OnStr(). И вместо y в "sum+=x[i].y" реальное поле данных, определённое в структуре, суммировать (a или b, например).

Есть два варианта (насколько я понимаю):

1. Передать массив сам массив, указав дополнительным параметрам индекс записи с которым будем работать.

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

OnStr(const Str &x[], int Index=-1)

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

Объявление функции тогда будет выглядеть примерно так...

OnStr(const Str &x[1])
Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - Документация по MQL5
 
EvgeTrofi:
Ошибочное замечание "possible loss of data due to type conversion"? (Build: 305)

Необходимо явное приведение результата к типу int.

int sl_pips = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);

PS

Рабочий пример можно посмотреть тут - OrderSend()

Но как я понимаю на данное предупреждение в принципе можно закрыть глаза...

 

Если в return много скобок - он начинает путаться!?

 Вот, к примеру функция, которая возвращает число из строки типа "klsfd Step 2.":

int GetStep(string text){
   string Right;
   int U = StringFind(text, "Step ");
   int End, result;
   if(U>=0){
      U=U+5;
      Right = StringSubstr(text, U);
      End = StringFind(Right, ".");
      result=int(MathRound(StringToDouble(StringSubstr(text, U, End-U))));
      return(result);
   }
   return(0);
}

 Чем она отличается от этой?

int GetStep(string text){
   string Right;
   int U = StringFind(text, "Step ");
   int End;
   if(U>=0){
      U=U+5;
      Right = StringSubstr(text, U);
      End = StringFind(Right, ".");
      return(int(MathRound(StringToDouble(StringSubstr(text, U, End-U)))));
   }
   return(0);
}

 Во втором варианте возникнут проблемы при компиляции, а в первом - нет.

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