Erros, bugs, perguntas - página 2761

 
Aleksey Mavrin:

0xFF é provavelmente transformado em 4 bytes pelo compilador.

não, mas inicializa-se correctamente

uchar uc[16];
ArrayInitialize(uc,(uchar)0xFF); // truncation of constant value        
ArrayPrint(uc);                  //     255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
 

Boa tarde, por favor aconselhar como resolver o problema:

Durante a optimização, surge um erro:

2020.05.31 15:05:32.738 Core 7 genetic pass (0, 53) testado com erro "critical runtime error 503 na função OnTick (zero divide, módulo Experts\e1.ex5, ficheiro e1.mq5, linha 826, col 73)" em 0:00:00.153

double Mix1 = NormalizeDouble((MathAbs(ZExtLevel[0] - ZExtLevel[1]), 2)

duplo Mix2 = NormalizeDouble((MathAbs(ZExtLevel[1] - ZExtLevel[2])), 2);

dupla Mix = NormalizeDouble((Mix1/Mix2),2);

O que eu fiz:

1) Eu multipliquei Mix1 e Mix2 para reduzir o número de casas decimais;

2) alteração da quantidade de dígitos na normalização;

3) Verifiquei todos os níveis ZExtLevels para ter a certeza de que não contêm 0.


 
Igor Makanu:

Não, mas inicializa-se correctamente

Porque tem a certeza de que não? O padrão no Integer é de apresentar. tamanhoof diz que sim.

 
Aleksey Mavrin:

Porque tem a certeza de que não? O padrão no Integer é de apresentar. sizeof diz que sim.

uint, para ser mais preciso.

 
Aleksey Mavrin:

Porque tem a certeza de que não? O padrão no Integer é de apresentar. tamanhoof diz que sim.


também funciona sem qualquer aviso?

char c[16];
ArrayInitialize(c, 127);

Porque existe uma assinatura correspondenteArrayInitialize

int  ArrayInitialize(
   char    array[],     // инициализируемый массив
   char    value        // значение, которое будет установлено
   );

e por alguma razão desconhecida não criaram o ArrayInitialize() para uchar não assinado

 
Igor Makanu:

também funciona sem qualquer aviso?

porque existe uma assinatura correspondente ArrayInitialize

e por um uchar não assinado não fizeram ArrayInitialize() por alguma razão desconhecida.

Não se trata da assinatura ou ausência da mesma. A questão é que 4 bytes são convertidos em 1 e a informação pode teoricamente ser perdida - é sobre isto que o compilador alerta.

ExperimenteArrayInitialize(c, (char)10000);

haverá também um aviso

 
Aleksey Mavrin:

Não se trata da assinatura ou da falta dela. A questão é que 4 bytes são convertidos em 1, a informação pode teoricamente ser perdida, que é o que o compilador adverte sobre.

ExperimenteArrayInitialize(c, (char)10000);

haverá também um aviso

Bem, foi claro desde o início

A questão está aqui de uma forma diferente - onde é que precisa realmente de char?

Eu uso uchar em StringToCharArray() e CryptEncode() e se você olhar através da ajuda você encontrará mais

é por isso que posso inicializar um char array usando ArrayInitialize, mas uchar não o posso fazer


ok, isso é um grande alarido, duvido que vá mudar ;)


PS: 0xFF = 255 (1 byte)

 
Igor Makanu:

sim, é claro que foi tudo desde o início

aqui a questão é diferente, é aqui que o char é realmente necessário?

Eu uso uchar em StringToCharArray () e CryptEncode (), e se você passar pela ajuda que ainda há

por isso posso inicializar um char array usando ArrayInitialize, mas uchar não pode


ok, o nobre holivar revelou-se, duvido que algo vá mudar;)


PS: 0xFF = 255 (1 byte)

ArrayInitialize (uc,(char) 0xFF ); // truncation of constant value        
 
Igor Makanu:

Sim, foi disso que se tratou desde o início.

Aqui vai outra pergunta. Onde é que precisa realmente de char?

Utilizo uchar em StringToCharArray() e CryptEncode().

é por isso que posso inicializar um char array usando ArrayInitialize, mas uchar não oposso fazer

ok, isso é um grande alarido, duvido que vá mudar ;)

PS: 0xFF = 255 (1 byte)

Não sei porque não se pode. uchar funciona da mesma forma que char.

Perguntou porque recebeu o aviso, porque 4 bytes em 1. 255 não é importante. 0 e 1 pode ser 1 e 2 e 4 e 8 bytes)

 

Alain Verleyen:

ArrayInitialize (uc,(char) 0xFF );

verificado:

uchar uc[16];
ArrayInitialize (uc, (char) 0xFF );
ArrayPrint(uc); 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255

OK, funciona sem qualquer aviso de compilação

Obrigado