Errores, fallos, preguntas - página 2576

 
Vict:

Tus ejemplos son graciosos, has quitado todo, has dejado a UB (modificación literal de la cadena), y todos tienen que telepatear. Si esperas recibir un consejo inteligente, da un código mínimo que funcione (en dos lados), de lo contrario es una basura.

El ejemplo muestra el lugar que causa el problema, es decir, el problema está en la copia del puntero wchar_t* a la cadena mql.
El resto del código no es relevante para el problema y no es útil, porque sólo comprueba si hay datos, luego lee, etc.
Por qué escribirlo en el ejemplo y contaminar la esencia del problema, cuando incluso con un código simplificado, mucha gente no entenderá cuál es el problema.
Entiéndase,getData() es una función de red que lee FrameOpcode, y devuelve los datos recibidos como un puntero a una cadena de tipo const wchar_t *.

Todo el mundo sabe que una simple funciónwcscpy(out, data) copia lacadena const wchar_t * enla cadenawchar_t *, y cuenta automáticamente la longitud de los caracteres hasta la terminal nula const wchar_t *.
Aquí nos encontramos con un error, mql string no acepta correctamente una cadenacopiadawchar_t *, ¿por qué? Si la función detecta automáticamente los nulos del terminal.
En el artículo de Renat, las cadenas se copian mediante memcpy con error de tamaño de bytes.
Tal vez el mismo enfoque se utiliza en el propio código de la terminal, para formar una cadena de tipo mql.
Como ves,
memcpy no sólo no es adecuado para copiar cadenas, sino que además, con el error de tamaño de bytes pasados, conduce a datos irregulares.
Existen otras funciones especiales de C para copiar cadenas, comowcscpy, wcsncpy, etc.
Y el propio Renat escribió en uno de los hilos que pronto se rehará por completo el trabajo con cadenas, al parecer el problema es conocido, pero por alguna razón el silencio en respuesta al problema que he indicado.

A continuación, una comparación del tamaño en bytes del punterowchar_t* y del tipowchar_t simple

Archivos adjuntos:
1.PNG  83 kb
 
Roman:

Por supuesto, es más fácil escribir todo un lío en respuesta que una prueba normal reproducible sustituyendo getData() por algo. Qué esperas si UB en UB y las conclusiones son erróneas:

memcpy(cp,to,wcslen(to)*sizeof(wchar_t));  //в этой строке должен быть указатель sizeof(wchar_t *)

todo está ahí. Algo falla en tus ideas sobre las cuerdas, de ahí el desparrame.

 
Vict:

Por supuesto, es más fácil escribir todo un lío en respuesta que una prueba normal reproducible sustituyendo getData() por algo. Qué esperas si UB en UB y las conclusiones son erróneas:

todo está ahí. Algo falla en tus nociones de cadenas, de ahí los errores.

No hay forma de proporcionar código reproducible, ya que tú mismo entiendes que es una dll que utiliza librerías de terceros.
Por eso pensé que había un error en el ejemplo.
memcpy(cp,to,wcslen(to)*sizeof(wchar_t));//esta cadena debe contenerel puntero sizeof(wchar_t *)

Si utilizamos la función sin el puntero,

memcpy(out, data, wcslen(data) * sizeof(wchar_t));

hará que el final de la cadena se llene de caracteres innecesarios. Mira el final de la cadena en la imagen.
Y es lógico que si copiamos una cadena wchar_t * como puntero, pasemos el tamaño del puntero y no el del tipo.

Y si usamos un puntero,

memcpy(out, data, wcslen(data) * sizeof(wchar_t*));

la cadena es clara y sin caracteres extra.
No importaría, pero en ambos casos tengo más problemas con el análisis sintáctico, es decir, obtengo errores u omisiones en las cadenas.

Y si uso esta función, entonces no se filtra nada, todo el análisis sintáctico es bueno, sólo un carácter extra al final de los saltos de línea, entonces aparece y luego desaparece.

wcsncpy(out, data, wcslen(data));

Así que estoy pasando por un montón de opciones, donde puede ser la causa, pero el uso de memcpy sin el puntero a la sizeof, el resultado se puede ver en la captura de pantalla.

Quiero comprobar la cadena wchar_t * recibida para el terminal null, si está allí o no.
¿Cómo se puede hacer esto?

Archivos adjuntos:
 
Uso de una función sin puntero,

deja fuera sin \0 al final.

Y si uso un puntero,

aquí estás fuera de los límites

Y si uso esta función, no se filtra nada, todo se analiza bien, sólo un carácter extra al final de la cadena, aparece y desaparece.

de nuevo sin \N que se le dé. Ver documentos

wcsncpy, wcsncpy_s

...

Si se alcanza el contador antes de que se copie toda la cadena src, la matriz de caracteres ancha resultante no está terminada en cero.

...

HH: tal vez no te metas con las cadenas en absoluto? guarda las matrices en wchar_t y ejecútalas, y dentro de µl convierte a cadena si es necesario https://www.mql5.com/ru/docs/convert/shortarraytostring

 
Vict:

ZS: tal vez no te metas con las cadenas en absoluto. Guarda las matrices en wchar_t y ejecútalas, y dentro de la µl convierte a cadena si es necesario

Oh, gracias )), por el consejo de que wcsncpy recorta el cero.
Sí los arrays se dejan para el final, si los punteros no funcionan, usaré arrays.

 

El motor del foro no permite hacer un post a partir de una sola imagen. Requiere la introducción de texto.

Tienes que poner un espacio.

 
fxsaber:

El motor del foro no permite hacer un post a partir de una sola imagen. Requiere la introducción de texto.

Tengo que poner un espacio.

Parece que tiene sentido: esto es un foro y lo principal es el texto. Una imagen adjunta a la cantidad a la vez. Esto no es un cementerio de imágenes.

 

He completado el código, funciona en MT4/5, pero tengo una pequeña sorpresa

Cómo puedo sustituirTesterStop() en MQL4

?

 
Igor Makanu:

¿Cómo puedo sustituir TesterStop() en MQL4?

ExpertRemove.

 
fxsaber:

ExpertRemove.

Conozco esta variante, pero he visto reportes de que ExpertRemove(0) no puede ser usado para Asesores Expertos en el Mercado.

En general, utilizo TesterStop() en dos casos:

- en lugar de INIT_PARAMETERS_INCORRECT para ocultar el registro del optimizador

- si no hay fondos suficientes para abrir una orden, no la abro, pero cierro la prueba para optimizarla más rápidamente

Razón de la queja: