pregunta para los expertos en #define - página 2

 
Dios mío, los chicos no pueden vivir sin almohadillas.
 
Nikolai Karetnikov:

Gracias. )

Esencialmente.

Ahí es donde dejé la opción de la clase. Incluso cosas tan elementales como la parametrización #define se olvidan rápidamente sin el uso diario.

Sobre los nervios.

Dios, qué sensible es todo el mundo aquí; se puede hacer una pregunta sin implicación, sin intención de ofender o insultar, pero no, en algún lugar del alma de un genio no reconocido te sale un regaño y un deseo de hacerte valer a costa de otro aficionado. No lo encuentro en el foro de inglés, aunque escribo allí regularmente. Sabiendo esto, suelo intentar no reaccionar ante tales comentarios, pero si Dmitry, quieres retozar en una batalla verbal, te daré el placer de sumergirte de cabeza en tus propias emanaciones.

Corta la mosca, nena.

 
Vladimir Simakov:

¿Por qué no le mostró esta decisión al hombre de inmediato?)

UPD: bezgovna - deletreado sin sh..t ))))

Bueno, sólo estás disfrutando de la idea de que no lo sabía. Así que adelante, sigue golpeándote en un orgasmo de tu propia genialidad.

 
Dmitry Fedoseev:
Oh hombre, los chicos ya no pueden vivir sin almohadillas.

Sobre las juntas.

¿Qué tiene de bueno el singleton? Porque se puede almacenar el estado, procesar registros con lógica compleja, etc., mientras se mantiene todo conciso en el código principal. De este modo se crea una arquitectura de proyecto adecuada y el propio código resulta más legible.

PS. Por lo demás, sí, todo es para un aficionado. A mucha gente aquí en la comunidad le gusta el código espagueti con notación húngara, y el masoquismo con probar todas las órdenes y posiciones (todas en general) en cada tick es genial).

 

Hace mucho tiempo (muchos años) .... Ya hubo un hilo sobre los mejores troncos, si fue en un hilo aparte o en otro hilo no lo recuerdo.

Pero se hizo de una manera ligeramente diferente. Allí desvirtuaron el nombre de la función y añadieron allí todo tipo de líneas de macro de nombres de funciones y demás... y entonces podrías cambiar el manejador sobre la marcha

algo como "#defin PRINT prepare; Print"

y la propia impresión en el estilo de

void Print (cadena a; cadena a1="" ;cadena a2=""; ...... // 64 veces. Ojalá pudiéramos escribir simplemente ...a[]

{

Imprimir (Nuestra preparación, argumentos);

}

La definición podría haber sido manejada como una impresión ordinaria, y cambiando el manejador podemos escribir los datos en un archivo o mostrarlos. El número de argumentos puede ser cualquiera (hasta 64) // para los que aún no han aprendido.

Por cierto, esto esen parte lo que preguntaba el autor))

 
Dmitry Fedoseev:
Pero, desgraciadamente, no impresionarás a los tontos.

¿Te gustaría?

Lo siento, pero según recuerdo de los días en que todavía se usaba Assembler, la extensión de macros (macro ) es una herramienta que permite sustituir su definición por su código justo antes de la compilación.

Es que la programación en Assembler es un poco engorrosa y no hay subrutinas.

La programación en MQL es un poco más cómoda.

Pregunta: ¿Sería más cómodo escribir una subrutina, o sólo el Print("No sheet"); o algo para predefinir en el preprocesador?

 
Алексей Тарабанов:

(1) ¿Te gustaría?

Lo siento, pero según recuerdo de los días en que todavía se usaba Assembler, la extensión de macros (macro ) es una herramienta que permite sustituir su definición por su código justo antes de la compilación.

(2) Simplemente, es bastante engorroso programar en Assembler y no hay subrutinas en él.

La programación en MQL es un poco más cómoda.

(3) Pregunta: ¿Te sentirías más cómodo escribiendo un subprograma, o sólo el Print("No sheet"); o predefiniendo algo en el preprocesador?

1) La pregunta no es para mí.

2) Hay subrutinas en ensamblador.

3) Me siento más cómodo por no cagar en preguntas que no valen un huevo podrido.

 
Alexandr Andreev:

Hace mucho tiempo (muchos años) .... Ya hubo un hilo sobre los mejores troncos, si fue en un hilo aparte o en otro hilo no lo recuerdo.

