Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
ФХЪРСап 13, 2024, 07:33:26 pm
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Переменная типа static « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: Переменная типа static  (Прочитано 9764 раз)
nikolz
Sr. Member
****
Сообщений: 285


Просмотр профиля Email
« : ЬРавР 22, 2011, 08:40:23 am »

Уважаемые разработчики!
   В документации приведен пример использования переменной типа static.
По моему мнению пример ошибочный и не объясняет назначение типа static.
    Не исключаю, что я не понял Ваши рассуждения.

     Начнем от печки.
Тип static в правильных языках предназначен для описания переменной,
 видимой лишь в функции содержащей это описание.
Т.е. ее область видимости, в отличии от глобальной переменной,
ограничена телом процедуры, т.е. видимость как у локальной переменной.
     Но в отличии от локальной переменной,
которая уничтожается при выходе из функции,
переменная static сохраняет свое значение и
это значение можно использовать при новом входе в функцию,
 т.е. в этом смысле переменная static ведет себя как глобальная.

  В документации приведен пример применения переменной Static:
static alerted;
function alert(var string) {
   if (not alerted) {
      signal::alertMultiple(string);
      alerted = true;
   }
}
...
Ошибка в том, что Static описана в глобальной области . Таким образом, static alerted стала глобальной переменной.
и запись static alerted; ничем не отличается от записи var alerted.
Как же правильно записать  переменную static ?
А вот как:
 function alert(var string) {
   static alerted;   //видимость внутри функции значение сохраняем при выходе
   if (not alerted) {
      signal::alertMultiple(string);
      alerted = true;
   }
}
   Но в этом случае, так как это static внутри alert, то ее не будет видно внутри    function onNewCandle().
 Короче, чтобы реализовать пример , который приведен в документации тип stastic не нужен. Нужна глобальная переменная.
   Резюме, тип static тем хорош, что мы может сохранять значения локальных переменных при выходе из функций при этом закрыв эти переменные от возможного изменения в других функциях.
Ну вот примерно так.

  "Ваше слово товарищ маузер.."
« Последнее редактирование: ЬРавР 22, 2011, 09:13:33 am от nikolz » Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #1 : ЬРавР 22, 2011, 11:07:35 am »

Здесь не особо удачная терминология используется с нашей стороны.

Дело в том, что индикатор каждый раз пересчитывается по каждому трейду для последней свечки, и переменные var при этом "сбрасываются" в состояние, в котором они находились на предыдущей свечке. Это сделано специально для того, чтобы индикаторы можно было программировать не думая о том, что на каждую свечку calc() вызывается на самом деле множество раз по каждому трейду. Таким образом все переменные var являются как бы локальными для текущей свечки.

Переменные static являются статическими в том смысле, что они существуют вне этого механизма отката и пересчета данных. Можно рассмотреть еще такой пример:

Code: [Select]
var a = 0;
static b = 0;

function calc()
{
  if (isHistoryCalculated()) {
     a += 1;
     b += 1;
     line[0] = a;
     line[1] = b;
  }
}

Построив этот индикатор, вы увидите четкую разницу между переменными этих типов. Такое поведение покажется странным, однако на самом деле довольно оправданно и все же технически корректно. Например, вы можете попробовать в любом индикаторе из примеров на сайте заменить переменную var на переменную static, и посмотреть что получится.

Ну и в общем-то такое поведение вполне соответствует представлению о статических переменных в Computer Science. Вот, например, из Википедии:

Quote
In computer programming , a static variable is a variable that has been allocated statically — whose lifetime extends across the entire run of the program. This is in contrast to the more ephemeral automatic variables (local variables), whose storage is allocated and deallocated on the call stack; and in contrast to objects whose storage is dynamically allocated.

Это вполне согласуется с поведением ATF, хотя конечно не особо привычно для людей, привыкших к другим языкам программирования, так как здесь несколько другой уровень абстракции. В этом плане безусловно терминология нами выбрана не самая удачная, вероятно мы в этом направлении что-то сделаем, чтобы все это стало более просто и понятно, но пока думаем - однозначно хороших идей пока не родилось, но то ли еще будет.
Записан
nikolz
Sr. Member
****
Сообщений: 285


Просмотр профиля Email
« Ответ #2 : ЬРавР 22, 2011, 12:40:36 pm »

Спасибо, все понятно
Записан
Страниц: [1] Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Переменная типа static « предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!