Características da linguagem mql5, subtilezas e técnicas - página 161

 
printf("%s , %f , %i",(string)NULL,(double)NULL,(int)NULL);

2020.01.27 01:15:57.859 tst (EURUSD,H1) (null) , 0.000000 , 0

se eu remover a conversão do tipo, a expressão 'NULL' - do tipo 'void' é ilegal

interessante, acontece que o nput string pode ser inicializado vazio

 
fxsaber:

NULL é a inicialização. O exemplo mostra propositadamente uma cadeia sem entrada.

NULL / NIL (em outros termos) não pode ser uma inicialização de uma entidade de corda constante.

Pelo menos porque a corda mql não é um "ponteiro" como em C. Não tem estado especial "nada de especial".

PS (oh, eu não esperava isso de mim mesmo)

 
Maxim Kuznetsov:

Ela não tem nenhum estado especial de "nada".

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql5, dicas e truques

fxsaber, 2020.01.26 15:54

void OnStart()
{
  uchar Bytes[];

  Print(StringToCharArray(NULL, Bytes)); // 0
  Print(StringToCharArray("", Bytes));   // 1
}

Utilizo esta condição todos os dias.

 
Maxim Kuznetsov:

pelo menos porque uma corda mql não é um "ponteiro" como em C. Não tem estado especial "nada de especial".

PS (oh, eu não esperava isso de mim mesmo).

Infelizmente não, uma cadeia em MQL é uma entidade com memória atribuída.@Ilyas explicou porque é que StringBufferLen() pode não mostrar o comprimento da cadeia, mas mostra a memória utilizada para armazenar a cadeia.


fxsaber:

Utilizo esta condição todos os dias.

Não é nenhum indicador, em MQL4 eu desajustei apontadores para qualquer objecto usando StringConcatenate(), ou seja, o trabalho das funções incorporadas não é implementado pelas regras MQL ))))

input string s = NULL;
void OnStart()
{
   uchar Bytes[];
  Print(StringToCharArray(NULL, Bytes));  // 0
  Print(StringToCharArray("", Bytes));    // 1
  Print(StringToCharArray(s, Bytes));     // 1
}
 
Igor Makanu:

Em MQL4 I unset pointers to any object using StringConcatenate(), ou seja, as funções incorporadas não são implementadas pelas regras MQL )))

Não faz qualquer diferença o que está dentro.

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Peculiaridades de mql5, dicas e truques

Igor Makanu, 2020.01.26 22:27

input string s = NULL;
void OnStart()
{
   uchar Bytes[];

  Print(StringToCharArray(s, Bytes));     // 1
}
Porque não é NULL. Era disso que tratava a mensagem original.
 
fxsaber:

Não faz diferença como está dentro.

complementou o meu posto com o vosso exemplo


Também fiz mais algumas experiências com cordel de entrada s = NULL;

tanto quanto entendi, enquanto não estamos a tentar usar o valor da variável de entrada - será NULL, mas no momento em que tentarmos atribuir valor a outra variável ou simplesmente desajustá-la, NULL desaparecerá, ou seja, a memória será atribuída a esta variável de entrada

 
Igor Makanu:

tanto quanto sei, enquanto não estamos a tentar usar o valor de uma variável de input - este valor é NULL, mas nesse momento, se tentarmos atribuir o valor desta variável de input a outra variável ou simplesmente desajustar esta variável de input, então esta NULL desaparecerá, ou seja, a memória será atribuída a esta variável de input

O mecanismo da operação da variável de entrada foi descrito em pormenor acima.

 
fxsaber:

Não faz qualquer diferença o que está dentro.

Porque não é NULL. Era disso que tratava a mensagem original.

há (ainda) especificidade de desreferenciação de entidades (não há indicações em mql, não é C, que haja entidades)

a entrada é uma constante declarada no arranque. não se pode dar-lhe fisicamente o valor "NULL".

const string nothing=NULL; /// <--- ЭТО ЧТО ?

 
Nikolai Semko:

Sim, este comportamento é provavelmente apenas "infalível".
Aparentemente, porque a variável de entrada deve ser inicializada, a= NULL é artificialmente igualada a ="", quando a variável já ocupa pelo menos um byte na memória.

Na MQL5 as entradas:

São absolutamente idênticos. Não é atribuída nenhuma memória para a variável. De qualquer modo, não encontrei quaisquer diferenças.
Em java, por exemplo, tais registos são ligeiramente diferentes, apesar do facto de não ser atribuída memória para a variável em ambos os casos, também. A primeira variante (String string = null;) será considerada inicializada, embora não seja atribuída memória para a variável e a variável possa ser impressa como vazia. No segundo caso (String string;) quando se tenta imprimir a variável, será gerado um erro de variável não-inicializada.
Isto é, a MQL5 é mais tolerante a este respeito.
O que é melhor, eu nem sequer sei.

Como é que a memória não é atribuída a uma variável?
A memória é atribuída e a variável contém lixo arbitrário.
E o facto de a corda não produzir quaisquer valores, é lógico que o tampão esteja vazio.

char   ch; 
short  sh;
int    in;
double db;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(in));
Print(sizeof(db));
Print(sizeof(st));
Print("---------------------");
Print(ch);
Print(sh);
Print(in);
Print(db);
Print(st);
 
Roman:

Como é que a memória não é atribuída a uma variável?
A memória é atribuída, mas a variável não contém lixo arbitrário.
E o facto de a corda não produzir quaisquer valores, é lógico que a memória intermédia esteja vazia.

char ch; 
short sh;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(st));

   string str1;
   string str2="Однажды, в студёную зимнюю пору я из лесу вышел; был сильный мороз.";
   Print(sizeof(str1));  // 12
   Print(sizeof(str2));  // 12
   uchar ch1[],ch2[];
   Print(StringToCharArray(str1, ch1));  // 0
   Print(StringToCharArray(str2, ch2));  // 68