Errores, fallos, preguntas - página 2579

 
Roman:

¿Cómo es una cadena vacía? Cuando la cadena viene de un enchufe, en otras variantes aunque está torcida, pero no está vacía.
No digo que tu variante sea incorrecta, pero en tu variante utilizas un array de cadenas.
En mi caso es un puntero.

La función socket devuelve un puntero a const wchar_t *
. Por eso achaco el fallo a mql, porque he probado muchas funciones C y el resultado es +1 o +2.
Simplemente no funcionará.

Escribe las líneas después de memcpy() en paralelo al archivo, si mql es culpable (hay alguna envoltura encima de las llamadas con argumentos de copia), entonces el archivo no estará vacío, probablemente.

HH: bueno, por si acaso - la función de la biblioteca en µl se declara con un enlace, ¿verdad? void fn(cadena & s)?
 
Vict:

Escribe las líneas después de memcpy() en paralelo al archivo, si µl tiene la culpa (hay alguna envoltura encima de las llamadas con argumentos de copia), el archivo no estará vacío, supongo.

HH: bueno, por si acaso - en µl función de la biblioteca se declara con referencia ? void fn(cadena & s)?

Todas las cadenas las muestro en el gráfico en el comentario, o en el terminal de impresión, cuando la cadena llega es inmediatamente visible, en el comentario se puede ver si está torcida o no.
Cuando hay grandes lapsos de tiempo, la cadena rara vez aparece en el gráfico, y hay agujeros en la impresión.
La duda de que no entre ninguna cadena desde el socket se ha disipado, los datos de los ticks llegan a un ritmo de milisegundos.
Desde el socket getData() llevó a una variable puntero, desde la variable puntero copio directamente a mql, sin wrappers.
Sí declarado por el feng shui ))

#import "ExampleDll.dll"
   void Func(string task, string & out);
#import
En general, hay un problema con la cadena mql. Probado y comprobado muchas variantes.
La cadena de la toma de corriente viene con el terminal nulo, y la función de comprobación más fiable
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data));  //wcslen(data)+1
muestra el problema en mql.

En general, usaré sizeof(wichar_t*) por ahora y veré el comportamiento.
Pero probablemente para estar a salvo de los cambios de MQ, realmente escribiré cadenas en arrays.
 
Pero supongo que para estar a salvo de los cambios de MQ, probablemente escribiré las cadenas en arrays.

Palabras de oro. Por supuesto, me gustaría usar string, pero como no hay un estándar que describa su implementación y/o comportamiento de transferencia en dll, es puro ub. Y así, string en short[] y puedes pasar con seguridad el array; lo único es la sobrecarga de crear y copiar un array.

PS. Aun así, creo que el problema no está en mql, sino en tu código. Todas las pruebas pasaron normalmente, y no hay nada lógicamente incorrecto con string, string es una envoltura trivial sobre wchar_t *, o más bien sobre wstring, que podría arruinarlo.

 
Vladimir Simakov:

Buenas palabras. Por supuesto, nos gustaría usar string, pero como no hay ningún estándar que describa su implementación y/o comportamiento de transferencia en dll, es puro ub. Y así, string en short[] y puedes pasar con seguridad el array; lo único es la sobrecarga de crear y copiar un array.

PS. Aun así, creo que el problema no está en mql, sino en tu código. Todas las pruebas pasaron normalmente, y no hay nada lógicamente incorrecto con string, string es una envoltura trivial sobre wchar_t *, o más bien sobre wstring, que podría arruinarlo.

Yo también tenía mis dudas sobre la lib, no descarto nada como posible motivo.
Pero he convertido la cadena recibida del socket a códigos ASCII, puedes ver que la cadena es correcta.
A continuación, una copia simple,
mql no acepta correctamente el puntero de cadena.

Archivos adjuntos:
1.PNG  32 kb
 
Roman:

Todas las líneas que muestro ya sea en el gráfico en el comentario, o en el terminal de impresión, cuando la línea viene es inmediatamente visible en el comentario muestra que está torcido o no.
Cuando hay grandes desfases temporales, la línea rara vez aparece en el gráfico, mientras que hay agujeros en la impresión.
La duda de que la cadena del socket no está entrando, los datos de la garrapata están entrando a velocidad de milisegundo.
Desde el socket getData() llevado a la variable puntero, desde la variable puntero copio inmediatamente a mql, sin envoltorios.
Sí declarado por el feng shui ))

