Помощь - Поиск - Пользователи - Календарь
Полная версия: Типизированные константы
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
sheka
const
y0: integer = 20;
//...
y0 := Image1.Height - y0;
//...

[Error] Unit1.pas(103): Left side cannot be assigned to
ыыы... Чего то я вааще в шоке smile.gif
Client
const
y: Integer = 20;
begin
y := 55;
end;
Точно так же... Константу меняешь angry.gif
volvo
Это, а {$J+} не пробовали? Или Assignable typed constants в настройках?
sheka
Оно!

А че эт так? В каких целях эта директива не была включена "автоматически"?
Unconnected
Может, от того, что константы как бы синонимы слова "постоянный"..)

Вообще, никогда не понимал, почему бы не сделать то же самое, только в секции var )
volvo
Цитата
В каких целях эта директива не была включена "автоматически"?
Эта директива вообще существует только в целях совместимости со старыми версиями Паскаля/Дельфи:
Цитата
In early versions of Delphi and Object Pascal, typed constants were always writeable, corresponding to the {$J+} state. Old source code that uses writeable typed constants must be compiled in the {$J+} state, but for new applications it is recommended that you use initialized variables and compile your code in the {$J-} state.

( отсюда: Writeable typed constants (Delphi) )

Гость
> Вообще, никогда не понимал, почему бы не сделать то же самое, только в секции var )

1. Чтобы не инициализировать.
2. Чтобы локальная переменная, что внутри функции, инициализировалась только при старте программы и сохраняла значение между вызовами функции.
sheka
Т.е. типизированные константы лучше не использовать..
А как тогда задавать начальные значения?
В основной пограмме после бегина? smile.gif

ЗЫ: все равно не могу понять что плохого это может представлять для программы.
Unconnected
var x:integer=10; , или я что-то не понял?)
sheka
Прикол.. ФП тоже разрешает такое делать..Еще на ТП надо попробовать)
volvo
Можешь не пробовать. Это расширение Object Pascal-я. В Турбо такого не было.

Хочешь ложку дегтя к переменным со стартовым значением? smile.gif Попробуй инициализировать локальную переменную:
procedure p;
var v: integer = 0;
begin
// ...
end;

, как думаешь, что получится?
sheka
Мне кажется, что компилятор скажет обо мне то, что он давно уже думал smile.gif
Типа что в подпрограмме в описании переменных нельзя инициализировать локальную переменную, т.к. нужно сразу выделять память, хотя... Хотя почему бы это не сделать потом?.. Ну это догадки smile.gif Сейчас попробую.


Добавлено через 4 мин.
Точно! Дык я угадал? (хотя, вроде, я где-то это только что прочитал..не помню).

И что делать? Константы, хоть и не строго, но запретили. Инициализировать переменную нельзя..

Добавлено через 2 мин.
А-а-а! Вроде дошло! Ведь до того, как дойдет время до выполнения процедуры и инициализации переменной, значение 0 надо УЖЕ где-то хранить, да?
volvo
Цитата
И что делать?
Глобальные переменные инициализировать при описании, локальные - в теле вложенного блока. И не в коем случае не пытаться заменить слово Var на Const только для того, чтобы программа откомпилировалась. Не забывай, типизированная константа сохраняет значение при повторном входе в функцию (за счет того, что хранится не в стеке, а в сегменте данных), переменная - нет.

Цитата
Хотя почему бы это не сделать потом?..
Не поверишь smile.gif Из-за того, что язык расширяется, "потому что левая пятка разработчика так захотела". Захотел Борланд сделать константу с описанием типа - сделал (а не было ее в стандартном Паскале, там были только обычные, настоящие, константы). Захотел сделать инициализацию переменной при объявлении - сделал (и этого тоже в стандартном Паскале не было). Вот и наделали. Константа может изменять значение (уже интересно), но переменной значение присвоить нельзя (еще более интересно), если она только не описана глобально.

А между тем в более продуманных языках все нормально:

   procedure p is
V: Integer := 15;
C: constant Integer := 10;
begin
-- Изменяем сколько угодно значение переменной V, но никакими
-- уговорами нельзя заставить компилятор допустить изменение С
-- константа - значит константа...
end p;
TarasBer
> А как тогда задавать начальные значения?

В дельфе меняй типизированные константы и не парься. Они только называются константами, слова другого не подобрали.
Archon
Не знал, что в Делфи по-умолчанию нельзя менять типизированные константы. А как тогда статические переменные делать в процедурах? В глобальную область выводить что-ли?
TarasBer
Меня другое в дельфе напрягает


const
T = Time; // время компиляции
A: integer = 5;
B = A; // и так нельзя
E = exp(1); // и так нельзя!!!!

volvo
Цитата
А как тогда статические переменные делать в процедурах?
Делай не в процедурах, а в методах класса. А "статические переменные" теперь - это переменные с классовой областью видимости, которые инициализируются в конструкторе. Ибо Object Pascal, и не фиг (по мнению разработчиков) сидеть на процедурном подходе.

А между тем Extended Pascal вполне умеет:
program tst;

procedure p;
var count: integer = 0; attribute(static);
begin
inc(count);
writeln('count = ', count);
end;

var i: integer;
begin
for i := 0 to 9 do
begin
p;
end;
end.

, что выдает:
Vlady@V877$ gpc tst.pp
Vlady@V877$ ./a.out
count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 7
count = 8
count = 9
count = 10

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.