Discusión sobre el artículo "Aprendiendo MQL5 de principiante a profesional (Parte II): Tipos de datos básicos y uso de variables" - página 2

 
Oleh Fedorov #:

Ejem... Me da vergüenza preguntar, pero tengo que ....

  • ¿Con qué frecuencia se producen estas construcciones en el código MQL5 real?
  • "Entrevista de junio"... ¿Significa que usted personalmente ha conocido a grandes empresas, una de cuyas principales áreas de actividad es MQL? (Personalmente, no he tenido hasta la fecha).
  • ¿Y este código producirá los mismos resultados en todos los lenguajes tipo c?

En resumen, ¿por qué un neófito necesita un conocimiento tan profundo de los literales?


P.D. Yo personalmente, aunque no soy un neófito, suspendí tu prueba sin responder correctamente a una sola pregunta. Conocí algo parecido en los libros de texto - ya sea de Java o de PHP - pero fue hace tanto tiempo, y no se corresponde con el código práctico que he tenido que leer o escribir hasta ahora... No voy a ser un june en tu oficina. Y... ¿qué?

P.P.D. Creo que si escribes un artículo sobre literales, podría ser útil no sólo para mí. ;-) Sobre todo si compartes tu experiencia, que no está en la ayuda.... Sin embargo, las características no documentadas me suelen dar mucha vergüenza, porque cambian demasiado a menudo en las nuevas versiones, pero, nunca se sabe.... ¿Quizás sea realmente importante o al menos útil?

Verás. La cuestión no es la frecuencia, sino que la gente no sepa y no quiera saber las sutilezas. Y sobre meter tipos, hay que saberlo porque es la base de lo básico. Consigues mucho dolor a través de ello. Por cierto, este código no es sobre la conversión de tipos, pero para que pienses:

enum E{
   int a;
   float b;
}

double F(E& e, int a){
   e.a = a;
   return e.b;
}

Por lo tanto, basado en la ayuda, todo está bien aquí. Sólo que, para mí personalmente, hay un matiz. Según afirman los desarrolladores, mql está escrito en C++, y en C++ no se puede hacer eso, es UB, pero en C todo es legal. He visto ese código en pluses a menudo, y sí que funcionaba y funciona, pero personalmente me da cierto miedo escribir así, pero si los desarrolladores de mql tienen miedo, no lo sé. Por eso nunca haré esto en mql, porque no conozco la implementación.

 
Vladimir Simakov #:


Según afirman los desarrolladores, mql está escrito en C++, y en C++ no se puede hacer eso, es UB, pero en C todo es legal.

Lo siento, pero los desarrolladores afirman que el lenguaje de programación MQL es lo más parecido posible a C++ y no está escrito en él. ))

Saludos, Vladimir.

 
Vladimir Simakov #:
Y sobre la conversión de tipos, es necesario conocerla, ya que es la base de los fundamentos.

Y ni siquiera voy a tratar de discutir sobre ello. Estoy totalmente de acuerdo. Es que... Bueno, ¡no todas las construcciones de C son igual de útiles en MQL! :-)

Respecto al código "para pensar".... Como no estoy familiarizado con C (ambos), este código me parece un juego. En la ayuda, el tipo enum se refiere a tipos enteros, y ni siquiera pensé que se trata de una estructura en absoluto. Su significado es bastante diferente... Pero gracias, ahora lo sabré - aunque personalmente no me sirve para nada, no lo usaré :-).

Entonces, según la ayuda, aquí todo es normal.

¿Puedo tener un enlace?

Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
  • www.mql5.com
Данные перечислимого типа enum относятся к некоторому ограниченному множеству данных. Определение перечислимого типа: Список значений представляет...
 
Oleh Fedorov #:

En cuanto al código "para pensar"... Como no estoy familiarizado con C (ambos), este código me parece un juego. En la ayuda, el tipo enum está referido a tipos enteros, y ni siquiera pensé que fuera una estructura en absoluto. Su significado es bastante diferente... Pero gracias, ahora lo sabré - aunque personalmente no me sirva de nada, no usaré tal cosa :-).

Este es el juego. Una persona debió escribir desde el techo y confundió enum y union. Su ejemplo no compila. Enum no es una estructura sino un entero de 4 bytes. Si se toma union, funciona perfectamente en C++ y MQL.

PD. En cuanto al primer ejemplo de la entrevista de Jun y la pregunta sobre la frecuencia con que sucede - por supuesto que no sucede en forma pura, porque el ejemplo es refinado, pero muy a menudo enteros con signo y sin signo se utilizan en el código mezclados, y los problemas son bastante probables aquí.
 
