Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Типизированные константы

Автор: sheka 19.11.2010 0:29

const
y0: integer = 20;
//...
y0 := Image1.Height - y0;
//...

[Error] Unit1.pas(103): Left side cannot be assigned to
ыыы... Чего то я вааще в шоке smile.gif

Автор: Client 19.11.2010 0:50

const
y: Integer = 20;
begin
y := 55;
end;
Точно так же... Константу меняешь angry.gif

Автор: volvo 19.11.2010 0:52

Это, а {$J+} не пробовали? Или Assignable typed constants в настройках?

Автор: sheka 19.11.2010 2:05

Оно!

А че эт так? В каких целях эта директива не была включена "автоматически"?

Автор: Unconnected 19.11.2010 2:19

Может, от того, что константы как бы синонимы слова "постоянный"..)

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

Автор: volvo 19.11.2010 2:38

Цитата
В каких целях эта директива не была включена "автоматически"?
Эта директива вообще существует только в целях совместимости со старыми версиями Паскаля/Дельфи:
Цитата
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.

( отсюда: http://docwiki.embarcadero.com/RADStudio/en/Writeable_typed_constants_%28Delphi%29 )


Автор: Гость 19.11.2010 2:48

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

1. Чтобы не инициализировать.
2. Чтобы локальная переменная, что внутри функции, инициализировалась только при старте программы и сохраняла значение между вызовами функции.

Автор: sheka 19.11.2010 3:04

Т.е. типизированные константы лучше не использовать..
А как тогда задавать начальные значения?
В основной пограмме после бегина? smile.gif

ЗЫ: все равно не могу понять что плохого это может представлять для программы.

Автор: Unconnected 19.11.2010 3:59

var x:integer=10; , или я что-то не понял?)

Автор: sheka 19.11.2010 5:51

Прикол.. ФП тоже разрешает такое делать..Еще на ТП надо попробовать)

Автор: volvo 19.11.2010 5:58

Можешь не пробовать. Это расширение Object Pascal-я. В Турбо такого не было.

Хочешь ложку дегтя к переменным со стартовым значением? smile.gif Попробуй инициализировать локальную переменную:

procedure p;
var v: integer = 0;
begin
// ...
end;

, как думаешь, что получится?

Автор: sheka 19.11.2010 6:08

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


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

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

Добавлено через 2 мин.
А-а-а! Вроде дошло! Ведь до того, как дойдет время до выполнения процедуры и инициализации переменной, значение 0 надо УЖЕ где-то хранить, да?

Автор: volvo 19.11.2010 8:05

Цитата
И что делать?
Глобальные переменные инициализировать при описании, локальные - в теле вложенного блока. И не в коем случае не пытаться заменить слово Var на Const только для того, чтобы программа откомпилировалась. Не забывай, типизированная константа сохраняет значение при повторном входе в функцию (за счет того, что хранится не в стеке, а в сегменте данных), переменная - нет.

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

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

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

Автор: TarasBer 19.11.2010 14:13

> А как тогда задавать начальные значения?

В дельфе меняй типизированные константы и не парься. Они только называются константами, слова другого не подобрали.

Автор: Archon 19.11.2010 14:21

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

Автор: TarasBer 19.11.2010 14:45

Меня другое в дельфе напрягает


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


Автор: volvo 19.11.2010 18:48

Цитата
А как тогда статические переменные делать в процедурах?
Делай не в процедурах, а в методах класса. А "статические переменные" теперь - это переменные с классовой областью видимости, которые инициализируются в конструкторе. Ибо 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