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_Wint 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_Dfor(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_Wfor(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.
à 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_Dint 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_Dint 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_Wint 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_Dfor(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_Wfor(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] :-)
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.
Pouvez-vous me dire pourquoi cela pourrait être le cas ? :
Fun_1() et Fun_2() sont similaires.
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.
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, 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.
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.
à 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.
Une version simplifiée :
// 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
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
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] :-)
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] :-)