powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Статические переменные
24 сообщений из 24, страница 1 из 1
Статические переменные
    #40065359
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понимаю, что таким кодом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TMyClass.Test;
{$WRITEABLECONST ON}
const
  CIdx: Integer = 5;
{$WRITEABLECONST OFF}
begin
  Inc(CIdx);
  ShowMessageFmt('%d', [CIdx]);
end;

я объявляю глобальную переменную CIdx, которая видна только в одном методе и сохраняет свое значение в течение всего времени работы программы? И это не хак, а документированное поведение?

Документация говорит такоеDifferences between writeable typed constants and initialized variables:
  • Writeable typed constants can occur both globally and locally in procedure, functions and methods.
  • Initialized variables are only available as global declarations.
  • Initialized variables cause a compile-time error when attempted within procedures or methods.
...
Рейтинг: 0 / 0
Статические переменные
    #40065373
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, зачем тебе такое?
...
Рейтинг: 0 / 0
Статические переменные
    #40065379
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Всё именно так
...
Рейтинг: 0 / 0
Статические переменные
    #40065380
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Интересно, зачем тебе такое?
Да вот нужен глобальный счетчик, но по месту использования. Чтобы не размазывать логику на весь модуль
...
Рейтинг: 0 / 0
Статические переменные
    #40065381
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Всё именно так
Спасибо
...
Рейтинг: 0 / 0
Статические переменные
    #40065402
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напоминает статические переменные в с++. На вкус сахерный сахер
...
Рейтинг: 0 / 0
Статические переменные
    #40065403
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
rgreat
Интересно, зачем тебе такое?
Да вот нужен глобальный счетчик, но по месту использования. Чтобы не размазывать логику на весь модуль


Попробуй использовать виртуальные переменные класса .
...
Рейтинг: 0 / 0
Статические переменные
    #40065468
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
виртуальные переменные класса .
Это что за хрень?
...
Рейтинг: 0 / 0
Статические переменные
    #40065481
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
TMyClass = class
public
  class var Test: integer;
  class constructor Create;
end;

{ TMyClass }

class constructor TMyClass.Create;
begin
  Test:=0;
end;

begin
  inc(TMyClass.Test);
end.


Видимо имелось в виду это.

ИМХО это менее извратный способ чем такая экзотика как {$WRITEABLECONST ON}.
...
Рейтинг: 0 / 0
Статические переменные
    #40065484
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати что будет, если в разных местах кода будет 2 такие константы с одинаковым именем?


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TMyClass.Test;
{$WRITEABLECONST ON}
const
  CIdx: Integer = 5;
{$WRITEABLECONST OFF}
begin
  Inc(CIdx);
  ShowMessageFmt('%d', [CIdx]);
end;

procedure TMyClass.Test2;
{$WRITEABLECONST ON}
const
  CIdx: Integer = 6;
{$WRITEABLECONST OFF}
begin
  Inc(CIdx);
  ShowMessageFmt('%d', [CIdx]);
end;
...
Рейтинг: 0 / 0
Статические переменные
    #40065493
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Кстати что будет, если в разных местах кода будет 2 такие константы с одинаковым именем?
Да хоть десять. В чем ты видишь проблему?
...
Рейтинг: 0 / 0
Статические переменные
    #40065494
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
ИМХО это менее извратный способ чем такая экзотика как {$WRITEABLECONST ON}.
Это более универсальный способ, который не завязан на классы. А {$WRITEABLECONST ON} во многих библиотеках включен по умолчанию. Да и в своих личных настройках я всегда включаю эту директиву
...
Рейтинг: 0 / 0
Статические переменные
    #40065519
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

В глобальной переменной могущей быть определенной несколько раз в разных местах кода.
Причем даже в разных юнитах.

Просто чудесное поле для глюков и побочных эффектов.
...
Рейтинг: 0 / 0
Статические переменные
    #40065529
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Компилятор же к переменным по адресу обращается, а не по имени. Адреса у них будут разные, а у имени видимость вполне себе локальная.
...
Рейтинг: 0 / 0
Статические переменные
    #40065531
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Компилятор же к переменным по адресу обращается, а не по имени. Адреса у них будут разные, а у имени видимость вполне себе локальная.
Просто нечего добавить))
...
Рейтинг: 0 / 0
Статические переменные
    #40065549
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, не совсем так. Это нативная переменная класса. Ее значение будет доступно для всех подклассов. class virtual var обеспечивает изоляцию значения для каждого конкретного класса в котором она объявлена. Подробности см. в статье на Хабре
Vassbotn H. Виртуальные переменные класса .
...
Рейтинг: 0 / 0
Статические переменные
    #40065827
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такое, но больших преимуществ перед объявлением переменной вне функции я не вижу
...
Рейтинг: 0 / 0
Статические переменные
    #40065959
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, $WRITEABLECONST делает из константы обычную глобальную переменную.
...
Рейтинг: 0 / 0
Статические переменные
    #40065966
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Насколько я понимаю, $WRITEABLECONST делает из константы обычную глобальную переменную.
Нет. Глобальной переменной константу делает указание типа. А $WRITEABLECONST позволяет записывать в нее значение без извращений типа
Код: pascal
1.
2.
3.
4.
5.
const
  CIdx: Integer = 5;
begin
  PInteger(@CIdx)^ := 10;
end
...
Рейтинг: 0 / 0
Статические переменные
    #40065977
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хоть убей не понимаю.

нужно менять значение - использовать глобальную переменную.
Не нужно - константу.

А использовать константу, и жаловаться, что для записи в нее приходится извращаться - странно же, не?
...
Рейтинг: 0 / 0
Статические переменные
    #40066029
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
А использовать константу, и жаловаться, что для записи в нее приходится извращаться - странно же, не?


Удобно бывает объявить глобальную константу, записать в неё вычисляемое значение в секции Initialization и после этого никто больше не может его случайно изменить. Это я про извращения, а не про WRITEABLE.
...
Рейтинг: 0 / 0
Статические переменные
    #40066073
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
хоть убей не понимаю.

нужно менять значение - использовать глобальную переменную.
Не нужно - константу.
Переменная нужна в одной функции. Больше она нигде не нужна. Логично ее объявить по месту использования. Это сильно облегчает последующий анализ кода и убирает возможность того, что в эту переменную будет происходить запись из другого места.

А то, что концепция статических переменных в Делфи реализовано через механизм типизированных констант, так это вопрос к Борланду и Эмбаркадере
...
Рейтинг: 0 / 0
Статические переменные
    #40066075
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Удобно бывает объявить глобальную константу, записать в неё вычисляемое значение в секции Initialization и после этого никто больше не может его случайно изменить
Нет. Если она объявлена как WRITEABLE, то изменять ее можно из любого места, где она видна. А если нет, то и в секции initialization ты ее не проинициализируешь
...
Рейтинг: 0 / 0
Статические переменные
    #40066077
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
А если нет, то и в секции initialization ты ее не проинициализируешь

Код: pascal
1.
PInteger(@CIdx)^ := 10;
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Статические переменные
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]