Questions des débutants MQL5 MT5 MetaTrader 5 - page 618

 
Leo59:
Pouvez-vous me dire pourquoi cela pourrait être le cas ? :
Fun_1() et Fun_2() sont similaires.
Similaire sans type de fonction et sans retour ?
 
Leo59:
Pouvez-vous me dire quelle est la cause de ce problème ? :
Fun_1() et Fun_2() sont similaires.

sur le plan académique - les fonctions ne sont pas pures et modifient l'état global.

brièvement - les deux fonctions lisent et écrivent une variable globale ou un fichier.

 
Maxim Kuznetsov:

sur le plan académique - les fonctions ne sont pas pures et modifient l'état global.

en bref - les deux fonctions lisent et écrivent une variable globale ou un fichier.

Oui, ils écrivent chacun un fichier. Et alors ?
 
Leo59:
Oui, chacun d'eux écrit un fichier. Et alors ?

et ne fonctionnent pas ensemble :-)

PS. il est impossible de se prononcer plus précisément sur l'origine des coups souterrains sans sources. Il y a une erreur quelque part - corrigez-la

 
Pour gagner de l'espace et améliorer la perception - en une seule fonction. Ça ne marche toujours pas.

void Fun_Select_2()                                                   // dSSd Выбор сочетаний из массивов dSe1_Bal_D и dSe1_Bal_W с Proba>67
   {
    // 1. УДАЛЯЕМ старые файлы
    // 2. ПЕРЕБИРАЕМ в поиске соответствия
    // 3. ПЕЧАТАЕМ найденное в файл

    // 1. УДАЛЯЕМ старые файлы
    if(use_Print_Rep_dSS == 1)                                        // =0 -> Условие отключено, =1 -> Печатать в log файл Промежуточные отчёты (dSS)
        {
         LogName="Rep_dSSd "+EN;                                      // (Interum Report) Название ЛОГА + Название ЭТОГО ЭКСПЕРТА, передаваемое в log файл
         // Если файл с таким именем существует, то удаляем его ... 
         ld=log_delete(LogName);                                      // ФЛАГ log файла, удаляемого в директории "logs\\" 
         if(ld==1)
              Alert ("Старый файл dSSd УДАЛЁН");
         LogName="Rep_dSSw "+EN;                                      // (Interum Report) Название ЛОГА + Название ЭТОГО ЭКСПЕРТА, передаваемое в log файл
         // Если файл с таким именем существует, то удаляем его ... 
         ld=log_delete(LogName);                                      // ФЛАГ log файла, удаляемого в директории "logs\\" 
         if(ld==1)
              Alert ("Старый файл dSSw УДАЛЁН");
        }

    // 2. ПЕРЕБИРАЕМ в поиске соответствия
    //    Находим соответствие между [1]-"Num1 А" и [4]-"Num1 B" в массивах dSe1_Bal_D и dSe1_Bal_W
    int t=0;                                                          // Техническая переменная
    int d=0;                                                          // Техническая переменная
    int w=0;                                                          // Техническая переменная
    int D=0;                                                          // Техническая переменная
    int W=0;                                                          // Техническая переменная
    int S=0;                                                          // Техническая переменная

    //    Если есть соответствие тогда записываем её в массив dSSd[][90]
    Count_dSSd=0;                                                     // "Обнуляем" Счётчик записей (строк) в массиве dSSd[][90]
    Range_dSSd_one=0;                                                 // "Обнуляем" Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSd[][90];
    Range_dSSd_two=0;                                                 // "Обнуляем" Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSd[][90];

    for(d=0, t=0; d<Range_dSe1_Bal_D_one; d++)
        {
         for(w=0; w<Range_dSe1_Bal_W_one; w++)
             {
              if( (dSe1_Bal_W[w][1]==dSe1_Bal_D[d][1]) && (dSe1_Bal_W[w][4]==dSe1_Bal_D[d][4]) )
                  {
                   Count_dSSd++;                                      // Счётчик записей (строк) в массиве dSSd[][90]
                   ArrayResize(dSSd, Count_dSSd, 200000);             // Задайм новый размер массива с резервированием памяти на 100000 записей (строк)  
                   for(S=0,  D=0;   D<45;   D++, S++)
                        dSSd[t][S] = dSe1_Bal_D[d][D];                // Значения строки массива dSe1_Bal_D
                   for(S=45, W=0;   W<45;   W++, S++)
                        dSSd[t][S] = dSe1_Bal_W[w][W];                // Значения строки массива dSe1_Bal_W
                   t++;                                               // Увеличили индекс массива dSSd на "1"
                  }
             }
        }
    Range_dSSd_one = ArrayRange(dSSd, 0);                             // Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSd[][90];
    Range_dSSd_two = ArrayRange(dSSd, 1);                             // Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSd[][90];

    //    Если есть соответствие тогда записываем её в массив dSSw[][90]
    Count_dSSw=0;                                                     // "Обнуляем" Счётчик записей (строк) в массиве dSSw[][90]
    Range_dSSw_one=0;                                                 // "Обнуляем" Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSw[][90];
    Range_dSSw_two=0;                                                 // "Обнуляем" Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSw[][90];
    for(d=0, t=0; d<Range_dSe1_Bal_D_one; d++)
        {
         for(w=0; w<Range_dSe1_Bal_W_one; w++)
             {
              if( (dSe1_Bal_W[w][1]==dSe1_Bal_D[d][1]) && (dSe1_Bal_W[w][4]==dSe1_Bal_D[d][4]) )

                  {
                   Count_dSSw++;                                      // Счётчик записей (строк) в массиве dSSw[][90]
                   ArrayResize(dSSw, Count_dSSw, 200000);             // Задайм новый размер массива с резервированием памяти на 100000 записей (строк)  
                   for(S=0,  W=0;   W<45;   W++, S++)
                        dSSw[t][S] = dSe1_Bal_W[w][W];                // Значения строки массива dSe1_Bal_W
                   for(S=45, D=0;   D<45;   D++, S++)
                        dSSw[t][S] = dSe1_Bal_D[d][D];                // Значения строки массива dSe1_Bal_D
                   t++;                                               // Увеличили индекс массива dSSw на "1"
                  }
             }
        }
    Range_dSSw_one = ArrayRange(dSSw, 0);                             // Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSw[][90];
    Range_dSSw_two = ArrayRange(dSSw, 1);                             // Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSw[][90];

    // 3. ПЕЧАТАЕМ найденное в файл
    int LH_Rep=0;                                                     // Хэндл log файла, открытого в директории "logs\\" 
    if(use_Print_Rep_dSS == 1)                                        // =0 -> Условие отключено, =1 -> Печатать в log файл Промежуточные отчёты (dSS)
        {
         if(Count_dSSd>0)
             {
              LogName="Rep_dSSd "+EN;                                 // (Interum Report) Название ЛОГА + Название ЭТОГО ЭКСПЕРТА, передаваемое в log файл
              LH_Rep=log_open(LogName);                               // Хэндл log файла, открытого в директории "logs\\" 
              Fun_Rep_mass90(LH_Rep, dSSd, Count_dSSd);               // Функция F 135 Запись Массива  mass90[][90] в Промежуточный отчёт в *.csv файл
              log_close(LH_Rep);                                      // Закрываем лог-файл этого эксперта
              Alert ("Записан ОТЧЁТ ", LogName);
             }
         if(Count_dSSw>0)
             {
              LogName="Rep_dSSw "+EN;                                 // (Interum Report) Название ЛОГА + Название ЭТОГО ЭКСПЕРТА, передаваемое в log файл
              LH_Rep=log_open(LogName);                               // Хэндл log файла, открытого в директории "logs\\" 
              Fun_Rep_mass90(LH_Rep, dSSw, Count_dSSw);               // Функция F 135 Запись Массива  mass90[][90] в Промежуточный отчёт в *.csv файл
              log_close(LH_Rep);                                      // Закрываем лог-файл этого эксперта
              Alert ("Записан ОТЧЁТ ", LogName);
             }
        }
   }
 