Pero se hizo de una manera ligeramente diferente. Allí desvirtuaron el nombre de la función y añadieron allí todo tipo de líneas de macro de nombres de funciones y demás... y entonces podrías cambiar el manejador sobre la marcha

algo como "#defin PRINT prepare; Print"

y la propia impresión en el estilo de

void Print (cadena a; cadena a1="" ;cadena a2="";...... // es una pena que no se pueda escribir simplemente ...a[]

{

Imprimir (Nuestra preparación, argumentos);

}

La definición podría haber sido manejada como una impresión ordinaria, y cambiando el manejador podemos escribir los datos en un archivo o mostrarlos. El número de argumentos puede ser cualquiera (hasta 64) // para los que aún no han aprendido.

Por cierto, esto esexactamente lo que pedía el autor))

cadena aN="" y 63 veces - eso es una furia.

Déjeme explicarle:

  1. Una cadena es un objeto que envuelve a un wchar_t*.
  2. Haciendo que la cadena="" 63 veces, se hace lo siguiente: se asigna memoria para 63 objetos de cadena (en la pila en este caso), se llama al constructor paramétrico (63 veces), se asigna un buffer wchar_t* de algún tamaño en el heap (justo ahí), cuyos dos primeros bytes se inicializan con 0x0000 (sí, eso también ocurre 63 veces).

Si lo haces así, haz string=NULL, en este caso te ahorrarás grandes costes de asignación de memoria innecesaria en el heap.

UPD. No, me equivoco, si se hace bien, no habrá asignación de memoria en el heap.

 
Vladimir Simakov:

cadena aN="" y 63 veces es feroz.

Déjeme explicarle:

  1. string es un objeto que envuelve a wchar_t*.
  2. Haciendo que la cadena="" 63 veces, se hace lo siguiente: se asigna memoria para 63 objetos de cadena (en la pila en este caso), se llama al constructor paramétrico (63 veces), se asigna un buffer wchar_t* de algún tamaño en el heap (justo ahí), cuyos dos primeros bytes se inicializan con 0x0000 (sí, esto también ocurre 63 veces).

Si lo haces así, haz string=NULL, en este caso te ahorrarás grandes costes de asignación de memoria innecesaria en el heap.

UPD. No, me equivoco, si se hace bien, no habrá asignación de memoria en el heap.

Una vez más no entiendes de qué estamos hablando. Alexander escribe sobre la sustitución de Print() a través de define (para evitar rastrear todo el archivo y buscar todas las impresiones). El problema de esto es que Print puede tener varios parámetros, aunque nadie los distingue como parámetros - sólo una cadena conectada por comas. Por lo tanto, para proporcionar un reemplazo a la función estándar Print, se necesita una función que acepte 64 parámetros opcionales (para que coincida completamente con la función Print()). Y lo necesitas para añadir algunos datos antes del registro, tal vez una tira con una flecha (==>) para una mejor visibilidad, tal vez un número de línea, la fecha o la salida en un archivo. A nadie le puede importar en absoluto la velocidad de esto, porque se hace en casos especialmente complejos de errores de búsqueda, y luego se elimina.

 
string _info;
void _Print(string s,string s1="",string s2="",string s3="",string s4="",string s5="",string s6="",string s7="",string s8="")//.....
   {
   string ss;
   StringConcatenate(ss,s,s1,s2,s3,s4,s5,s6,s7,s8);//....
   //Comment(_info,ss);
   Print(_info,ss);
   }
#define Print _info=__FILE__+" line "+__LINE__ +" "+__FUNCSIG__+" Print: "; _Print

void OnStart()
  {
   
   Templ();
  }
  
void Templ()
   {
   Print("Error, a!=",5," and other....",3,4,5);
   Print("a=",5);
   Print("Hi");
   }


Todo el mundo parece entender.....

Así que esto es para aquellos que están empezando su camino....

Podemos envolver todo en una clase stat y devolver una referencia, que luego igualar el resto ya que este método tiene un menos cuando se trabaja con if (a!=5) Print(a); esto no funcionará, siempre se debe escribir if (a!=5) {Print(a);}, en las clases se puede corregir este momento, pero soy demasiado perezoso)) y en general, parece que todo está en los archivos de la historia

el camino con las clases, inicializar nuestros datos a través de método estático y combinar la llamada del operador nuestra impresión.... entoncessi (a!=5) Print(a); funcionará