Stanislav Korotky #:

Esto no tiene sentido. La persona debe haber escrito desde el techo y mezclado enum y union. Su ejemplo no se puede compilar. Enum no es una estructura sino un entero de 4 bytes. Si se toma union, funciona perfectamente en C++ y MQL.

PD. En cuanto al primer ejemplo de la entrevista de Jun y la pregunta sobre la frecuencia con que sucede - por supuesto que no sucede en su forma pura, porque el ejemplo es refinado, pero muy a menudo enteros con y sin signo se utilizan en el código mezclados, y aquí los problemas son bastante probable.

Naturalmente unión)))))

Sobre el resto: https: //en.cppreference.com/w/cpp/language/union

It is undefined behavior to read from the member of the union that wasn't most recently written. 

Y sí, ya sé lo que dice a continuación

Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union.

Salvo que msvs, de cuya ayuda está sacado, no afirma lo segundo, aunque nadie se lo ha encontrado todavía. g++ y clang no he mirado lo que dicen al respecto, pero apenas hay diferencias.

Si quieres usarlo así, úsalo - es tu derecho y tu dolor, si pasa algo)).

 
Vladimir Simakov #:

Naturalmente))))

Sobre el resto: https: //en.cppreference.com/w/cpp/language/union

cppreference es un recurso útil, pero debido a su naturaleza de referencia no puede contener todos los matices que sólo pueden encontrarse en las especificaciones del lenguaje. Para generalizarlos, es más fácil mirar en stackoverflow, y como resumen - para tipos primitivos, se garantiza la "transferencia" bit a bit de valores al leer un campo, incluso si no se ha escrito en él.

Accessing inactive union member and undefined behavior?
Accessing inactive union member and undefined behavior?
  • 2012.07.07
  • Luchian Grigore Luchian Grigore 257k 66 66 gold badges 461 461 silver badges 626 626 bronze badges
  • stackoverflow.com
I was under the impression that accessing a member other than the last one set is UB, but I can't seem to find a solid reference (other than answers claiming it's UB but without any support from the standard). So, is it undefined behavior?
 
Stanislav Korotky #:

Esto no tiene sentido. La persona debe haber escrito desde el techo y mezclado enum y union. Su ejemplo no se puede compilar. Enum no es una estructura sino un entero de 4 bytes. Si se toma union, funciona perfectamente en C++ y MQL.

PD. En cuanto al primer ejemplo de la entrevista de Jun y la pregunta sobre la frecuencia con que sucede - por supuesto que no sucede en su forma pura, porque el ejemplo es refinado, pero muy a menudo enteros con y sin signo se utilizan en el código mezclados, y los problemas son bastante probable aquí.

Uf, ¡se ha recuperado la imagen del mundo! :-) Estoy terminando sobre uniones y otros tipos complejos (con suerte, si no hay más meteduras de pata, debería salir la semana que viene).

P.D. El MetaEditor no resalta los literales con sufijos `u` y `ull`, sino que los compila. Al mismo tiempo, resalta `f` pero informa de un error.... Me pregunto si esto es un error o una pista. :-)

 

Si eres principiante y estás confundido por nuestro debate, déjame explicarte que en C (y también en C++) puedes añadir sufijos a los literales numéricos que cambian el tipo de datos. Por ejemplo, el sufijo `u` convierte un entero ordinario(int) en un entero sin signo(uint).

Intente ejecutar un script ligeramente modificado sugerido por Vladimir Simakov (preste atención a la ausencia de espacios entre números y letras, es importante):

void OnStart()
  {
//---
    
   Print(typename(1));
   Print(typename(-1));
   Print(typename(1 ll));
   
   Print(typename(1 u));
   Print(typename(1 ull));
   
   Print(typename(-1*1 ull));
   
   Print(typename(NULL));
   
   
   Print(-1<1 u); 
   Print(-1*1 ull);
  }

Este script en las primeras líneas muestra los nombres de los tipos de algunos literales que se compilan en MQL5.

Puede que no haya compilado todos los sufijos que funcionan, espero que los especialistas en C me corrijan. Solo trata de entender la logica - basado en el material del articulo, la salida del script y nuestra discusion, y si todo no esta claro - haz preguntas.

Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
  • 2024.06.11
  • Vladimir Simakov
  • www.mql5.com
Опубликована статья Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных : Автор: Oleh Fedorov...