template <typename T> void Swap( T &Value1, T &Value2 ) { const T Tmp = Value1;
Value1 = Value2; Value2 = Tmp; }
// Ordenar un array de cualquier tipo simple template <typename T> bool MyArraySort( T &Array[] ) { if (!ArraySort(Array)) { constint Size = ArraySize(Array);
for (int i = 0; i < Size - 1; i++) { const T Tmp = Array[i];
for (int j = i + 1; j < Size; j++) if (_R(Tmp) == Array[j]) // TypeToBytes.mqh { Swap(Array[i + 1], Array[j]);
Se ha añadido también la operación byte a byte con matrices.
// Trabajar con matricesshort Array[] = {1, 2, 3};
ArrayPrint(_R(Array).Bytes); // Imprimir representación byte a byte de la matriz Array
PRINT((_R(Array) == _R(Array).Bytes)) // Asegúrate de que la comparación byte a byte funciona.
_W(Color) = Array; // Escribir byte a byte Array array a Color
PRINT(Color) // Asegúrese de que Color es ahora C'1,0,2'.
ArrayPrint(_R(Color).Bytes); // Imprimir representación byte a byte de Coloruchar Array2[];
ArrayCopy(Array2, _R(Tick).Bytes); // Escribe la representación en bytes de Tick en Array2
PRINT((_R(Tick) == Array2)) // Asegúrate de que Tick y Array2 coinciden byte a byteMqlTick Tick2 = {0};
_W(Tick2) = Array2; // Escribir matriz Array2 a Tick2
PRINT((_R(Tick) == Tick2)) // Asegúrate de que Tick y Tick2 coinciden.int Array3[] = {INT_MIN, INT_MAX};
ArrayPrint(_R(Array3).Bytes); // Imprimir representación byte a byte de la matriz Array3
ArrayPrint(_R(Array).Bytes); // Imprimir representación byte a byte de la matriz Array
_ArrayCopy(Array3, Array); // Copiar Array array a Array3 array byte a byte
ArrayPrint(_R(Array3).Bytes); // Asegúrese de que la representación en bytes de la matriz Array3 coincide con la matriz
Añadida la operación byte a byte también con cadenas
// Trabajar con cadenasstring Str = "abcd";
_W(i) = Str; // Escribe la cadena en (int)i byte a byte
PRINT((_R(i) == Str)) // Comparación byte a byte de int y sring
ArrayPrint(_R(i).Bytes); // Bytes buscados i
ArrayPrint(_R(Str).Bytes); // Mirado Str bytes
PRINT(_R(Str)[(short)1]) // Tomó el valor corto por la mezcla 1 en Str
PRINT(Str)
_W(Str)[2] = "98765"; // Escritura byte a byte de una cadena a una cadena en el offset 2
PRINT(Str)
string StrArray[] = {"123", "45", "6789"};
_W(Str) = StrArray; // Escribir una matriz de cadenas en una cadena
PRINT(Str)
_W(Str)[3] = (uchar)0; // Se escribe un cero en el byte del offset 3, cortando así la cadena (longitud - 3 caracteres ANSI (4 bytes)).
PRINT(Str);
#include <TypeToBytes.mqh>
// Fusiona todas las cadenas del array en una sola cadenastring StringArrayConcatenate( conststring &StrArray[] )
{
string Str = "";
constint Size = ArraySize(StrArray);
for (int i = 0; i < Size; i++)
Str += StrArray[i];
return(Str);
}
voidOnStart()
{
string StrArray[] = {"abcd", "123", "zxc", "890", "qwert"};
string Str1, Str2;
// Fusiona todas las cadenas del array en una sola cadena
Str1 = StringArrayConcatenate(StrArray);
_W(Str2) = StrArray;Print(Str1);
Print(Str2);
}
Destacado: el mismo resultado de formas muy diferentes
// Establecer una estructura personalizadastruct STRUCT
{
int i;
// Establecer el operador de asignaciónvoidoperator =( const STRUCT& ) {}
};
// Demostración del resultado de eludir el operador de asignación personalizado de la estructura _R mediante la función de biblioteca
STRUCT Struct; // Creado un objeto con un operador de asignación personalizado
Struct.i = 1;
ArrayPrint(_R(Struct).Bytes); // Asegúrese de que el operador de asignación
PRINT(_R(Struct) == Struct) // no afecta a la funcionalidad _R de la biblioteca// Comprobación de la "corrección" del operador de asignación de tipos
PRINT(_WRONG_ASSIGN_OPERATOR(int)) // Correcto
PRINT(_WRONG_ASSIGN_OPERATOR(MqlTick)) // Correcto
PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) // No es correcto
Color = (color)((Color & 0xFFFFFF) + (Alpha << 24));
_W(Color)[3] = Alpha;
Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading
Cualquier pregunta de novato sobre MQL4, ayuda y discusión sobre algoritmos y códigos
fxsaber, 2017.03.07 13:55
template <typename T>
void Swap( T &Value1, T &Value2 )
{
const T Tmp = Value1;
Value1 = Value2;
Value2 = Tmp;
}
// Ordenar un array de cualquier tipo simple
template <typename T>
bool MyArraySort( T &Array[] )
{
if (!ArraySort(Array))
{
const int Size = ArraySize(Array);
for (int i = 0; i < Size - 1; i++)
{
const T Tmp = Array[i];
for (int j = i + 1; j < Size; j++)
if (_R(Tmp) == Array[j]) // TypeToBytes.mqh
{
Swap(Array[i + 1], Array[j]);
i++;
}
}
}
return(true);
}
Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading
Bibliotecas: mapeo de archivos sin DLL
fxsaber, 2017.04.03 16:07
¡Gracias al autor por la biblioteca!
Hice funciones para transferir cualquier dato. A continuación script muestra su trabajo en el ejemplo de ticks
Resultado
Un ejemplo de la posible aplicación práctica de las innovaciones.
Destacado: el mismo resultado de formas muy diferentes
Un ejemplo de cómo esta función puede ser útil para detectar posibles errores.
Escriba y ejecute el script.
Resultado.
_WRONG_ASSIGN_OPERATOR(STRUCT) = trueEsto indica que el operador de asignación no copiará una estructura en una estructura del mismo tipo.
Si añadimos más a la estructura,
el resultado será el mismo.
Parecería que corrigiendo este operador a
debería hacer que todo fuera correcto, pero la biblioteca dice lo contrario.
Quizás, este es el punto más sutil de este ejemplo.
Lo corregimos a
y obtenemos el resultado
_WRONG_ASSIGN_OPERATOR(STRUCT) = false¡Ahora el operador de copia está escrito correctamente!
Puedes comprobar la corrección de los operadores de asignación/copia de cualquier estructura simple de forma similar.
Resultado
Una cadena NULL tiene una longitud cero en bytes. Una cadena vacía tiene una longitud de 1 byte (donde cero es el final de la cadena).