Erros, bugs, perguntas - página 2566

[Excluído]  
Slava:

Com esta fundição, não há perda de dados. Ou é 0 ou não é 0.

Outro caso é quando duplo -> qualquer tipo inteiro (até int32, inclusive)

Está a brincar com avisos um pouco demais na minha opinião, há uma falta de coerência no seu julgamento

bool continuation()const {return this.last_level;}  // uint last_level
// expression not boolean	lrp_last_9.mq5	260	42
 
Vict:

Exagerou um pouco com os avisos na minha opinião, há uma falta de consistência no julgamento

Acordado

Aqui tambémnão há perda de dados neste sentido(ou 0 ou não 0)

void OnStart()
{
        int i = -1;
        while ( ++i ); //Warning: expression not boolean
}

mas há um aviso. Era esperada uma abordagem uniforme

 

Resultado de uma tentativa de acesso a uma propriedade de uma instância de classe a partir de uma função estática da mesma classe:

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
O compilador estava em silêncio antes disto.
 

Não rubricar um fio vazio com um terminal nulo.

void OnStart()
{      
   string str;
   StringInit(str, 100, 0);
   
   Print(StringLen(str));     
}

Resultado

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  0

Esperado

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  100

Nota na ajuda para a função StringInit

Примечание

Если  character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

Na realidade, não há distribuição.
Isto é, a atribuição desta forma, dez espaços

string str = "          ";

não é o mesmo que.

string str;
StringInit(str, 10, 0);

O texto de ajuda marcado a vermelho não corresponde ao comportamento lógico.

 
Vict:

Está a exagerar com os avisos na minha opinião, não há consistência suficiente no julgamento

Os avisos não funcionam em operações booleanas, agora notei acidentalmente uma gralha no meu código, por isso reproduzi-o:

#define               getAsk(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define               getBid(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_BID)
//+------------------------------------------------------------------+
void OnStart()
  {
      double sl = 0.0,tp=0.0;
      if(sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print("");  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return(getAsk());
}

double OrderTakeProfit()
{
   return(getBid());
}
 
Roman:

Não rubricar um fio vazio com um terminal nulo.

Resultado

Esperado

Nota na ajuda para a função StringInit

Na realidade, não há distribuição.
Isto é, a atribuição desta forma, dez espaços

não é o mesmo que.

E não parece corresponder à lógica do comportamento, realçada a vermelho no texto de ajuda.

Falhou a função StringBufferLen - devolve o tamanho do amortecedor atribuído. StringLen devolve o comprimento da corda, ou seja, até ao carácter terminal, respectivamente, se estiver no início - comprimento 0. Buffer != corda.

 
Stanislav Korotky:

Esqueceu-se da função StringBufferLen - devolve o tamanho do buffer atribuído. StringLen devolve o comprimento da corda, ou seja, até ao carácter terminal, respectivamente, se estiver no início - comprimento 0. Buffer != corda.

Caso contrário, não se conhece a si próprio.

 
Stanislav Korotky:

Esqueceu-se da função StringBufferLen - devolve o tamanho do buffer atribuído.
StringLen devolve o comprimento da corda, ou seja, até ao carácter terminal, respectivamente, se estiver no início - comprimento 0. Buffer != corda.

Isto é claro, estamos a falar de inicializar uma corda com zeros terminais.
Porque não preencher o stringInit(str, 10, 0); com dez zeros terminais ? E devolver o comprimento real da corda.
Se quiser inicializar uma corda vazia, sem a preencher! por exemplo, com 100 caracteres,
depois 100 espaços como str = "muitos toques no teclado", ou inicializar o StringInit(str, 100, 65)
Não percebo porque é que preciso de me inicializar com o lixo, já há lixo que chegue ))


[Excluído]  
Roman:

É compreensível, estamos a falar de inicializar a corda com zeros terminais.
Porque não preencher StringInit(string, 10, 0); com dez zeros terminais ? E devolver o comprimento real da corda.
Se quiser inicializar uma corda vazia, sem a preencher! por exemplo, com 100 caracteres,
depois 100 espaços como str = "muitos toques no teclado", ou inicializar o StringInit(str, 100, 65)
Não percebo porque é que preciso de inicializar com lixo, já há lixo que chegue ))


O que o leva a pensar que não está preenchido? É que o comprimento na corda µl não é armazenado, é reconhecido pelo terminal zero.

StringInit(str, 100, ' ');

não?

E se precisar de zeros, há uma classe String algures no intestino do µl std.

 
Vict:

O que o leva a pensar que não está preenchido? É que o comprimento na corda µl não é armazenado, é reconhecido pelo terminal zero.

não?

E se precisar de zeros, há uma classe String algures no intestino do µl std.

Nah... Também devolve zero dessa forma. E o terceiro parâmetro ushort, requer um código de caracteres inteiro.

Se eu inicializar como str = " "; e depois passar dados da dll, tudo está bem.
Mas se o inicializar como StringInit(string, 10, 0) então os dados não chegarão. Isto porque o código não atribui memória para string com o tamanho necessário.

Se eu tivesse código para o espaço, provavelmente teria funcionado, mas que não encontrei tal código em tabelas diferentes.
Precisamos de atribuir memória para o número de futuros caracteres que depois irão para uma cadeia vazia já inicializada.
Mas lixo para inicializar o cordel, não kommelpho.
StringInit(string, 100, 0); deve ser preenchido com nulos terminais e devolver o comprimento 100.