Errores, fallos, preguntas - página 1016

 
A100:

Sí, gracias, me equivoqué al simplificar el código fuente - ahora he reescrito el error de forma diferente

He borrado el anterior para evitar confusiones.

Es terrible. Realmente lo es. Qué cosa tan terrible para vivir...

--

Escucha, ¿qué hay para ti? Si no es un secreto.

¿Escribes tu asesor en Lisp? Me quito el sombrero, pero te sugiero que te cambies a Haskell.

;-)

 
MetaDriver:

Escucha, ¿para qué lo necesitas? Si no es un secreto.

Bueno, MQL5 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
 
A100:
MQL5 no tiene funciones inline (en forma) y en su lugar uso macros paramétricas.

Sí, yo también los uso, pero no tan espeluznantes. ))))

Para su referencia, mql5 traduce todas las funciones pequeñas a sustitución inline. En otras palabras, podemos asumir que la palabra clave "inline" está en cada función definida por el usuario por defecto.

La decisión de sustituir una macro o compilar en una función la toma en última instancia el compilador (al igual que en C++, por cierto). Así que no tiene sentido tratar de acelerar las cosas de esa manera, todas las funciones simples se inline de todos modos.

// Y, por cierto, ¡con control de tipos! :)

 

MetaDriver:

Como referencia, mql5 traduce todas las funciones pequeñas en sustituciones inline. En otras palabras - puedes asumir que la palabra clave "inline" está en cada función de usuario por defecto.

No intento hacerlo más rápido, sino por comodidad. Pueden estar en línea en el fondo, pero no en la forma (!). Las dificultades surgen si se define inline en .mqh y luego se utiliza en varios .ex5. Ahora intentaré encontrar el enlace

https://www.mql5.com/ru/forum/1111/page1013#comment_520221

int B() { return ( A( 0 ) ); }

Allí B() en 1.mqh se supone que es inline - pero todo junto - no compila normalmente - sólo por separado. El ServiceDesk, aludiendo a la ambigüedad de la llamada, no profundizó en la esencia del problema y recomendó organizar el proyecto de otra manera. ¿Cómo se podría hacer de otra manera? Todo funciona sólo cuando quito la implementación de B() de .mqh a .ex5. ¿Y qué es el formulario en línea entonces?

Por cierto, en MQL4, ese ejemplo funciona - sin errores, aunque B() no es inline de hecho, sino en forma - inline.

 
A100:

Y no lo hice por rapidez, sino por comodidad. En esencia, pueden estar en línea, pero no en forma (!).

Y qué decir de la forma.

" ¿Quién es un Studebaker? ¿Es tu pariente Studebaker? ¿Tu padre es un Studebaker?"

Las dificultades surgen si se define inline en .mqh y luego se utiliza en varios .ex5.

No hay dificultades. Si no se cometen errores lógicos y se entiende bien cómo funciona un compilador.

Voy a tratar de encontrar el enlace ahora

https://www.mql5.com/ru/forum/1111/page1013#comment_520221

La función B() aquí es esencialmente inline

No he conseguido deshacerme de errores como "llamada ambigua a función sobrecargada con los mismos parámetros" - no ocurrían a menos que lo pusieras en un .ex5 separado

Ahí tienes una recursión esencialmente irreconocible a nivel de código fuente. El compilador te frunce el ceño de forma agradable, justo en los méritos. Estás intentando conectarte al inluder a libu, que define el mismo inluder en el que estás compilando. Entonces, ¿qué quieres? Si fueras un compilador, ¿qué harías?

Esto puede ser nuevo para ti, pero una función inline escrita en una DLL no puede ser utilizada de ninguna manera como una macro fuera de esta DLL. // En tiempo de ejecución el código fuente ya no existe

Supongo que la segunda noticia para ti: todas las librerías de mql(4, 5) están enlazadas dinámicamente. Esto es esencialmente DLL.

En resumen: en realidad estabas tratando de referirte de un lib a sí mismo, refiriéndote a sí mismo, refiriéndote a sí mismo...... etc.

De acuerdo, sería mucho peor si todo se compilara sin objeciones, y luego en tiempo de ejecución la lib tratara de cargarse recursivamente hasta quedarse sin memoria.... :))

?

Por eso existe la palabra clave inline en C/C++

Esa no es la razón en absoluto. Estoy seguro de que el ejemplo del enlace no compila en C++.

// Me da pereza comprobarlo, pero no tiene sentido. Si no entiendo cómo se construye un código fuente organizado recursivamente, el compilador tampoco lo entenderá.

 
A100:

Por cierto, ese ejemplo funciona en MQL4 - sin errores, aunque B() no está en línea, sino en forma - inline

Aunque... como no hay recarga de funciones, quizá el compilador ni siquiera intente insinuar una recarga incorrecta - simplemente ignora estúpidamente las definiciones repetidas.
 
MetaDriver:
No lo sé. Aunque... como no hay sobrecarga de funciones ahí, tal vez el compilador no trata de insinuar una sobrecarga errónea ahí - simplemente ignora estúpidamente las definiciones repetidas.

Se compila en MQL4 (!) y en C/C++ si se escribe inline antes de B()

No hay ninguna recursión allí, de hecho hay

int A( int ) y #define B() A( 0 )

Es muy simple allí - si usted no es demasiado perezoso - echar un vistazo en su cabeza fresca - sólo separar la declaración y la aplicación de las funciones :)

 
A100:

Allí B() en 1.mqh se supone que está en línea - pero todo junto no está compilando normalmente - sólo por separado. El ServiceDesk refiriéndose a la ambigüedad de la convocatoria no ha profundizado en el corazón del problema y ha recomendado organizar el proyecto de otra manera. ¿Y de qué otra manera?

Se acaba de responder a sí mismo:


Sólo funciona si se elimina la implementación de B() de .mqh en .ex5. ¿Qué es entonces el formulario en línea?

El problema no es en absoluto con inline B(), sino con su redefinición. Como la lib es una DLL, la información sobre los inluders incluidos en ella (sus nombres) ya se pierde durante la recompilación 1.mqh (la primera compilación fue en el momento en que se formó la lib), por lo que al compilar el inline, se encuentra la función B() redefinida, y como los parámetros son los mismos, el compilador considera que se trata de un intento erróneo (incorrecto) de recargar la función. Tiene todo el derecho, muy educadamente, podría haber jurado.
 
MetaDriver:
Acabas de responder a tu propia pregunta:
El problema no es la inineidad de B(), sino su redefinición.

Es que C/C++ entiende (usando la palabra clave inline) que esto no es una redefinición, y MQL5 no, aunque puede distinguir por el nombre del módulo compilado y uno especificado en #import. No sé cómo lo entiende el MQL4.

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

 
A100:
Exactamente, es que C/C++ entiende que esto no es una redefinición, y MQL5 no.

C/C++ son capaces de entender esto SÓLO cuando se compila una lib estática, porque la información del nombre de la fuente se almacena en el archivo de objetos (sólo para reconocer la recompilación).

Con las bibliotecas enlazadas dinámicamente esto no funcionará y si lo hace no es debido a la detección de reimplementación sino a las "reglas de prioridad" para la congruencia de nombres del código fuente actual y la DLL. Algunos lenguajes tienen estas reglas (Delphi en particular, probablemente algunos compiladores de C/C++ también las tienen).