Error extraño con arrays

burrocampeador
Mensajes: 22
Registrado: 15 Nov 2014 11:04

Error extraño con arrays

Mensaje por burrocampeador »

Una duda para los que programáis en Metatrader4. Me estoy volviendo loco a la hora de usar la función iMAOnArray en Metatrader4. Llevo 2 horas con error en tiempo de ejecución totalmente sorprendente. A ver si sois tan amables de decirme qué estoy haciendo mal. Tengo este código sencillo para unas pruebas:

double macd[500];
macd[400]=20;
iMAOnArray(macd,0,50,0,MODE_SMA,0);

Me da error en tiempo de ejecución. En la segunda línea me dice que el acceso al array está fuera de rango (lo cual no debería ser). Sin embargo, si comento la última línea (la de iMAOnArray), entonces me deja de dar el error en tiempo de ejecución. O sea la presencia/ausencia de la tercera línea me provoca la presencia/ausencia de un error en la segunda línea. Es de locos. ¿Alguno sabéis a qué puede ser debido?
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Error extraño con arrays

Mensaje por X-Trader »

Hola burrocampeador, ¿qué tal todo? Necesito más datos sobre el cálculo que quieres realizar. Según lo planteas entiendo que:

- Creas un array unidimensional llamado "macd" con 500 valores pero vacío.
- Luego rellenas 400 valores del array con el valor 20.
- Y finalmente calcular la media móvil de ese array.

Quizás se pueda hacer de forma más sencilla, cuéntame y lo miro.

Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
burrocampeador
Mensajes: 22
Registrado: 15 Nov 2014 11:04

Re: Error extraño con arrays

Mensaje por burrocampeador »

No te preocupes sobre el propósito del programa, no tiene importancia para ver el porqué del error. He sacado lo esencial del error en esas tres líneas. La segunda línea no rellena 400 valores del array con el valor 20, sino que sólo mete el valor 20 en la posición 400 del array. Gracias de todos modos.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Error extraño con arrays

Mensaje por cls »

burrocampeador escribió: 29 Nov 2020 10:55 Una duda para los que programáis en Metatrader4. Me estoy volviendo loco a la hora de usar la función iMAOnArray en Metatrader4. Llevo 2 horas con error en tiempo de ejecución totalmente sorprendente. A ver si sois tan amables de decirme qué estoy haciendo mal. Tengo este código sencillo para unas pruebas:

double macd[500];
macd[400]=20;
iMAOnArray(macd,0,50,0,MODE_SMA,0);

Me da error en tiempo de ejecución. En la segunda línea me dice que el acceso al array está fuera de rango (lo cual no debería ser). Sin embargo, si comento la última línea (la de iMAOnArray), entonces me deja de dar el error en tiempo de ejecución. O sea la presencia/ausencia de la tercera línea me provoca la presencia/ausencia de un error en la segunda línea. Es de locos. ¿Alguno sabéis a qué puede ser debido?
Si el array es local, no se inicializa, así que los clústers no asignados estarán indeterminados. Aquí lo explica.
http://www.cplusplus.com/doc/tutorial/arrays/

Para salir de dudas haz un bucle for para llenar el array. Algo como esto (está en C# pero será parecido en MQL):

Código: Seleccionar todo

for(int i=0; i < macd.Length; i++)
   macd[i] = 250;
S2
Avatar de Usuario
Karachiento
Mensajes: 68
Registrado: 17 Ago 2018 23:03

Re: Error extraño con arrays

Mensaje por Karachiento »

burrocampeador escribió: 29 Nov 2020 10:55
Me da error en tiempo de ejecución. En la segunda línea me dice que el acceso al array está fuera de rango (lo cual no debería ser).
Los errores en tiempo de ejecución son los que se producen durante la ejecución del programa. No son detectados por el compilador, ya que son errores de lógica, no de sintaxis. El error que describes (array out of range) es un error de sintaxis que si es detectado por el compilador.

Ademas de revisar lo que te propusieron en el post anterior, ya que es una buena practica en programación inicializar los arrays al comienzo, te recomendaría revisar los ciclos for, ya que aveces, cuando se declara el vector se lo dimensiona de 400 valores por ejemplo (posiciones del 0 al 399) y luego inconscientemente se escribe "for (i = 1; i <= 400; i = i + 1)" lo que produce el error descrito ya que no existe la posición 400.

Saludos

burrocampeador
Mensajes: 22
Registrado: 15 Nov 2014 11:04

Re: Error extraño con arrays

Mensaje por burrocampeador »

Muchas gracias a todos por vuestras respuestas, pero lamentablemente no me ha servido de ayuda. Soy programador profesional y sé lo que es un error en tiempo de ejecución y todas las ideas que intentáis transmitirme están claras para mí.

Insisto en que el problema está en la asignación del array. Ahí me da un error de fuera de rango cuando no me lo debería dar, ya que no está fuera de rango. Y lo extraño es que ese error no me lo da cuando la tercera línea desaparece.

En el programa completo efectivamente inicializo todo el array y pasa lo mismo. He condensado las líneas relevantes en estas tres para que podáis ver el error más claramente.

¿Alguno que programáis habitualmente en MQL4 me podéis dar alguna pista de lo que está ocurriendo? ¿Os ha pasado alguna vez?

Un saludo y gracias por todo.
Nightmare
Mensajes: 459
Registrado: 23 May 2018 09:23

Re: Error extraño con arrays

Mensaje por Nightmare »

Pues solo queda suponer lo siguiente

1) double macd[500];
2) macd[400]=20;
3) iMAOnArray(macd,0,50,0,MODE_SMA,0);

- efectivamente la asignacion de la linea 2 es correcta. Todos los demas elementos del arreglo estan indefinidos.

- el error en tiempo de ejecucion lo da en la linea 3, justamente por esa indefinicion, ya que trata de acceder a todos los elementos, de los cuales solo 1 tiene un valor.
*** Aca viene la suposicion: que al marcar el error en la linea 2 es porque al no tener elementos definidos busca la linea donde asignas los elementos, esa asignacion solo la encuentra en la linea 2, y marca esa linea como error.

- Al comentar la 3ra linea no encuentra error alguno ;)

Saludos.
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Error extraño con arrays

Mensaje por X-Trader »

Al hilo de lo que comenta Nightmare se me ocurre un par de ideas: fija primero el tamaño con ArrayResize y luego rellena todo el array con ceros antes de asignar el valor a la posición 400 usando ArrayFill. Tu código quedaría así:

double macd[];
ArrayResize(macd,500);
ArrayFill(macd,0,500,0);
macd[400]=20;
iMAOnArray(macd,0,50,0,MODE_SMA,0);

Cuéntanos si con eso se soluciona.


Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
burrocampeador
Mensajes: 22
Registrado: 15 Nov 2014 11:04

Re: Error extraño con arrays

Mensaje por burrocampeador »

X-Trader escribió: 03 Dic 2020 09:38 Al hilo de lo que comenta Nightmare se me ocurre un par de ideas: fija primero el tamaño con ArrayResize y luego rellena todo el array con ceros antes de asignar el valor a la posición 400 usando ArrayFill. Tu código quedaría así:

double macd[];
ArrayResize(macd,500);
ArrayFill(macd,0,500,0);
macd[400]=20;
iMAOnArray(macd,0,50,0,MODE_SMA,0);

Cuéntanos si con eso se soluciona.


Saludos,
X-Trader
Gracias por tu respuesta. Todo eso (y muchas más combinaciones e ideas posibles) ya las probé antes de postear el error. Me sigue dando error "out of range" cuando escribo en el array, es decir en la línea de ArrayFill. A partir de ahí ya no sigue ejecutando más, obviamente. Gracias de todos modos por tu tiempo. Doy este lenguaje por imposible... qué pena.
burrocampeador
Mensajes: 22
Registrado: 15 Nov 2014 11:04

Re: Error extraño con arrays

Mensaje por burrocampeador »

Nightmare escribió: 03 Dic 2020 08:46 Pues solo queda suponer lo siguiente

1) double macd[500];
2) macd[400]=20;
3) iMAOnArray(macd,0,50,0,MODE_SMA,0);

- efectivamente la asignacion de la linea 2 es correcta. Todos los demas elementos del arreglo estan indefinidos.

- el error en tiempo de ejecucion lo da en la linea 3, justamente por esa indefinicion, ya que trata de acceder a todos los elementos, de los cuales solo 1 tiene un valor.
*** Aca viene la suposicion: que al marcar el error en la linea 2 es porque al no tener elementos definidos busca la linea donde asignas los elementos, esa asignacion solo la encuentra en la linea 2, y marca esa linea como error.

- Al comentar la 3ra linea no encuentra error alguno ;)

Saludos.
No es eso porque en mi programa entero obviamente primero asigno todas las posiciones del array (o lo intento, porque sigue dando el error en la primera de las asignaciones que hago).
Nightmare
Mensajes: 459
Registrado: 23 May 2018 09:23

Re: Error extraño con arrays

Mensaje por Nightmare »

Eso seria lo mismo, te marca error en la asignacion luego de intentar usar el array.
burrocampeador
Mensajes: 22
Registrado: 15 Nov 2014 11:04

Re: Error extraño con arrays

Mensaje por burrocampeador »

Hola a todos:

Aún no he podido encontrar la razón de este extraño error. Sin embargo, declarando el array como global en vez de local funciona perfectamente. Metatrader es un infierno y está muy mal hecho.

Un saludo!
Nightmare
Mensajes: 459
Registrado: 23 May 2018 09:23

Re: Error extraño con arrays

Mensaje por Nightmare »

tal vez la declaracion o asignacion del array la estas haciendo fuera del ambito de donde la usas ;)
burrocampeador
Mensajes: 22
Registrado: 15 Nov 2014 11:04

Re: Error extraño con arrays

Mensaje por burrocampeador »

Nightmare escribió: 10 Dic 2020 22:51 tal vez la declaracion o asignacion del array la estas haciendo fuera del ambito de donde la usas ;)
¿Cómo va a ser eso posible, si están las tres líneas seguidas? :lol:
Nightmare
Mensajes: 459
Registrado: 23 May 2018 09:23

Re: Error extraño con arrays

Mensaje por Nightmare »

Como mencionas que tu programa era mucho mas grande y lo cortaste ;) ;)
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Expert Advisors”