Errori, bug, domande - pagina 96

 

Sono confuso, per favore consigliatemi.

Ho creato una struttura, l'ho riempita di dati, ho creato un array di strutture.

Come posso ora passare un array a una funzione, ma solo per un elemento della struttura ??????????????

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);
  }
 

Suggerimento agli sviluppatori, se possibile sarebbe bene eseguire operazioni standard con le strutture

non come questo:

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;   
  }

ma così:

void OnStart()
  {
   x+=y;     
  }
Copiare le strutture è una cosa del passato.
 
Urain:

Sono confuso, per favore consigliatemi.

Ho creato una struttura, l'ho riempita di dati, ho creato un array di strutture.

Come passare un array a una funzione, ma solo per un elemento della struttura ??????????????


Non si può. E non ne hai bisogno.

Perché - chi impedisce alla funzione sommatrice di sommare solo quell'elemento?

E così il codice è stato corretto per renderlo "kosher":

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);
  }

Solo qualcosa come ArraySize() dovrebbe essere usato in realtà invece di 10 nel ciclo for all'interno della funzione OnStr(). E invece di y in "sum+=x[i].y" sommate il campo dati reale definito nella struttura (a o b, per esempio).

 
Urain:

Suggerimento agli sviluppatori, se possibile sarebbe bene eseguire operazioni standard con le strutture

non come questo:

ma così:

La copia delle strutture è una cosa del passato.

Esiste una cosa del genere in C++. Si chiama "sovraccarico dell'operatore". È il programmatore che definisce come deve funzionare usando la funzione corrispondente.

Ma questa funzione Renat ha detto "no". Sfortuna, eh?

 
simpleton:

Non posso. E non ce n'è bisogno.

Perché chi vi impedisce di sommare esattamente quell'elemento nella funzione di somma?

Quindi il codice è stato corretto in "kosher":

Solo qualcosa come ArraySize() dovrebbe essere usato al posto di 10 nel ciclo for all'interno della funzione OnStr(). E invece di y in "sum+=x[i].y" sommate il campo dati reale definito nella struttura (a o b, per esempio).

Come sempre quando faccio degli esempi il punto è volato via, ma non mi sorprende che sia probabilmente la mia lingua ossuta.

E il succo è questo: scrivere una funzione di media aritmetica e poi semplicemente passando un array di strutture a questa funzione, ottenere la struttura della media aritmetica per ciascuno dei membri della struttura.

L'esempio è dato per semplicità, ma probabilmente non ha successo. Ma grazie per i chiarimenti di principio.

Credo che dovremmo davvero sbatterci gli sviluppatori per permettere il "sovraccarico dell'operatore".

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

Sì, ho dovuto scrivere un sacco di metodi solo per aggiungere, moltiplicare, dividere, due strutture,

la cosa più fastidiosa è che dovremo scrivere tutto da capo su altre strutture.

PS Oltre ai metodi che danno il tipo di struttura, quelli che restituiscono la stessa struttura con cui operiamo quindi la chiamata annidata non passa?

il risultato deve prima essere salvato in una struttura temporanea e poi passato all'elaborazione successiva ?? non è chiaro perché si faccia così.

PPS Anche se tutti i parametri sono costanti non c'è la possibilità di cambiare una variabile non esistente.


PPPS E scusate, le strutture sono passate per riferimento, come potete fare riferimento a una struttura inesistente (a quanto pare, è ora di riposare).

 
int sl_pips = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
Osservazione errata"possibile perdita di dati a causa della conversione del tipo"? (Costruire: 305)
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Urain:

Sono confuso, per favore consigliatemi.

Ho creato una struttura, l'ho riempita di dati, ho creato un array di strutture.

Come passare un array a una funzione, ma solo per un elemento della struttura ??????????????

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);
  }

sempliciotto:

Non si può. E non ne hai bisogno.

Perché - chi impedisce alla funzione sommatrice di sommare solo quell'elemento?

Quindi, il codice è adattato a "kosher":

Solo qualcosa come ArraySize() dovrebbe essere effettivamente usato, non 10 nel ciclo for dentro OnStr(). E invece di y in "sum+=x[i].y" sommate il campo dati reale definito nella struttura (a o b, per esempio).

Ci sono due modi (per quanto ho capito):

1. Passa l'array stesso, specificando l'indice del record con cui lavoreremo come parametro aggiuntivo.

In questo caso, abbiamo bisogno di controllare la dimensione dell'array, e la dichiarazione della funzione sarebbe qualcosa del genere...

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

2. Passa la matrice secondaria con la dimensione di un record, rispettivamente tutto il lavoro di controllo e di elaborazione dei risultati della funzione è tenuto al punto di chiamata della funzione.

La dichiarazione della funzione sarà quindi qualcosa di simile a questo

OnStr(const Str &x[1])
Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - Документация по MQL5
 
EvgeTrofi:
Osservazione errata"possibile perdita di dati a causa della conversione del tipo"? (Costruire: 305)

È necessario convertire esplicitamente il risultato nel tipo int.

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

PS

Si può vedere un esempio funzionante qui - OrderSend()

Ma da quanto ho capito, questo avvertimento può essere ignorato in linea di principio...

 

Se il ritorno ha molte parentesi - comincia a confondersi!?

Ecco, per esempio, una funzione che restituisce un numero da una stringa come "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);
}

In cosa è diverso da questo?

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);
}

La seconda causerà problemi di compilazione, ma la prima no.