SSerge писал(а):1. Потому что переменная счетчик не должна использоваться для других целей. По описанию языка, ее значение вне тела оператора цикла не определено, а здесь вы пытаетесь ее еще и инициализировать на уровне компиляции.
FPC 2.6.4 - копилирует без проблем:
Код: Выделить всё
procedure Test;
var
i: integer = 0;
begin
for i:=0 to 100 do
begin
write(i);
{do something}
end;
end;
begin
Test;
end.
есть мнение, что Kitayets, имел в виду.
Код: Выделить всё
var
i: integer = 0;
begin
for i:=0 to 100 do
begin
write(i);
{do something}
end;
end.
Обращаю внимание на последний end с точкою, где i становится глобальной инициалириованной переменной.
Такие перменные загружаются в память при запуске программы. И там же остаются на время исполнения. (см asm с .data секцией)
Хотя цикл for работает с переменной расположенной в регистре. (Что кстати, технически гарантирует что никто другой кроме самого цикла for не сможет поменять значение переменной).
Если есть острая необходимость использовать глобальную инициализированную перменную в цикле, то стоит изменить цикл на while (repeat), либо чётко обозначить место присваивания (чтения?) значения глобальной переменной.
Примерно так:
Код: Выделить всё
var
i: integer = 0;
j: integer;
begin
for j:=0 to 100 do
begin
write(i);
i:=j;
{do something}
end;
end.
Добавлено спустя 9 минут 54 секунды:Хотя я нихрена не прав насчёт любви цика-for к регистровым переменным, и можно добиться забавный результатов, если писать такой вот, сомнительной ценности, код:
Код: Выделить всё
program main;
uses withglobalvar;
var
i: integer;
procedure AssingVal;
begin
i := 5;
end;
begin
AssingVal;
for ki:=0 to 100 do
begin
write(ki);
Modify;
{do something}
end;
end.
---
unit withglobalvar;
interface
var
ki : integer;
procedure Modify;
implementation
procedure Modify;
begin
ki:=4;
end;
initialization
ki:=6;
end.
Надеюсь, за 70 лет сущствования информатика научит программистов не эксплуатировать глобальные переменные для низменных нужд, вроде циклов.