Discussão do artigo "Aprendendo MQL5 do iniciante ao profissional (Parte II): Tipos de dados básicos e uso de variáveis" - página 2

 
Oleh Fedorov #:

Ahem... Tenho vergonha de perguntar, mas preciso....

  • Com que frequência essas construções ocorrem no código MQL5 real?
  • "Entrevista em junho"... Isso significa que você conheceu pessoalmente grandes empresas, uma das principais áreas de atividade é a MQL? (Pessoalmente, não tive nenhuma até o momento).
  • E esse código produzirá os mesmos resultados em todas as linguagens do tipo C?

Em resumo, por que um neófito precisa de um conhecimento tão profundo de literais?


P.S. Pessoalmente, embora não seja um neófito, fui reprovado em seu teste sem responder corretamente a uma única pergunta. Conheci algo semelhante em livros didáticos - em Java ou PHP - mas isso foi há muito tempo e não corresponde ao código prático que tive de ler ou escrever até agora... Não vou ser um juninho em seu escritório. E... o quê?

P.P.S. Acho que se você escrever um artigo sobre literais, ele poderá ser útil não apenas para mim. ;-) Especialmente se você compartilhar sua experiência, que não está na ajuda.... No entanto, os recursos não documentados geralmente me deixam muito constrangido, porque eles mudam com muita frequência nas novas versões, mas nunca se sabe.... Talvez ele seja realmente importante ou, pelo menos, útil?

Veja. A questão não é a frequência com que isso acontece, mas o fato de as pessoas não conhecerem e não quererem conhecer as sutilezas. E sobre trazer os tipos, você precisa saber disso porque é a base dos fundamentos. Você aprende muito com isso. A propósito, esse código não se refere à conversão de tipos, mas é para você pensar a respeito:

enum E{
   int a;
   float b;
}

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

Portanto, com base na ajuda, está tudo bem aqui. Só que, para mim, há uma nuance. De acordo com as alegações dos desenvolvedores, o mql foi escrito em C++, e em C++ não é possível fazer isso, é UB, mas em C tudo é legal. Já vi esse tipo de código em pluses com frequência e, sim, ele funcionou e funciona, mas, pessoalmente, tenho medo de escrever dessa forma, mas não sei se os desenvolvedores do mql têm medo. É por isso que nunca farei isso no mql, porque não conheço a implementação.

 
Vladimir Simakov #:


De acordo com as alegações dos desenvolvedores, o mql é escrito em C++, e em C++ não é possível fazer isso, é UB, mas em C tudo é legal.

Sinto muito, mas os desenvolvedores afirmam que a linguagem de programação MQL é a mais próxima possível do C++ e não escrita nele. ))

Saudações, Vladimir.

 
Vladimir Simakov #:
E sobre a conversão de tipos, você precisa conhecê-la, pois ela é a base do básico.

E não vou nem tentar discutir sobre isso. Concordo plenamente. É só que... Bem, nem todas as construções em C são igualmente úteis em MQL! :-)

Com relação ao código "to think about"... Como não estou familiarizado com C (ambos), esse código parece um jogo para mim. Na ajuda, o tipo de enum é referido a tipos inteiros, e eu nem sequer pensei que se tratava de uma estrutura. Seu significado é bem diferente... Mas obrigado, agora vou saber - embora não seja útil para mim pessoalmente, não vou usá-lo de forma alguma :-).

Portanto, com base na ajuda, tudo está normal aqui.

Posso obter um link?

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

Com relação ao código "to think about"... Como não estou familiarizado com C (ambos), esse código parece um jogo para mim. Na ajuda, o tipo enum é referido a tipos inteiros, e eu nem sequer pensei que fosse uma estrutura. Seu significado é bem diferente... Mas obrigado, agora eu sei - embora não seja útil para mim pessoalmente, não usarei tal coisa :-).