De todos modos, cualquier problema con la cadena mql. Probado y comprobado muchas variantes.
La cadena de la toma de corriente viene con el terminal nulo, y la función de comprobación más fiable
muestra el problema en mql.

En general, usaré sizeof(wichar_t*) por ahora y veré el comportamiento.
Pero probablemente para estar a salvo de los cambios de MQ, realmente escribiré cadenas en arrays.

Escribir en el archivo - Me refería en el lado de la dll, si el archivo se escribe, pero no entra en el μl, ya es un argumento de peso con una reclamación de error, tal vez corregido.

Y hay una envoltura sin su deseo, MQ ocultar el código / direcciones del mundo exterior, todo no va directamente.

 
Vict:

Escribir en el archivo - Me refería en el lado de la dll, si se escribe en el archivo, pero no llega a mql, entonces ya es un fuerte argumento con la reclamación de errores, tal vez corregido.

Y hay una envoltura sin su deseo, MQs ocultar el código / direcciones del mundo exterior, todo no va directamente.

Escribe las cadenas recibidas en un archivo.
Dado que la función socket devuelve un puntero a una cadena, se escribe un puntero a la cadena en el archivo, y luego este puntero se copia en mql.
Utilizando la función

wcscpy(out,  data);

La longitud de la cadena resultante es de 164, la mql está asignada a 200.

StringInit(out, 200, 32);

La cadena copiada recibida en mql tiene la misma longitud, sin embargo hay algunos huecos en la copia.
En el script mql, el bucle while se repite con Sleep(1)

Archivos adjuntos:
458.PNG  71 kb
 
Y si se utiliza la función
wcsncpy(out, data, wcslen(data));
Entonces no hay huecos, pero las líneas copiadas no son rectas, hay caracteres extra al final de la línea.
Añadirwcslen(data)+1 noayuda.

En resumen, de todas las páginas que estoy escribiendo aquí.
mql string no acepta correctamente de dll, copiado puntero a cadena const wchar_t*
Archivos adjuntos:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
 
Roman:

Correcto, asigno un buffer para la cadena de salida, y lo inicializo con espacios.
Luego paso esta cadena(puntero) a la dll.

En dll wchar_t* los datos se copian en out, es decir, también es un puntero. Lógicamente no debería haber problemas.
Según entiendo en la ayuda, la función StringInit debería establecer la longitud de la cadena.
Pero todavía tengo algunos problemas conla función StringInit en sí; especifiqué la longitud de la cadena y se me hizo raro cuando señalé el tamaño del puntero.
No entiendo a qué transferencia de longitud de cuerda manual te refieres.

Y si usas sizeof(wchar_t) sin un puntero, la cadena empieza a flotar con caracteres extra, lo que causa problemas de parseo y fuga.
Para pasar cadenas a la dll he utilizado el ejemplo de Renat, de su artículo sobre cómo escribir una dll.
Pero por alguna razón, si lo paso sin el puntero sizeof(wchar_t), la cadena flota, mientras que con el puntero sizeof(wchar_t*) no hay problema.
Me parece lógico, copio la cadena como un puntero, por lo que necesito pasar el tamaño del puntero, no el tipo.

A veces, si lo haces bien, no funciona.

Hacerlo mal - parece que funciona.

En estos casos, hay que hacerlo bien y buscar un error en otra parte.

 
Roman:

Escribe la cadena resultante en un archivo.
Dado que la función socket devuelve un puntero a una cadena, se escribe un puntero a la cadena en el archivo y luego este puntero se copia en mql.
Utilizando la función

La longitud de la cadena resultante es de 164, la mql está asignada a 200.

La cadena copiada recibida en mql tiene la misma longitud, sin embargo hay algunos huecos en la copia.
En el script mql, el bucle while se repite con Sleep(1)

1. En MQL se copia una cadena, no un puntero.

2. Ha seleccionado una cadena de 200 caracteres en MQL. Entonces copió 164 caracteres en él. Después, mira el tamaño de la línea en MQL. Se quedó en 200.

 
Koldun Zloy:

A veces, si lo haces bien, no funciona.

Hacerlo mal - parece que funciona.

En estos casos, hay que hacer lo correcto y buscar el error en otra parte.

Así que para hacerlo bien, renuncié a memcpy, y usé wcscpy o wcsncpy.
Resultado, post anterior.