Старт распродаж! Черная пятница - 50%


Новые сообщения · Участники · Правила форума · Поиск · RSS · Вход · Регистрация ·

Страница 1 из 11
Форум трейдеров » Скрипты Советники Индикаторы для Metatrader4/Metatrader5 » MT 4 MQL программирование, помощь. » Создание "безразмерного" массива
Создание "безразмерного" массива

StanДата: Четверг, 28.08.2014, 02:04 | Сообщение # 1
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

Подскажите, как создать "безразмерный" массив? Покажу проблему на своем примере при создании функции записи данных в файл:

За пределами фунции start() сначала создаю 2 динамических массива:
double  Array1[];
string  Array2[];

Далее код функции примерно выглядит так:

Код
void CreateCSVFile()
{
int ArraySize = 1000;                //размер массива
ArrayResize(Array1, ArraySize); //устанавливаем размер массивов
ArrayResize(Array2, ArraySize);

if(CSVFileCreate)      //создаем CSV-файл
{
Array1 [Counter]= Result;             //Переменные Counter и Result расчитываются внутри start()
if(Array1[Counter]==1) Array2 [Counter]= "A";
if(Array1[Counter]==0) Array2 [Counter]= "B";

if (Counter>0)
{
//Блок открытия файла
ResetLastError();

if(Flag)                    //Переменная Flag расчитывается внутри start()
{
CSVFileName = CSVFileFolder+"\\"+Symbol()+".csv";
Flag = false;
}

FileHandle = FileOpen(CSVFileName, FILE_WRITE|FILE_CSV, ";");

//Блок записи в файл
if(FileHandle!=INVALID_HANDLE)
{
FileWrite(FileHandle, ...);
for(int i=1;i<=Counter;i++)
{
FileWrite(FileHandle, i, Array2);
}

FileClose(FileHandle);
}
else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
}
}
}

После превышения 1000 (=ArraySize) записей в файл через переменную Array2, соответственно, выходит ошибка "Array out of Range". Поэтому, появляется задача, как придумать алгоритм, чтобы обойти это ограничение на задание конечного размера массива и сделать массив как бы "безразмерным".

Что-то слышал о том, что в некоторые языках есть специальные для этого случая функции, типа, "Append Array", которые решают проблему безразмерного массива, но в MQL4 такой специальной функции нет.

Есть еще такая идея, что можно было бы при задании конечного размера массива как-то выгружать из памяти ArraySize данных, сохраняя их в файле, и заново запускать этот массив того же размера ArraySize с продолжением нумерации (т.е. от 1001 до 2000). Когда размер этого массива превысит размер 2000, то опять выгружаем из памяти ArraySize данных, сохраняя их в файле, и заново запускаем массив с размером ArraySize, и т.д. Получается цикл из записи и выгрузки данных.

Может быть у кого-то есть практическое решение данной проблемы с созданием "безразмерного" массива? Не пойму пока, как реализовать в коде хотя бы ту идею, которую выше изложил ...

 
СообщениеПодскажите, как создать "безразмерный" массив? Покажу проблему на своем примере при создании функции записи данных в файл:

За пределами фунции start() сначала создаю 2 динамических массива:
double  Array1[];
string  Array2[];

Далее код функции примерно выглядит так:

Код
void CreateCSVFile()
{
int ArraySize = 1000;                //размер массива
ArrayResize(Array1, ArraySize); //устанавливаем размер массивов
ArrayResize(Array2, ArraySize);

if(CSVFileCreate)      //создаем CSV-файл
{
Array1 [Counter]= Result;             //Переменные Counter и Result расчитываются внутри start()
if(Array1[Counter]==1) Array2 [Counter]= "A";
if(Array1[Counter]==0) Array2 [Counter]= "B";

if (Counter>0)
{
//Блок открытия файла
ResetLastError();

if(Flag)                    //Переменная Flag расчитывается внутри start()
{
CSVFileName = CSVFileFolder+"\\"+Symbol()+".csv";
Flag = false;
}

FileHandle = FileOpen(CSVFileName, FILE_WRITE|FILE_CSV, ";");

//Блок записи в файл
if(FileHandle!=INVALID_HANDLE)
{
FileWrite(FileHandle, ...);
for(int i=1;i<=Counter;i++)
{
FileWrite(FileHandle, i, Array2);
}

FileClose(FileHandle);
}
else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
}
}
}

