Errores, fallos, preguntas - página 1017

 
A100:

En resumen, no se puede definir una implementación de función en .mqh y utilizarla sin problemas en cualquier .ex5

:)

Pero cuando se utiliza un .ex5 para llamar a funciones en otro .ex5, aunque la función con ese nombre exista en ambos, hay que asegurarse de especificar el espacio de nombres con precisión. Es decir, la función ::In() debería, en teoría, resolver el problema. Y si no lo hace, se trata de un error que hay que arreglar.

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 

Dejemos la respuesta del ServiceDesk:

"Al compilar 1.mq5, dentro de la función B() no queda claro a qué función se debe llamar,
importada A() o exportada A() - porque el compilador no entiende que se refería a la misma función"

Son correctos en la forma - pero si quisieras, podrías (y deberías) decirle al compilador que es la misma función, ya que repito el nombre del módulo en el momento de la compilación está disponible (especificado en #import).

Más aún, si primero pones :: en un lugar y compilas, luego borras y pones :: en otro - todo funciona, pero debes estar de acuerdo - es muy incómodo y después de 10-15 permutaciones tan forzadas me cambié a #define

 
A100:

Dejemos la respuesta del ServiceDesk:

"Al compilar 1.mq5, dentro de la función B() no está claro qué función debe llamarse,

Importar A() o exportar A() - ya que el compilador no entiende que se refiere a la misma función"

Absolutamente, así es.


Son correctos en la forma - pero se podría (y debería) decir al compilador que es la misma función si quisiera, ya que repito el nombre del módulo está disponible en el momento de la compilación (especificado en #import).

Para estas pistas existe un operador de resolución de contexto "::", pero no es aplicable en este caso porque el nombre del módulo (archivo) también es el mismo.

El consejo es adecuado: cambiar la estructura del programa.

Más aún, si primero se pone :: y se compila en un lugar y luego se quita y se pone :: en otro - todo funciona, pero debes estar de acuerdo - es muy incómodo

Es mejor evitar tales trucos. No sólo es inconveniente, sino también "racialmente incorrecto", "poco limpio", "feo" y "en moco". Los intentos de engañar al compilador tienen derecho a existir sólo si no hay otras opciones para implementar lo que se quiere. En este caso, hay muchas.


y después de 10-15 permutaciones forzadas de este tipo cambié a #define

Las definiciones parametrizadas son útiles sólo cuando la detección de tipos no es deseable o cuando los parámetros se sustituyen por trozos de texto "verboso". Como sustituto de una función en línea, una definición es sin duda perjudicial para la salud de un programa.

--

En tu caso me negaría a usar las librerías .ex5, y todo funcionaría bien. El único uso práctico de ellas es en la implementación de la ocultación (al vender), y no veo su uso en otros casos.

¿Escribe para vender?

 
MetaDriver:

¿Escribe para vender?

Para mí.

No puedo hacerlo sin .ex5. También tengo funciones como F( string& [] ), de alguna manera no caben en el .dll :)

Tal vez se puedan empujar a través de un separador, pero aún no lo he probado

 
A100:
MQL5 simplemente no tiene funciones inline (en forma) y en su lugar uso macros paramétricas, lo cual no es del todo correcto, porque no hay control de tipo.

Además, el compilador no optimiza las expresiones, por lo que hay una penalización adicional de velocidad. Será mejor que lo compruebes.

Por cierto, sobre el inlining - funciona. Tuve algunos problemas con el depurador debido a ello.

 
TheXpert:

Por cierto, sobre el inlining... funciona. También hubo problemas con el depurador a causa de ello.

Así que funciona a nivel de compilador. Y me gustaría que funcionara a nivel de lenguaje. He dado un ejemplo más arriba - todo funciona a través de inexplicable "eludir el compilador", mientras que el trabajo directo requiere pasos adicionales, a veces significativos, porque como usted sugirió no incluir la descripción y la implementación de una misma función en un solo archivo es ciertamente posible, pero entonces 10 .mqh completos se descomponen en 100 .mqh más pequeños

Todavía no he perseguido la velocidad. Lo principal es la comodidad y que la cantidad de código no crezca exponencialmente.

Incluso me he enfrentado a la necesidad de usar análogos de #if #else en MQL5 (es un poco complicado hasta ahora, pero funciona aquí y allá)

 
A100:

Todavía no busco la velocidad. Lo principal es la comodidad y que el volumen de código no crezca exponencialmente.

Depende de ti. Pero dado el amor patológico de las metacotizaciones a las limitaciones, no hay ni mucho menos una probabilidad nula de que con esas macros pilles algún que otro chanchullo.
 

A100:

No funciona sin el .ex5. También tengo funciones como F( string& [] ), pero de alguna manera no caben en la .dll :)

....

Caramba... :)

No he sugerido usar DLL en lugar de librerías .ex5. Sólo montones y montones de .mqh y un ejecutable .mq5, nada más.

 
MetaDriver:

Sólo montones y montones de .mqh y un ejecutable .mq5, nada más.

Utilizo un código en 3 terminales diferentes, esto significa que al menos un .ex5 (compartido por todos) debe ser. Y si es así - entonces volvemos al problema descrito anteriormente - sólo hay 2 módulos - pero no compilan normalmente.
 
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, 0, true )
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, true )
No funciona en horas no comerciales. ¿Qué le impide poner el horario encima de todos los demás en horario no comercial?