O jogo é o seguinte. Uma pessoa deve ter escrito do teto e misturado enum e union. Seu exemplo não compila. Enum não é uma estrutura, mas um número inteiro de 4 bytes. Se você usar a união, ela funcionará perfeitamente bem em C++ e MQL.

PS. Com relação ao primeiro exemplo da entrevista de Jun e à pergunta sobre a frequência com que isso acontece - é claro que não acontece de forma pura, porque o exemplo é refinado, mas com muita frequência inteiros assinados e não assinados são usados no código misturados, e é bem provável que ocorram problemas nesse caso.
 
Stanislav Korotky #:

Isso é um absurdo. A pessoa deve ter escrito do teto e misturado enum e union. Seu exemplo não compila. Enum não é uma estrutura, mas um número inteiro de 4 bytes. Se você usar a união, ela funcionará perfeitamente bem em C++ e MQL.

PS. Com relação ao primeiro exemplo da entrevista de Jun e à pergunta sobre a frequência com que isso acontece, é claro que não acontece em sua forma pura, porque o exemplo é refinado, mas com muita frequência inteiros assinados e não assinados são usados no código misturados, e é bem provável que haja problemas.

Naturalmente union)))))

Sobre o restante: 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. 

E sim, eu sei o que ele diz a seguir

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

Exceto que o msvs, de cuja ajuda ele foi retirado, não reivindica o segundo, embora ninguém tenha se deparado com ele ainda. O g++ e o clang não analisaram o que eles dizem sobre isso, mas não é muito diferente.

Se você quiser usá-lo dessa forma, use-o - é seu direito e sua dor, se algo acontecer))).

 
Vladimir Simakov #:

Naturalmente))))

Sobre o restante: https: //en.cppreference.com/w/cpp/language/union

O cppreference é um recurso útil, mas, devido à sua natureza de referência, não pode conter todas as nuances que só podem ser encontradas nas especificações da linguagem. Para generalizá-las, é mais fácil consultar o stackoverflow e, como resumo, para tipos primitivos, a "transferência" de valores bit a bit é garantida ao ler um campo, mesmo que ele não tenha sido gravado.

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 #:

Isso é um absurdo. A pessoa deve ter escrito do teto e misturado enum e union. Seu exemplo não compila. Enum não é uma estrutura, mas um número inteiro de 4 bytes. Se você usar a união, ela funcionará perfeitamente bem em C++ e MQL.

PS. Com relação ao primeiro exemplo da entrevista de Jun e à pergunta sobre a frequência com que isso acontece - é claro que isso não acontece em sua forma pura, porque o exemplo é refinado, mas muitas vezes inteiros assinados e não assinados são usados em códigos misturados, e é bem provável que ocorram problemas nesse caso.

Ufa, a imagem do mundo foi restaurada! :-) Estou terminando de falar sobre as uniões e outros tipos complexos (espero que, se não houver mais erros, esteja pronto na próxima semana).

P.S. O MetaEditor não destaca os literais com sufixos `u` e `ull`, mas os compila. Ao mesmo tempo, ele destaca `f`, mas informa um erro.... Gostaria de saber se isso é um bug ou uma dica? :-)

 

Se você é um iniciante e está confuso com nosso debate, deixe-me explicar que em C (e também em C++) é possível adicionar sufixos a literais numéricos que alteram o tipo de dados. Por exemplo, o sufixo `u` transforma um número inteiro comum(int) em um número inteiro sem sinal(uint).

Tente executar um script ligeiramente modificado sugerido por Vladimir Simakov (preste atenção à ausência de espaços entre números e letras, isso é 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);
  }

Esse script, nas primeiras linhas, exibe os nomes de tipo de alguns literais que são compilados na MQL5.

Talvez eu não tenha compilado todos os sufixos funcionais, espero que os especialistas em C me corrijam. Apenas tente entender a lógica com base no material do artigo, na saída do script e em nossa discussão e, se tudo não estiver claro, faça perguntas.

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