После превышения 1000 (=ArraySize) записей в файл через переменную Array2, соответственно, выходит ошибка "Array out of Range". Поэтому, появляется задача, как придумать алгоритм, чтобы обойти это ограничение на задание конечного размера массива и сделать массив как бы "безразмерным".

Что-то слышал о том, что в некоторые языках есть специальные для этого случая функции, типа, "Append Array", которые решают проблему безразмерного массива, но в MQL4 такой специальной функции нет.

Есть еще такая идея, что можно было бы при задании конечного размера массива как-то выгружать из памяти ArraySize данных, сохраняя их в файле, и заново запускать этот массив того же размера ArraySize с продолжением нумерации (т.е. от 1001 до 2000). Когда размер этого массива превысит размер 2000, то опять выгружаем из памяти ArraySize данных, сохраняя их в файле, и заново запускаем массив с размером ArraySize, и т.д. Получается цикл из записи и выгрузки данных.

Может быть у кого-то есть практическое решение данной проблемы с созданием "безразмерного" массива? Не пойму пока, как реализовать в коде хотя бы ту идею, которую выше изложил ...

Автор - Stan
Дата добавления - 28.08.2014 в 02:04

expforexДата: Четверг, 28.08.2014, 09:57 | Сообщение # 2
Главный Администартор
Группа: Администраторы
Сообщений: 8951
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Привет.

по Вашему коду Вы явно задали размер массива    int ArraySize=1000;                //размер массива 
 
поэтому Ваш массив всегда 1000 зачем?
далее Вы создали переменную которая уже декларирована
ArraySize



Цитата
ArraySize
Возвращает количество элементов
указанного массива.
int  ArraySize(
   const void&  array[]    // проверяемый массив
   );
Параметры
array[]
 [in]Массив
любого типа.


что такое Counter
в Вашем коде его нет, который Вы выложили, и я не знаю чему он равен.

далее Вы перебираете все элементы с i = 1 до Counter 

 
Код
for(int i=1;i<=Counter;i++)
               {
                FileWrite(FileHandle,i,Array2);
               }


попробуйте здесь:

Код
void CreateCSVFile()  
   {
    int ArraySize=1000;                //размер массива  
    ArrayResize(Array1,ArraySize); //устанавливаем размер массивов  
    ArrayResize(Array2,ArraySize);


сделать так:

Код
void CreateCSVFile()  
   {

    ArrayResize(Array1,ArraySize(Array1)+1); //устанавливаем размер массивов  
    ArrayResize(Array2,ArraySize(Array2)+1);


Помог чем смог. конечно без всего кода это как пальцем в небо



Программирование на заказ || Наши Разработки

 
СообщениеПривет.

по Вашему коду Вы явно задали размер массива    int ArraySize=1000;                //размер массива 
 
поэтому Ваш массив всегда 1000 зачем?
далее Вы создали переменную которая уже декларирована
ArraySize


Цитата
ArraySize
Возвращает количество элементов
указанного массива.
int  ArraySize(
   const void&  array[]    // проверяемый массив
   );
Параметры
array[]
 [in]Массив
любого типа.


что такое Counter
в Вашем коде его нет, который Вы выложили, и я не знаю чему он равен.

далее Вы перебираете все элементы с i = 1 до Counter 

 
Код
for(int i=1;i<=Counter;i++)
               {
                FileWrite(FileHandle,i,Array2);
               }


попробуйте здесь:

Код
void CreateCSVFile()  
   {
    int ArraySize=1000;                //размер массива  
    ArrayResize(Array1,ArraySize); //устанавливаем размер массивов  
    ArrayResize(Array2,ArraySize);


сделать так:

Код
void CreateCSVFile()  
   {

    ArrayResize(Array1,ArraySize(Array1)+1); //устанавливаем размер массивов  
    ArrayResize(Array2,ArraySize(Array2)+1);


Помог чем смог. конечно без всего кода это как пальцем в небо

Автор - expforex
Дата добавления - 28.08.2014 в 09:57

StanДата: Четверг, 28.08.2014, 12:17 | Сообщение # 3
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

Цитата expforex ()
по Вашему коду Вы явно задали размер массива int ArraySize=1000; //размер массива поэтому Ваш массив всегда 1000 зачем?
я создал переменную ArraySize, сделав ее конечной, так как компилятор ругался ошибкой "Array out of range". Думал, что из-за этой ошибки требуется задавать конечный размер массива. В случае необходимости иметь большой размер массива, увеличивал бы значение параметра  ArraySize, но это решение не выглядело красивым и поэтому надо было еще что-то придумать, но, кажется, что слишком замудрил с решением проблемы smile

Цитата
далее Вы создали переменную которая уже декларирована
ArraySize


Да я ее для примера написал (не корректно, конечно). В коде у меня другое название переменной, не такое красивое, как здесь ))

Цитата
что такое Counter
в Вашем коде его нет, который Вы выложили, и я не знаю чему он равен.

Переменная int Counter - это просто счетчик (= 1,2,3,...). Не думал, что он какую-то роль мог бы играть в решении проблемы, поэтому его не писал.

Цитата
void CreateCSVFile()  
   {

    ArrayResize(Array1,ArraySize(Array1)+1); //устанавливаем размер массивов  
    ArrayResize(Array2,ArraySize(Array2)+1);

Похоже, что это то, что надо smile Как-то сам не догадался до этой строчки. Еще раз проверю все на работоспособность, но, по крайней мере, необходимость в использовании переменной ArraySize отпадает.

Спасибо большое за помощь!

 
Сообщение
Цитата expforex ()
по Вашему коду Вы явно задали размер массива int ArraySize=1000; //размер массива поэтому Ваш массив всегда 1000 зачем?
я создал переменную ArraySize, сделав ее конечной, так как компилятор ругался ошибкой "Array out of range". Думал, что из-за этой ошибки требуется задавать конечный размер массива. В случае необходимости иметь большой размер массива, увеличивал бы значение параметра  ArraySize, но это решение не выглядело красивым и поэтому надо было еще что-то придумать, но, кажется, что слишком замудрил с решением проблемы smile

Цитата
далее Вы создали переменную которая уже декларирована
ArraySize


Да я ее для примера написал (не корректно, конечно). В коде у меня другое название переменной, не такое красивое, как здесь ))

Цитата
что такое Counter
в Вашем коде его нет, который Вы выложили, и я не знаю чему он равен.

Переменная int Counter - это просто счетчик (= 1,2,3,...). Не думал, что он какую-то роль мог бы играть в решении проблемы, поэтому его не писал.

Цитата
void CreateCSVFile()  
   {

    ArrayResize(Array1,ArraySize(Array1)+1); //устанавливаем размер массивов  
    ArrayResize(Array2,ArraySize(Array2)+1);

Похоже, что это то, что надо smile Как-то сам не догадался до этой строчки. Еще раз проверю все на работоспособность, но, по крайней мере, необходимость в использовании переменной ArraySize отпадает.

Спасибо большое за помощь!

Автор - Stan
Дата добавления - 28.08.2014 в 12:17

expforexДата: Четверг, 28.08.2014, 12:21 | Сообщение # 4
Главный Администартор
Группа: Администраторы
Сообщений: 8951
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Цитата Stan ()
Спасибо большое за помощь!
незачто, если что пишите результаты помогло не помогло - и выкладывайте полный код или эксперта, чтобы не гадать - что за что отвечает.



Программирование на заказ || Наши Разработки

 
Сообщение
Цитата Stan ()
Спасибо большое за помощь!
незачто, если что пишите результаты помогло не помогло - и выкладывайте полный код или эксперта, чтобы не гадать - что за что отвечает.

Автор - expforex
Дата добавления - 28.08.2014 в 12:21
Форум трейдеров » Скрипты Советники Индикаторы для Metatrader4/Metatrader5 » MT 4 MQL программирование, помощь. » Создание "безразмерного" массива
Страница 1 из 11
Поиск:


WebMoney Яндекс цитирования.