Leo59:
Pour gagner de l'espace et améliorer la perception - en une seule fonction. Ça ne marche toujours pas.

pour l'avenir - si vous avez besoin du résultat de la fonction (au moins travaillé/non travaillé), ne le rendez pas nul. Au premier coup d'œil, il est difficile de déterminer qu'il existe un critère de "déclenchement" - il est nul, peu importe comment on lance tout est bon.

sur les droits du débogueur :

Vous avez un tas de variables globales Count_XXX, Range_XXX, que vous convertissez (plus des tableaux dSSxx[]), que vous utilisez pour décider s'il faut enregistrer ou non et que vous passez ensuite quelque part, soit par référence, soit par valeur...

il y a manifestement un problème avec leur recalcul - Count_dSS obtient 0 lorsque vous le rappelez. L'impression peut aider à comprendre ou les points d'arrêt et regarder.

 
Maxim Kuznetsov:

à l'avenir - si vous avez besoin du résultat d'une fonction (qu'elle ait fonctionné ou non), ne la rendez pas nulle. Au premier coup d'œil, il est difficile de déterminer quel est le critère de "déclenché" - il est nul, peu importe comment on le lance, tout est bon.

sur les droits du débogueur :

vous avez un tas de variables globales Count_XXX, Range_XXX, que vous convertissez (plus des tableaux dSSxx[]), en fonction d'elles vous décidez si vous voulez enregistrer ou non et ensuite vous passez quelque part soit par référence soit par valeur...

il y a manifestement un problème avec leur recalcul - Count_dSS obtient 0 lorsque vous le rappelez. L'impression peut aider à comprendre ou les points d'arrêt et regarder.

Quel rappel voulez-vous dire ?
Une version simplifiée :
double   dSSd[][90];                   // Динамический Массив SelectSort соответствия пары массива dSe1_Bal_W паре массива dSe1_Bal_D
int      Count_dSSd=0;                 // Счётчик записей (строк) в массиве dSSd[][90]
int      Range_dSSd_one=0;             // = ArrayRange(dSS, 0);  Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSd[][90];
int      Range_dSSd_two=0;             // = ArrayRange(dSS, 1);  Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSd[][90];

double   dSSw[][90];                   // Динамический Массив SelectSort соответствия пары массива dSe1_Bal_W паре массива dSe1_Bal_D
int      Count_dSSw=0;                 // Счётчик записей (строк) в массиве dSSw[][90]
int      Range_dSSw_one=0;             // = ArrayRange(dSS, 0);  Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSw[][90];
int      Range_dSSw_two=0;             // = ArrayRange(dSS, 1);  Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSw[][90];

int init()
   {
    ArrayResize(dSSd, 200000, 200000);                                // Задаём новый размер массива с резервированием памяти на 200000 записей (строк)  
    ArrayResize(dSSw, 200000, 200000);                                // Задаём новый размер массива с резервированием памяти на 200000 записей (строк)  
    Fun_Select_2();
    return(0);
   }

void Fun_Select_2()                                                   
   {
    //    Находим соответствие между [1]-"Num1 А" и [4]-"Num1 B" в массивах dSe1_Bal_D и dSe1_Bal_W
    int t=0;                                                          // Техническая переменная
    int d=0;                                                          // Техническая переменная
    int w=0;                                                          // Техническая переменная
    int D=0;                                                          // Техническая переменная
    int W=0;                                                          // Техническая переменная
    int S=0;                                                          // Техническая переменная

    //    Если есть соответствие тогда записываем её в массив dSSd[][90]

    for(d=0, t=0; d<Range_dSe1_Bal_D_one; d++)
        {
         for(w=0; w<Range_dSe1_Bal_W_one; w++)
             {
              if( (dSe1_Bal_W[w][1]==dSe1_Bal_D[d][1]) && (dSe1_Bal_W[w][4]==dSe1_Bal_D[d][4]) )
                  {
                   Count_dSSd++;                                      // Счётчик записей (строк) в массиве dSSd[][90]
                   ArrayResize(dSSd, Count_dSSd, 200000);             // Задаём новый размер массива с резервированием памяти на 100000 записей (строк)  
                   for(S=0,  D=0;   D<45;   D++, S++)
                        dSSd[t][S] = dSe1_Bal_D[d][D];                // Значения строки массива dSe1_Bal_D
                   for(S=45, W=0;   W<45;   W++, S++)
                        dSSd[t][S] = dSe1_Bal_W[w][W];                // Значения строки массива dSe1_Bal_W
                   t++;                                               // Увеличили индекс массива dSSd на "1"
                  }
             }
        }
    Range_dSSd_one = ArrayRange(dSSd, 0);                             // Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSd[][90];
    Range_dSSd_two = ArrayRange(dSSd, 1);                             // Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSd[][90];

    //    Если есть соответствие тогда записываем её в массив dSSw[][90]
   for(d=0, t=0; d<Range_dSe1_Bal_D_one; d++)
        {
         for(w=0; w<Range_dSe1_Bal_W_one; w++)
             {
              if( (dSe1_Bal_W[w][1]==dSe1_Bal_D[d][1]) && (dSe1_Bal_W[w][4]==dSe1_Bal_D[d][4]) )
                  {
                   Count_dSSw++;                                      // Счётчик записей (строк) в массиве dSSw[][90]
                   ArrayResize(dSSw, Count_dSSw, 200000);             // Задаём новый размер массива с резервированием памяти на 100000 записей (строк)  
                   for(S=0,  W=0;   W<45;   W++, S++)
                        dSSw[t][S] = dSe1_Bal_W[w][W];                // Значения строки массива dSe1_Bal_W
                   for(S=45, D=0;   D<45;   D++, S++)
                        dSSw[t][S] = dSe1_Bal_D[d][D];                // Значения строки массива dSe1_Bal_D
                   t++;                                               // Увеличили индекс массива dSSw на "1"
                  }
             }
        }
    Range_dSSw_one = ArrayRange(dSSw, 0);                             // Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSw[][90];
    Range_dSSw_two = ArrayRange(dSSw, 1);                             // Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSw[][90];
   }

// Получаенный результат:

// Count_dSSd     = 280
// Range_dSSd_one = 280
// Range_dSSd_two = 90
// Массив dSSd заполнен правильными значениями

// Count_dSSw     = 280
// Range_dSSw_one = 0
// Range_dSSw_two = 90
// Массив dSSw заполнен "0"
 
// L'essence du problème est la suivante :
// Il existe deux tableaux dynamiques A[][2] et B[][2].
// nous recherchons des correspondances par le premier indice de dimension "0".
// Tableau A Tableau B
// 31 25 19 66
// 44 15 62 30
// 62 47 54 71
// 31 94
// Nous voulons obtenir :
// Tableau dSSd[][4] Tableau dSSw[][4]
// 31 25 31 94 31 94 31 25
// 62 47 62 30 62 30 62 47
 
Leo59:
Quel rappel avez-vous à l'esprit ?
Une version simplifiée :

Je fais référence à une fonction similaire à la première (qui peut être différente dans le détail). Vous avez posé la même question : pourquoi ces fonctions fonctionnent-elles séparément, mais pas l'une après l'autre (quel que soit l'ordre). Plus précisément, seule la première fonction fonctionne et enregistre quelque chose.

bien - baiser l'état global, c'est-à-dire que le premier appel de la première de ces fonctions a modifié soit les variables globales, soit le contenu des tableaux. Pourquoi ? Vous devriez mieux savoir, pourquoi cela devrait changer lors de l'écriture dans un fichier:-) Honnêtement - percer

Range_dSe1_Bal_W_one

Moi, par exemple, je trouve cela difficile et réticent. Obtenez un débogueur ou mettez déjà des imprimantes sur tous les endroits suspects. Vous comprenez la logique de dénomination et avez une idée de la façon dont cela devrait fonctionner (mais cela ne coïncide pas avec la réalité :-) ).

PS/ d'après l'explication de ce qui est en entrée et ce qui est en sortie, je vois qu'au lieu de deux tableaux dSSx[][4] est suffisant et un dSS[][3] :-)

 
Maxim Kuznetsov:

Je fais référence à une fonction similaire à la première (qui peut être différente dans le détail). Vous avez posé la même question : pourquoi ces fonctions fonctionnent-elles individuellement, mais pas l'une après l'autre (quel que soit l'ordre). Plus précisément, seule la première fonction fonctionne et enregistre quelque chose.

Eh bien - l'état global est baisé, c'est-à-dire que le premier appel de la première de ces fonctions a modifié soit les variables globales, soit le contenu des tableaux. Peut-être savez-vous mieux pourquoi ils devraient le changer lors de l'écriture dans le fichier:-). Honnêtement - percer

Moi, par exemple, je trouve cela difficile et réticent. Obtenez un débogueur ou mettez déjà des imprimantes sur tous les endroits suspects. Vous comprenez la logique de dénomination et avez une idée de la façon dont cela devrait fonctionner (ce qui ne coïncide pas avec la réalité :-) ).

PS/ d'après l'explication de ce qui est en entrée et ce qui est en sortie, je vois qu'au lieu de deux tableaux dSSx[][4] est suffisant et un dSS[][3] :-)

Maxim, merci de ne pas être indifférent. Le problème est résolu. Il s'est avéré que c'était une question de mémoire insuffisante.
Raison: