Calcul d'un seul tableau pendant l'optimisation - page 6

 
Alexey Viktorov:

Voici un exemple d'écriture et de lecture d'un tableau

Exécutez-le deux fois en mode débogage et voyez combien de temps il faut pour écrire et lire le tableau. La première exécution écrira le tableau dans le fichier, et la seconde le lira et commencera à imprimer les dates du tableau. Ensuite, déterminez la partie mise en évidence, si IS_DEBUG_MODE doit être supprimé, et si IsOptimization() doit être inséré dans la condition.

Merci !
 
Dmitry Fedoseev:

Il existe une fonction, quelque chose comme FileWriteInteger(). Identifier par emplacement, la variable doit être au début du fichier, après l'avoir lue le pointeur se déplacera à son extrémité, c'est-à-dire au début du tableau, après avoir lu le tableau le pointeur sera avant la variable suivante...

Un article sur le travail avec les fichiers sera publié prochainement.

Je voulais vous écrire qu'il n'y a pas d'article sur les opérations de classement. Vous les rendez instructifs et lucides. Je ne manquerai pas de les lire lorsqu'ils paraîtront.

 

J'ai essayé de déclarer un tableau au niveau global (code mql4)

datetime T[];

remplissez-le dans l'inite

ArrayResize(T,40);
datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };

Lorsqu'il n'est pas défini au départ, il imprime la date de 1971, c'est-à-dire que le tableau est vide.

for (int x=0;x<=39;x++)
   {
   Print("T[x]=",T[x],"x=",x);   
   }

Si je remplis le tableau au début, les valeurs apparaissent. Peut-être que la raison est que le tableau est réinitialisé à chaque fois, mais sans lui le code ne compile pas ?

Le tableau disparaît. Qu'est-ce que je fais de mal ?

 
forexman77:

J'ai essayé de déclarer un tableau au niveau global (code mql4)

remplissez-le dans l'inite

Lorsqu'il n'est pas défini au départ, il imprime la date de 1971, c'est-à-dire que le tableau est vide.

Si je remplis le tableau au début, les valeurs apparaissent. Peut-être que la raison est que le tableau est réinitialisé à chaque fois, mais sans lui le code ne compile pas ?

Le tableau disparaît. Qu'est-ce que je fais de mal ?

Regardez ce que dit le compilateur.

ArrayResize(T,40);
datetime T[40]=

Avec un geste aussi simple, vous avez défini un tableau local T qui disparaîtra à la sortie de OnInit...

 
Maxim Kuznetsov:

vérifiez l'avertissement que le compilateur génère.

Avec un déplacement aussi facile, vous avez défini un tableau local T qui sera perdu lorsque vous quitterez OnInit...

Il indique qu'il existe déjà une déclaration globale)

la déclaration de 'T' cache la déclaration globale à la ligne 40

Mais, comment le faire correctement. Je n'avais jamais déclaré un tableau en utilisant des accolades auparavant. Je l'ai initialisé avec zéro et défini sa taille, puis je l'ai rempli avec la boucle. Y a-t-il un autre moyen de le faire ?

Si j'efface la date dans l'inite, le code ne compile pas, mais écrit deux erreurs :

'{' - expression attendue

'=' - utilisation d'une opération illégale



 
forexman77:

Il indique qu'il existe déjà une déclaration globale)

la déclaration de 'T' cache la déclaration globale à la ligne 40

Mais, comment le faire correctement. Je n'avais jamais déclaré un tableau en utilisant des accolades auparavant. Je l'ai initialisé avec zéro et défini sa taille, puis je l'ai rempli avec la boucle. Y a-t-il un autre moyen de le faire ?

Si j'efface la date dans l'inite, le code ne compile pas, mais écrit deux erreurs :

'{' - expression attendue

'=' - utilisation d'une opération illégale



La déclaration du tableau et l'initialisation des constantes pourraient (et devraient) être effectuées au niveau global.

datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77:

Il indique qu'il existe déjà une déclaration globale)

la déclaration de 'T' cache la déclaration globale à la ligne 40

Mais, comment le faire correctement. Je n'avais jamais déclaré un tableau en utilisant des accolades auparavant. Je l'ai initialisé avec zéro et défini sa taille, puis je l'ai rempli avec la boucle. Y a-t-il un autre moyen de le faire ?

Si j'efface la date dans l'inite, le code ne compile pas, mais écrit deux erreurs :

'{' - expression attendue

'=' - utilisation d'une opération illégale



Avec '=', vous ne pouvez initialiser les tableaux que lorsque vous les déclarez. Cela semble être un vestige de C, mais c'est ainsi que cela se passe ici :-)
 
Maxim Kuznetsov:

La déclaration du tableau et l'initialisation des constantes auraient pu (et dû) être effectuées au niveau global.

Oui, j'ai essayé et ça marche. Et vous ne pouvez pas le faire sans niveau global, je l'ai juste fait pour réduire le coût de calcul, pour remplir le tableau une fois dans l'init et ensuite utiliser les valeurs du tableau ?

Bien que logiquement, les variables du niveau global soient toujours constantes, le calcul est donc effectué une fois au début du programme ?

 
forexman77:

Oui, j'ai essayé et ça marche. Et vous ne pouvez pas le faire sans niveau global, je l'ai juste fait pour réduire le coût de calcul, pour remplir le tableau une fois dans l'init et ensuite utiliser les valeurs du tableau ?

Bien que logiquement les variables au niveau global soient toujours constantes, le calcul est donc effectué une fois au début du programme ?

Oui, lors de la préparation d'un binaire ex4 ex5 pour son exécution par le terminal. On peut penser que ce ne sont que des liens vers le tableau de données décrit (et sauvegardé dans ex4/5 au moment de la compilation), et c'est très rapide...
 
forexman77:

Il indique qu'il existe déjà une déclaration globale)

la déclaration de 'T' cache la déclaration globale à la ligne 40

Mais, comment le faire correctement. Je n'avais jamais déclaré un tableau en utilisant des accolades auparavant. Je l'ai initialisé avec zéro et défini sa taille, puis je l'ai rempli avec la boucle. Y a-t-il un autre moyen de le faire ?

Si j'efface la date dans l'inite, le code ne compile pas, mais écrit deux erreurs :

'{' - expression attendue

'=' - utilisation d'une opération illégale



La façon dont le tableau est rempli n'a pas vraiment d'importance. Il suffit de définir une condition selon laquelle, si la taille du tableau est nulle, il doit être évalué, rempli et écrit dans un fichier. Et dans OnInit(), essayez de lire dans le tableau déclaré en utilisant mon exemple. Par conséquent, s'il existe un tableau de fichiers, qu'il est lu et que le tableau est rempli, le tableau ne sera pas recalculé et rempli à nouveau.