Comportamiento extraño
Comportamiento extraño

 

Publi

Resultados 1 al 8 de 8

Tema: Comportamiento extraño

  1. #1
    ¿Alguien ha encontrado lo siguiente?

    Tengo un script con las siguientes declaraciones

    símbolo de cadena = XXXXXX;
    cadena abierta = abrir; string stop = stop; cadena takeP = take;
    niveles dobles [3];
    int Datos [1];

    Luego llamo a una DLL declarada de la siguiente manera

    void GetParmQuery (símbolo de cadena, cadena abierta, cadena detener, cadena takeP,
    niveles dobles [], datos int []);

    Los valores devueltos por el DLL son los esperados, es decir, se han cambiado los valores predeterminados de símbolo, abrir, detener y tomarP. Sin embargo, si hago la siguiente prueba

    if (abrir! = abrir)
    Imprimir (NE);
    más
    Imprimir (EQ);

    la prueba falla y obtengo EQ impreso

    Alguna idea de lo que está sucediendo y se puede solucionar sin un trabajo complicado

    Gracias

  2.                         
    Publicidad
  3. #2
    OK Chicos, gracias por la ayuda, parece que los documentos de MQL no están del todo claros. Ahora me centraré en devolver nuevas cadenas de la DLL (como una llamada de función en Delphi) en lugar de cambiar las existentes. Y trataré de limitar el uso de cadenas en el futuro, como sugiere 7Bit.

  4. #3
    Como 7Bit indica que está manipulando memoria que usted (DLL) no ha asignado y no sabe cómo MQL se ocupa de asignar memoria a esa cadena o cómo almacena su tamaño dinámico (longitud) MQL String tstr; tstr = DLLreturnNullString (); Esto funciona porque a MQL se le da un puntero a una cadena Term (que su memoria DLL asigna para) MQL luego se ocupa de asignar su propia memoria y lista de asignación internalista de tamaño de cadena y copia los datos en esta nueva memoria MQL. Todo está bien porque permites que MQL construya su propia copia de la cadena. MQL String tstr; DLLchangethisString (tstr); Esto es peligroso por varias razones: A) no sabe cuánta memoria (si la hay) MQL ha asignado al puntero que recibe su DLL. B) Si cambias la cadena, MQL no lo sabrá y si cambias su longitud, entonces MQL no habrá actualizado su propio 'conocimiento' de la longitud de la cadena C) si tratas de cambiar o leer la cadena y sobre el paso de la memoria que MQL asignó para él, entonces tiene un error de protección D) En mi experiencia, mientras que MQL permitirá cadenas de hasta 64 KB de tamaño Estoy seguro de que la memoria no siempre se ubica como un bloque contiguo de memoria. Si persiste en esta ruta (y le aconsejo que no lo haga), la mejor manera es MQL int len; String tstr =;/rellenar hasta 255 caracteres en el tiempo de definición para que la memoria tenga asignada DLLchangethisString (len, tstr); Imprimir (StringSubstr (tstr, 0, len)); De esta manera, su DLL pasa la nueva longitud de la cadena para que al menos tenga conocimiento de su nueva longitud. He visto un encabezado C que detalla la estructura de la cadena MQL (pero nunca la he usado), lo que alude al hecho de que la longitud de la cadena se almacena en un INT (4 bytes) antes del inicio de la cadena. Así que en su DLL puede intentar disminuir el puntero de cadena proporcionado por MQL (por 4 bytes) y escribir un entero en esta ubicación de memoria para definir la nueva longitud SIN EMBARGO Nunca lo he probadono sé si soy correcto en esto y no aconsejaría hacerlo esto porque estás jugando con el conocimiento de MQL de lo que se hace con esta Cadena si cambias su longitud de 255 a 10, entonces MQL puede filtrar la memoria que tu DLL ha ignorado.

  5. #4

    Cita Iniciado por ;
    Entonces, ¿cuál es la forma convencional de pasar múltiples valores de cadena de un archivo DLL (uso Delphi7 por cierto) Acepto puedo hacer un trabajo mientras describes usando enteros pero entendí que las cadenas podrían pasarse como punteros a la memoria bloquear ver
    http://docs.mql4.com/basis/variables/extfunctionsGracias
    Hay algo escrito sobre punteros a bloques de memoria y algo que suena como cadenas de Pascal, realmente no tiene sentido (tal vez tiene más sentido en el original ruso) y no hablan de modificar la cadena para su uso posterior por el script mql4 en absoluto . Lo que puedo decir de mi propia experiencia es que las cadenas pasadas a la DLL serán simplemente punteros a cadenas sin terminación. En Pascal usarías un tipo de PChar para esto. Solo he tenido una instancia en la que sentí la necesidad de devolver una cadena de dll a la secuencia de comandos y fue entonces cuando escribí mi enlace de pitón. La función que devuelve el valor de un objeto de cadena python a la secuencia de comandos llamada mql4 tiene el siguiente aspecto: Función de código insertado PyGetString (item: PPyObject): # 91; color = Red # 93; PChar # 91;color # 93 ;; stdcall; var gs: TGILState; begin gs: = PyGILState_Ensure (); PyGetString: = PyString_AsString (elemento); PyGILState_Release (gs); fin; (Puede encontrar el código fuente completo (LazarusFPC) adjunto como archivo .rar al final de este sitio:
    http://sites.google.com/site/prof/me...on-integration) Lo anterior devolverá un puntero a la cadena (creada por la DLL de python), simplemente usando el valor de retorno de fuction. MT4 copiará inmediatamente la cadena del puntero devuelto en su propia memoria. Cuando recomendé la forma convencional, me refería a la forma convencional de resolver el problema, no a la forma convencional de devolver cadenas. La forma convencional de resolver el problema (cualquiera que sea) probablemente no incluiría el uso de cadenas devueltas al script. Por lo tanto aquí la pregunta otra vez: ¿qué estás tratando de hacer?

  6. #5

    Cita Iniciado por ;
    ¿Qué estás tratando de hacer que no se puede hacer de la manera convencional?
    Entonces, ¿cuál es la forma convencional de pasar múltiples valores de cadena de un archivo DLL (uso Delphi7 por cierto) Acepto puedo hacer un trabajo mientras describes usando enteros pero entendí que las cadenas podrían pasarse como punteros a la memoria bloquear ver
    http://docs.mql4.com/basis/variables/extfunctionsGracias

  7. #6

    Cita Iniciado por ;
    Si entiendo correctamente, estoy copiando los datos a la memoria asignada por el script
    No puede estar seguro de cómo metatrader maneja las cadenas internamente. Tal vez su DLL solo recibirá un puntero a una copia compatible con C (nulo) de la cadena que se descartará después de la llamada e internamente almacenará las cadenas de una manera completamente diferente. Tal vez sea Heap Manager administrará los objetos contados de referencia y creará clones para ciertas operaciones, quizás internamente sean cadenas Pascal y no cadenas C, o usarán una sofisticada biblioteca de cadenas que opera completamente con Unicode o algo así. ¿Quién sabe? ¡No está documentado en ningún lado! ¡Estás intentando manipular directamente las estructuras de datos no documentadas de metatrader a través de una interfaz no documentada! ¿Qué estás tratando de hacer que no se puede hacer de la manera convencional?
    Cita Iniciado por ;
    Un poco confuso, estoy de acuerdo, pero estoy usando la matriz Niveles para pasar los valores reales. Las cadenas son para otro fin en conjunto.
    ¿No puede ser todo codificado en valores enteros? Si estas cadenas representan un número finito de comandos o estados, simplemente codifícalos como enteros. Defina una constante para cada comando o modo o estado posible o lo que sea para una mejor legibilidad, tal como se hace en metatrader también: (OP_BUY, OP_SELL, MODE_FOO, MODE_BAR, etc.). Usar cadenas para cosas así se ve muy extraño. Hay una razón por la cual esto nunca se hace de esta manera, en ningún otro lado. (excepto PHP tal vez, porque los niños de PHP no saben qué es una constante)

  8. #7

    Cita Iniciado por ;
    ¿Por qué no nos dices qué contiene la variable abierta después de la llamada?
    Básicamente puede ser cualquier cosa, por ejemplo, una cadena de 4 caracteres abcd
    Cita Iniciado por ;
    ¿Estás seguro de que puedes pasar cadenas como punteros (como obviamente lo haces), cambiarlos en tu DLL y luego seguir trabajando en MT4 sin producir una infracción de acceso?
    Bueno, no tengo ningún AV. y todo funciona bien siempre que permita suficiente memoria para las variables en mi script (es decir, por eso configuro valores predeterminados primero) al menos en lo que se refiere a los valores devueltos. Es la función de comparación la que falla. Sin embargo, algo es obviamente incorrecto en mis suposiciones y me gustaría saber si puedo pasar cadenas de esta manera como lo hago con dobles y enteros (sin embargo, como matrices)
    Cita Iniciado por ;
    ¿Asigna nueva memoria para la nueva cadena en su DLL?
    Si entiendo correctamente, estoy copiando los datos a la memoria asignada por el script
    Cita Iniciado por ;
    ¿Por qué no usas una cadena para poder devolver el nuevo puntero? ¿Quién es responsable de liberar esta memoria recién asignada?
    El uso de cadenas proporciona un AV y, como entiendo, el script gestiona toda la memoria.
    Cita Iniciado por ;
    Y la pregunta más importante: ¿por qué demonios estás haciendo esto con cuerdas?
    Un poco confuso, estoy de acuerdo, pero estoy usando la matriz Niveles para pasar los valores reales. Las cadenas son para otro fin en conjunto.

  9. #8

    Cita Iniciado por ;
    if (abrir! = abrir) Imprimir (NE); else Imprimir (EQ); la prueba falla y obtengo EQ impreso
    ¿Por qué no nos dices qué contiene la variable abierta después de la llamada? ¿Estás seguro de que puedes pasar cadenas como punteros (como obviamente lo haces), cambiarlos en tu DLL y luego seguir trabajando en MT4 sin producir una infracción de acceso? ¿Asigna nueva memoria para la nueva cadena en su DLL? ¿Por qué no usas una cadena para poder devolver el nuevo puntero? ¿Quién es responsable de liberar esta memoria recién asignada? Y la pregunta más importante: ¿por qué demonios estás haciendo esto con cuerdas?

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  
Uso de cookies
Utilizamos cookies propias y de terceros para elaborar información estadística y mostrarle publicidad personalizada a través del análisis de su navegación. Si continúa navegando acepta su uso. Más información y política de cookies.
     

