Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 264

 
а все вроде так. Если заранее не задан размер массива, то его однозначно ArrayResize делать нужно. А в конце действий АррейРесайз(массив,0); да, это в тему, никогда об этом не думал...........Учту....... Спасибо))))
 
Нельзя на каждом тике ArrayResize делать!!!!!!! Иначе погрязните в вычислениях................... И никакой многоядерный процессор не спасёт........
 
Опубликованная 11.11.2013 07:54 статья "ShowCandleSize" отображается неправильно и по непонятной причине правке не поддаётся.
15 ноября обращался с этим вопросом в службу поддержки по адресу noreply@metaquotes.net, но ответа не получил.
Подскажите, пожалуйста, правильный адрес для такого вопроса.
С уважением.
--
Vladislav Shurkin,
20 ноября 2013 года.
 
artmedia70:
Все результаты закрытых сделок можно посмотреть в истории счёта. Программно. А постоянно массив ими забивать - оно надо? Их же может быть очень много. Лучше ограничиться необходимой глубиной истории и заполнить массив, если совсем уж без него жить не можется.

Спасибо за разъяснения!

"Все результаты закрытых сделок можно посмотреть в истории счёта. Программно." - Это как?
 
VladislavVG:


При завершении программ необходимо память, выделенную динамически, освобождать для исключения утечек памяти. Я не знаю следят ли за этим разработчики МКЛ



Следят, для того и сделаны массивы статическими, чтоб их собрать в одном месте и потом высвободить. ArrayResize(a,0) в конце программы большого смысла не имеет, если только для самоуспокоения.
 
Leo59:
Спасибо за разъяснения!

"Все результаты закрытых сделок можно посмотреть в истории счёта. Программно." - Это как?

OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY)

или

OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)

 
alsu:

OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY)

или

OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)




Спасибо!


Вот, чем хорош учебник Ковалёва? По-моему тем, что там, на простых примерах программного кода, учишься решать простые задачи.

Вообще-то, я начал изучать программирование на примере кода индикатора Владислава Гошкова. Рисовал тот индикатор лучи проддержки и сопротивления по Де-Марку. Были там такие строчки:
ObjectMove(buff_str, 1, UpBT[0], UpP[0]);
ObjectMove(buff_str, 0, UpBT[1], UpP[1]);
Поставил. Стал смотреть в тестере как это работат. Лучи по фракталам рисуются, но только в прошлое смотрят, а не в будущее...)))). Стал вопросы задавать - разобрался! Респект Владиславу!!!!
Это потом уже на учебник Ковалёва наткнулся. Побольше-бы встречать ответы на вопросы в таком формате изложения.

И ещё.
"Вы хотите написать своего собственного эксперта и не знаете, с чего начать? С появлением статей Rosh'a на сайте Альпари первые шаги в создании эксперта можно сделать лёгкими и безболезненными.
Просто и доступно Rosh рассказывает об этапах, которые проходит каждый экспертописатель. Многие нюансы программирования, знание которых приходит с длительным опытом, теперь доступны всем.
Шаг за шагом, начиная с самых азов, Вы постигнете тонкости программирования для Форекса."

Может быть Вы, знаете, по какой ссылке этот обзор статей можно почитать?
 
VladislavVG:


Потому, что это не массив, если быть точным. Хотите более подробно - смотрите описания языка С. Ссылаюсь не него, поскольку разработчики с самого начала говорили, что по поводу всего, что не понятно или неполно изложено - смотри стандарт С.

А если "на пальцах": когда объявляете переменную double buffer[]; то выделяется память под одну переменную, которая в терминах С называется "указатель", имеет целочисленный тип и в которой хранится адрес ячейки памяти с которой начнется потом массив. Если проверить размерность переменной buffer средствами МКЛ, то получите значение 0. Это обозначает, что памяти под сам массив не отведено и, когда Вы пытаетесь присвоить какое-либо значение, то его просто некуда записать: в МКЛ нет адресной арифметики и с указателями работать нельзя. В С записать можно, но, при "невыделенной" памяти, это обычно приводит к краху системы. Когда применяете АрейРесайз(массив,N), (N>0), то этим самым выделяется память под массив (хотя бы один элемент) и появляется место для записи значений. Тогда при проверке размерность массива будет отлична от 0.

Понятие статического массива в терминах С имеет несколько значений:

1. статический массив (как и статическая переменная/тип) - это такие переменные/массивы размерность которых известна на этапе компиляции (предкомпиляции для МКЛ4) . Например, при описании double buff[10000]; компилятору сообщается размер переменной и он сразу может выделить память. В противовес этому понятию, есть понятие "динамического массива" - то есть, такой массив, размерность которого на этапе компиляции неизвестна и становится известна только на этапе исполнения программы, это все массивы переменной размерности. При обращении к таким массивам нужно предварительно память выделять. Память выделяется за пределами статической памяти программы.

В С/С++ если массив описан в блоке, то и видимость его ограничена блоком - хоть статический массив, хоть динамический. С динамическими массивами, описанными локально, связаны такие ошибки в программах, как "утечки памяти" - это когда указатель на память был уничтожен в силу выхода из области видимости, а память, выделенная под него, осталась занятой.

2 Понятие "статический" массив, как переменная описанная с модификатором static - такие переменные не уничтожаются при выходе из области видимости блока - они располагаются в отдельной области памяти - потому и значения в них сохраняются. Риск утечек памяти уменьшен. Массив, объявленный динамическим в смысле п.1 (то есть массив, размерность которого не известна на этапе компиляции), так же может быть статическим в смысле п.2, то есть декларирован с модификатором "статик".

При завершении программ необходимо память, выделенную динамически, освобождать для исключения утечек памяти. Я не знаю следят ли за этим разработчики МКЛ, но в своих программах всегда память освобождаю - привычка от С - АррейРесайз(массив,0);

В МКЛ все массивы статические в смысле п.2.

Теперь по поводу Вашего вопроса: "Почему статический массив double buffer[]; нельзя присвоить значения ?". Потому, что под него не отведена память (по сути это динамический массив с модификатором статик). Перед присвоением значений необходимо память выделить - то есть применить АррайРесайз с размерностью больше 0, к данному массиву. Для массивов нужно контролировать выход за пределы выделенной памяти (за пределы массива).

ЗЫ Надеюсь, понятно изложил. Постарался как можно проще.

"Мастерство не пропьёшь"!
Спасибо!!!!!!!!
 
VladislavVG:

Потому, что это не массив, если быть точным. Хотите более подробно - смотрите описания языка С. Ссылаюсь не него, поскольку разработчики с самого начала говорили, что по поводу всего, что не понятно или неполно изложено - смотри стандарт С.
........

Огромное спасибо. Проснулся, с залипшими глазами но таким удовольствием прочитал все, еще раз спасибо.
 
Leo59:


Может быть Вы, знаете, по какой ссылке этот обзор статей можно почитать?


https://www.mql5.com/ru/articles/mt4


Ах нет, там уже не открывается(((

Причина обращения: