Erreurs, bugs, questions - page 2761

 

Bonjour, veuillez m'indiquer comment résoudre ce problème :

Pendant l'optimisation, une erreur apparaît :

2020.05.31 15:05:32.738 Core 7 genetic pass (0, 53) testé avec l'erreur "critical runtime error 503 in OnTick function (zero divide, module Experts\e1.ex5, file e1.mq5, line 826, col 73)" in 0:00:00.153

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

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

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

Ce que j'ai fait :

1) J'ai multiplié Mix1 et Mix2 pour réduire le nombre de décimales ;

2) modification de la quantité de chiffres dans la normalisation ;

3) J'ai vérifié tous les ZExtLevels pour m'assurer qu'ils ne contiennent pas 0.


 
Igor Makanu:

Non, mais il s'initialise correctement

Pourquoi en êtes-vous sûr ? Le défaut dans Integer est de présenter. sizeof le dit.

 
Aleksey Mavrin:

Pourquoi en êtes-vous sûr ? Le défaut dans Integer est de présenter. sizeof dit qu'il le fait.

uint, pour être précis.

 
Aleksey Mavrin:

Pourquoi en êtes-vous sûr ? Le défaut dans Integer est de présenter. sizeof le dit.


fonctionne-t-il également sans aucun avertissement ?

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

Parce qu'il existe une signature correspondanteArrayInitialize

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

et pour une raison inconnue, ils n'ont pas créé ArrayInitialize() pour unsigned uchar

 
Igor Makanu:

fonctionne de la même manière sans aucun avertissement ?

parce qu'il existe une signature correspondante ArrayInitialize

et pour un uchar non signé, ils n'ont pas fait ArrayInitialize() pour une raison inconnue.

Il ne s'agit pas de la signature ou de l'absence de signature. Le fait est que 4 octets sont convertis en 1 et que des informations peuvent théoriquement être perdues - c'est ce contre quoi le compilateur met en garde.

EssayezArrayInitialize(c, (char)10000) ;

il y aura également un avertissement

 
Aleksey Mavrin:

Il ne s'agit pas de la signature ou de l'absence de signature. Le fait est que 4 octets sont convertis en 1, des informations peuvent théoriquement être perdues - c'est ce contre quoi le compilateur met en garde.

EssayezArrayInitialize(c, (char)10000) ;

il y aura également un avertissement

Eh bien, c'était clair dès le début

La question se pose ici de manière différente : où avez-vous vraiment besoin de l'omble ?

J'utilise uchar dans StringToCharArray() et CryptEncode() et si vous regardez dans l'aide, vous en trouverez d'autres.

c'est pourquoi je peux initialiser un tableau de chars en utilisant ArrayInitialize, mais pas de uchar


ok, c'est un grand brouhaha, je doute que ça change ;)


PS : 0xFF = 255 (1 octet)

 
Igor Makanu:

oui c'est clair que c'était tout depuis le début

ici la question est différente, c'est là que le charbon est vraiment nécessaire ?

J'utilise uchar dans StringToCharArray () et CryptEncode (), et si vous parcourez l'aide il y a toujours

C'est donc pour cela que je peux initialiser un tableau de chars en utilisant ArrayInitialize, mais pas de uchar.


ok, le noble holivar s'est avéré, je doute que quelque chose change ;)


PS : 0xFF = 255 (1 octet)

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

Oui, c'est ce dont il s'agit depuis le début.

Voici une autre question. Où avez-vous vraiment besoin de l'omble ?

J'utilise uchar dans StringToCharArray() et CryptEncode().

c'est pourquoi je peux initialiser un tableau de chars en utilisant ArrayInitialize, mais pas de uchar

ok, c'est un grand brouhaha, je doute que ça change ;)

PS : 0xFF = 255 (1 octet)

Je ne sais pas pourquoi vous ne pouvez pas. uchar fonctionne de la même manière que char.

Vous avez demandé pourquoi vous avez reçu l'avertissement, parce que 4 octets dans 1. 255 n'est pas important. 0 et 1 peuvent être 1 et 2 et 4 et 8 octets)

 

Alain Verleyen:

ArrayInitialize (uc,(char) 0xFF );

vérifié :

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, fonctionne sans aucun avertissement du compilateur

Merci.

 
Igor Makanu:

vérifié :

OK, fonctionne sans aucun avertissement du compilateur

Merci

Vous allez rire, mais même cela fonctionne sans aucun avertissement.

uchar c[16];
int ini2=0xFFFF;
ArrayInitialize(c, (uchar)ini2);