Aviso legal: Ni forosforex.com ni ninguna persona involucrada en forosforex.com aceptarán ninguna responsabilidad por cualquier pérdida o daño en el trading como resultado de la confianza en la información contenida en este sitio web, incluidos datos, cotizaciones, gráficos y señales de compra/venta. Por favor, infórmese plenamente de los riesgos y costes asociados a las operaciones en los mercados financieros, una de las formas de inversión que más riesgos entrañan.
forosforex.com le quiere recordar que los datos contenidos en este sitio web no son necesariamente en tiempo real ni exactos. forosforex.com no asume responsabilidad alguna por las pérdidas en que usted podría incurrir como resultado de la utilización de estos datos. Este acuerdo se rige por su versión en inglés, que prevalecerá siempre que haya alguna discrepancia entre la versión en inglés y la versión en español. Los CFD son un producto difícil de entender, varios organismos reguladores consideran que no es adecuado para inversores minoristas debido a su complejidad y riesgo.
Advertencia de riesgo: Los CFDs son un producto difícil de entender, y puede no ser adecuado para inversores minoristas debido a su complejidad y riesgo. Existe la posibilidad de sufrir una pérdida igual o superior a la inversión. Por lo tanto, no debe invertir o arriesgar dinero que no pueda permitirse perder. Debe asegurarse de que comprende todos los riesgos. Antes de abrir una cuenta en un broker por favor sea consciente e infórmese de los riesgos asociados con el trading. El contenido de este sitio web no debe interpretarse como asesoramiento personal. ForosForex recomienda que busque el consejo de un asesor financiero independiente.