Errores, fallos, preguntas - página 96

 

Estoy confundido, por favor aconséjeme.

He creado una estructura, la he llenado de datos y he creado una matriz de estructuras.

¿Cómo puedo ahora pasar una matriz a una función, pero sólo en un elemento de la estructura ??????????????

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

Sugerencia a los desarrolladores, si es posible sería bueno realizar operaciones estándar con estructuras

no así:

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

sino así:

void OnStart()
  {
   x+=y;     
  }
Copiar estructuras es cosa del pasado.
 
Urain:

Estoy confundido, por favor aconséjeme.

He creado una estructura, la he llenado de datos y he creado una matriz de estructuras.

Cómo pasar un array a una función, pero sólo para un elemento de la estructura ??????????????


No se puede. Y no es necesario.

Porque -¿quién impide que la función sumadora sume sólo ese elemento?

Y así se corrigió el código para hacerlo "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);
  }

Sólo se debería usar algo como ArraySize() en realidad en lugar de 10 en el bucle for dentro de la función OnStr(). Y en lugar de y en "sum+=x[i].y" sumar el campo de datos real definido en la estructura (a o b, por ejemplo).

 
Urain:

Sugerencia a los desarrolladores, si es posible sería bueno realizar operaciones estándar con estructuras

no así:

sino así:

La copia de estructuras es cosa del pasado.

En C++ existe algo así. Se llama "sobrecarga de operadores". Es el programador quien define cómo debe funcionar utilizando la función correspondiente.

Pero esta función Renat dijo "no". Mala suerte, ¿eh?

 
simpleton:

No puedo. Y no es necesario.

Porque ¿quién le impide sumar exactamente ese elemento en la función de suma?

Así que el código fue corregido a "kosher":

Sólo se debería utilizar algo como ArraySize() en lugar de 10 en el bucle for dentro de la función OnStr(). Y en lugar de y en "sum+=x[i].y" sumar el campo de datos real definido en la estructura (a o b, por ejemplo).

Como siempre que pongo ejemplos el punto voló, pero no me sorprende que sea por mi lenguaje de huesos.

Y la esencia es esta: escribir una función de media aritmética y luego, simplemente pasando un array de estructuras a esta función, obtener la estructura de la media aritmética para cada uno de los miembros de la estructura.

El ejemplo se da para simplificar, pero probablemente no tenga éxito. Pero gracias por las aclaraciones en principio.

Supongo que deberíamos presionar a los desarrolladores para que permitan la "sobrecarga de operadores".

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

Sí, tuve que escribir un montón de métodos sólo para sumar, multiplicar, dividir, dos estructuras,

lo más molesto es que tendremos que volver a escribirlo en otras estructuras.

PD Además los métodos dan tipo de estructura los que en retorno la misma estructura con la que operamos por lo que la llamada anidada no pasa ???

el resultado debe guardarse primero en una estructura temporal y luego pasar al procesamiento posterior... no está claro por qué se hace así.

PPS Aunque todos los parámetros son constantes no hay posibilidad de cambiar una variable no existente.


PPPS Y perdón, las estructuras se pasan por referencia, cómo se puede hacer referencia a una estructura inexistente (por lo visto, toca descansar).

 
int sl_pips = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
Observación errónea"posible pérdida de datos debido a la conversión de tipos"? (Construcción: 305)
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Urain:

Estoy confundido, por favor aconséjeme.

He creado una estructura, la he llenado de datos y he creado una matriz de estructuras.

Cómo pasar un array a una función, pero sólo para un elemento de la estructura ??????????????

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

simplón:

No se puede. Y no es necesario.

Porque -¿quién impide que la función sumadora sume sólo ese elemento?

Por lo tanto, el código se ajusta a "kosher":

Sólo algo como ArraySize() debería usarse realmente, no 10 en el bucle for dentro de OnStr(). Y en lugar de y en "sum+=x[i].y" sumar el campo de datos real definido en la estructura (a o b, por ejemplo).

Hay dos formas (según tengo entendido):

1. Pasa el propio array, especificando el índice del registro con el que vamos a trabajar como parámetro adicional.

En este caso, necesitamos controlar la dimensionalidad del array, y la declaración de la función sería algo así...

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

2. Pasar la matriz secundaria con la dimensión de un registro, respectivamente todo el trabajo de control y procesamiento de los resultados de la función se lleva a cabo en el punto de llamada de la función.

La declaración de la función tendrá entonces un aspecto similar al siguiente

OnStr(const Str &x[1])
Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - Документация по MQL5
 
EvgeTrofi:
Observación errónea"posible pérdida de datos debido a la conversión de tipos"? (Construcción: 305)

Es necesario convertir explícitamente el resultado al tipo int.

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

PS

Puede ver un ejemplo de funcionamiento aquí - OrderSend()

Pero según tengo entendido, esta advertencia puede ser ignorada en principio...

 

Si la devolución tiene muchos paréntesis - ¡se empieza a confundir!?

Aquí, por ejemplo, hay una función que devuelve un número a partir de una cadena como "klsfd Paso 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);
}

¿En qué se diferencia de ésta?

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

El segundo causará problemas de compilación, pero el primero no.

Razón de la queja: