IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Типизированные константы, Дельфи
сообщение
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


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

[Error] Unit1.pas(103): Left side cannot be assigned to
ыыы... Чего то я вааще в шоке smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


const
y: Integer = 20;
begin
y := 55;
end;
Точно так же... Константу меняешь angry.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Это, а {$J+} не пробовали? Или Assignable typed constants в настройках?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Оно!

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

Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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

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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






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

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


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


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

ЗЫ: все равно не могу понять что плохого это может представлять для программы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Прикол.. ФП тоже разрешает такое делать..Еще на ТП надо попробовать)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






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

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

, как думаешь, что получится?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


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


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

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

Добавлено через 2 мин.
А-а-а! Вроде дошло! Ведь до того, как дойдет время до выполнения процедуры и инициализации переменной, значение 0 надо УЖЕ где-то хранить, да?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






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

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

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

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


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


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


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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


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



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






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

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.11.2020 15:48
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name