Delphi ошибка for loop control variable must be simple local variable

Ошибка:

for loop control variable must be simple local variable delphi

Код:

var
  y,a,x,xn: real;
  i:byte;
begin
  a:=strtofloat(edit1.Text);
  x:=strtofloat(edit2.Text);
  x:=xn+x;
  memo1.lines.add('x       y');
  for x := 0.8 to 2 do;
  begin
    if x<1.3 then
      y:=pi*sqr(x)-7/sqr(x)
    else if x=1.3 then
      y:=a*power(x,3)+7*sqrt(x)
    else if x>1.3 then
      y:=ln(x+7*sqrt(x));
    memo1.lines.add(floattostrf(x,fffixed,8,3)+''+floattostrf(y,fffixed,8,3)+'');

Kromster's user avatar

Kromster

13.6k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 11 апр в 19:41

Anna's user avatar

1

for x := 0.8 to 2 do;

К сожалению, текст ошибки не совсем полезен. На самом деле приведенный код с циклом for ошибочен по 2 моментам:

1 — не нужно ставить ; после do.

2 — итератор (x) должен быть счётным (ordinal), т.е.:

  • либо целочисленным (Integer и ему подобные типы),
  • либо перечислимым (enumerated),
  • либо символьным (Char и подобные),
  • либо или Boolean.

ответ дан 12 апр в 5:27

Kromster's user avatar

KromsterKromster

13.6k12 золотых знаков43 серебряных знака72 бронзовых знака

0

Сравнение не должно быть с переменной x, а с параметром цикла i, то есть вместо «if x = 1.3» нужно написать «if i = 13».
Переменную цикла i следует объявить как integer (знаковой).
Желательно избавиться от переменной real и использовать float или double вместо нее.

var
a, x, xn, y: Single;
i: Integer;
begin
  a := StrToFloat(Edit1.Text);
  xn := StrToFloat(Edit2.Text);
  xn := xn + x;
  Memo1.Lines.Add('x y');
  for i := 8 to 20 do
  begin
     x := i / 10.0;
     if i = 13 then
        y := a * Power(x, 3) + 7 * Sqrt(x)
     else if x < 1.3 then
        y := Pi * Sqr(x) - 7 / Sqr(x)
     else
        y := Ln(x + 7 * Sqrt(x));
    Memo1.Lines.Add(FloatToStrF(x, fffixed, 8, 3) + ' ' + FloatToStrF(y, fffixed, 8, 3));
  end;
end;

Здесь переменная цикла i объявлена как integer, переменная real заменена на float, а сравнение производится с параметром цикла i.

MBo's user avatar

MBo

48.5k1 золотой знак17 серебряных знаков40 бронзовых знаков

ответ дан 11 апр в 19:50

FIP's user avatar

FIPFIP

873 бронзовых знака

5

Предполагаю что надо сделать примерно так:

  x := 0.8;
  while x < 2 do
  begin
    x := x + 0.1; //это поместить в конец цикла
    if x<1.3 then
      y:=pi*sqr(x)-7/sqr(x)
    else if x=1.3 then
      y:=a*power(x,3)+7*sqrt(x)
    else if x>1.3 then
      y:=ln(x+7*sqrt(x));
    memo1.lines.add(floattostrf(x,fffixed,8,3)+''+floattostrf(y,fffixed,8,3)+'');

ответ дан 21 апр в 8:32

destroyer86's user avatar

0

илья1995

4 / 4 / 3

Регистрация: 17.10.2011

Сообщений: 169

1

24.05.2012, 23:43. Показов 25061. Ответов 9

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

программа ищет средне арифмитическое матрицы и выводит на экран числа меньше него

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
unit Unit1KI;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Grids;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    StringGrid1: TStringGrid;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
  type mat=array[1..100,1..100] of integer;
 var i,j,sum,h:integer;
     p:mat;
     sr:Integer;
procedure TForm1.Button2Click(Sender: TObject);
begin
 
close;
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 
randomize;
 for i:=1 to 100 do  begin
 for j:=1 to 100 do
    begin
     p[i,j]:=random(41)-10;
     stringgrid1.Cells[j-1,i-1]:=inttostr(p[i,j]);
    end;
           end;
          
 
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
StringGrid1.ColCount := SpinEdit1.Value;
end;
 
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
StringGrid1.RowCount := SpinEdit2.Value;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.MinValue :=-1;
SpinEdit1.MaxValue := 10;
SpinEdit2.MinValue :=-1;
SpinEdit2.MaxValue := 10;
StringGrid1.ColCount := SpinEdit1.Value;
StringGrid1.RowCount := SpinEdit2.Value;
 
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin h:=i*j;
sum:=sum+p[i,j];
sr:=sum/h;
showmessage('ñðåäíåå àðèôìèòè÷åñêîå= '+floattostr(sr));
end;
 
end.

компилятор выдает ошибку:For loop control variable must be simple local variable
вот на этой строке:

Delphi
1
sr:=sum/h;

в чем ошибка?



0



13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

24.05.2012, 23:55

2

Цитата
Сообщение от илья1995
Посмотреть сообщение

компилятор выдает ошибку:For loop control variable must be simple local variable

Переменная, которая участвует в заголовке цикла for в качестве счётчика, должна быть объявлена внутри той процедуры, где расположен этот цикл for.



1



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32593 / 21062 / 8134

Регистрация: 22.10.2011

Сообщений: 36,335

Записей в блоге: 8

24.05.2012, 23:57

3

Это предупреждение, не ошибка. Исправь:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.Button1Click(Sender: TObject);
var i, j : Integer; // <--- Здесь должны быть описаны переменные !!!
begin
   randomize;
   for i:=1 to 100 do  begin
      for j:=1 to 100 do
      begin
         p[i,j]:=random(41)-10;
         stringgrid1.Cells[j-1,i-1]:=inttostr(p[i,j]);
      end;
   end;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin h:=i*j; // А здесь, интересно, какой мусор у тебя используется для подсчетов? 
//  Откуда значения в i, j берутся? Исправляй, так не должно быть.
sum:=sum+p[i,j];
sr:=sum/h;
showmessage('среднее арифмитическое= '+floattostr(sr));
end;

Ошибка у тебя в другом: в строке sr:=sum/h; ты пытаешься результат деления затолкать в целочисленную переменную. Это невозможно. Результат деления — всегда вещественный. Или меняй описание переменной sr, или дели через DIV, нацело…



2



илья1995

4 / 4 / 3

Регистрация: 17.10.2011

Сообщений: 169

25.05.2012, 00:02

 [ТС]

4

sr поменял на real заработала спасибо

Delphi
1
begin h:=i*j; // А здесь, интересно, какой мусор у тебя используется для подсчетов?

тут я пытаюсь посчитать количество ячеек
так присваивается значение?

Delphi
1
2
i:=StrToInt(SpinEdit1.caption);
 j:=StrToInt(SpinEdit2.caption);



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32593 / 21062 / 8134

Регистрация: 22.10.2011

Сообщений: 36,335

Записей в блоге: 8

25.05.2012, 00:17

5

Цитата
Сообщение от илья1995
Посмотреть сообщение

тут я пытаюсь посчитать количество ячеек

Неправильно пытаешься Попробуй сразу после запуска программы нажать на Button3. Как думаешь, что будет? Откуда возьмутся значения в I и J? Думаешь, они будут = 0? Тебе же хуже: во-первых, это вылет за границы (массив P индексируется с 1 до 100 в обоих измерениях), да еще и деление на 0 огребешь. Вот точно так же и после того, как цикл закончился, к этим переменным обращаться нельзя (даже если они будут описаны глобально). Тебе никто не гарантировал, что значение в i и j будет = 100, как ты ожидаешь



0



4 / 4 / 3

Регистрация: 17.10.2011

Сообщений: 169

25.05.2012, 00:38

 [ТС]

6

Цитата
Сообщение от UI
Посмотреть сообщение

Неправильно пытаешься Попробуй сразу после запуска программы нажать на Button3. Как думаешь, что будет? Откуда возьмутся значения в I и J? Думаешь, они будут = 0? Тебе же хуже: во-первых, это вылет за границы (массив P индексируется с 1 до 100 в обоих измерениях), да еще и деление на 0 огребешь. Вот точно так же и после того, как цикл закончился, к этим переменным обращаться нельзя (даже если они будут описаны глобально). Тебе никто не гарантировал, что значение в i и j будет = 100, как ты ожидаешь

так я ине жду что в i и j будет 100 я же количество столбцов и количество строк увеличиваю двумя spinedita-ми я хочу с них значение взять что бы узнать количество ячеек в матрице

Добавлено через 14 минут
как задать чтобы например в матрице количество столбцов это было значение находящиеся в spiedit1
а количество строчек в spiedit2 а то у меня получается матрица 100 на 100 заполняется а в стрингриде вижу только часть ее?



0



antikiler_

1085 / 571 / 79

Регистрация: 07.04.2011

Сообщений: 971

Записей в блоге: 2

25.05.2012, 02:53

7

Delphi
1
2
3
4
5
6
for i:=1 to SpinEdit2.Value do  
  for j:=1 to SpinEdit1.Value do
     begin
         p[i,j]:=random(41)-10;
         stringgrid1.Cells[j-1,i-1]:=inttostr(p[i,j]);
      end;



1



илья1995

4 / 4 / 3

Регистрация: 17.10.2011

Сообщений: 169

28.05.2012, 20:22

 [ТС]

8

Delphi
1
showmessage('среднее арифмитическое= '+floattostr(sr));

незнаешь что не так среднее арифметическое считается правильно но если много раз жмешь на кнопку подсчитать то в диалоговом окне бред пишется и нужно пере запускать программу
т.е матрицу я не меняю и не перезаполняю а тока жму много раз на кнопку посчитать и там цифры не знаю откуда берутся большие

Добавлено через 1 час 1 минуту

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  se1,se2:integer;
begin
  sr:=0;
se1:=  spinEdit1.Value;
se2:=  SpinEdit2.Value ;
h:=se1*se2;
sum:=sum+p[i,j];
sr:=sum/h;
begin
k:=0;
 for i:=1 to SpinEdit2.Value do
  for j:=1 to SpinEdit1.Value do
if p[i,j]<sr then k:=k+1;
showmessage('Ñðåäíåå çàí÷åíèå: '+FormatFloat('0.00',sr)+#13+'Êîë-âî ÷èñåë ìåíüøå '+FormatFloat('0.00',sr)+' - '+IntToStr(k));
 end;
end;

вот кусок который считает среднее арифметическое матрицы и выводит количество элементов меньше среднего вроде все написано правильно а в ответ какой то бред выводит



0



1085 / 571 / 79

Регистрация: 07.04.2011

Сообщений: 971

Записей в блоге: 2

28.05.2012, 21:56

9

Цитата
Сообщение от илья1995
Посмотреть сообщение

среднее арифметическое считается правильно но если много раз жмешь на кнопку подсчитать то в диалоговом окне бред пишется и нужно пере запускать программу
т.е матрицу я не меняю и не перезаполняю а тока жму много раз на кнопку посчитать и там цифры не знаю откуда берутся большие

Наверно потому что, переменная Sum объявлена у тебя глобальной, и в ней сохраняется последний результат, который при последующем подсчете прибавляется к текущему. Поэтому ее нужно перед подсчетами обнулять, как ты сделал с переменной sr



0



илья1995

4 / 4 / 3

Регистрация: 17.10.2011

Сообщений: 169

28.05.2012, 22:03

 [ТС]

10

обнулил все равно нули выводит
вот весь код может че неправильно

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
unit Unit1KI;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Grids;
 
type
  TForm1 = class(TForm)
    SpinEdit1: TSpinEdit;
    StringGrid1: TStringGrid;
    SpinEdit2: TSpinEdit;
    btn1: TButton;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
type mat=array[1..1,1..1] of integer;
var
 i,j,sum,n,m,k,h:integer;
     p:mat;
     sr:double;
 
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.MinValue :=-1;
SpinEdit1.MaxValue := 10;
SpinEdit2.MinValue :=1;
SpinEdit2.MaxValue := 10;
StringGrid1.ColCount := SpinEdit1.Value;
StringGrid1.RowCount := SpinEdit2.Value;
 
end;
 
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
StringGrid1.colCount := SpinEdit1.Value;
if SpinEdit1.Value > 5 then
 StringGrid1.Width := StringGrid1.Width + 36;
 
 
end;
 
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
StringGrid1.RowCount := SpinEdit2.Value;
if SpinEdit2.Value > 5 then
 StringGrid1.height := StringGrid1.height + 36;
 
end;
 
procedure TForm1.btn1Click(Sender: TObject);
 
begin
randomize;
 for i:=1 to SpinEdit2.Value do
  for j:=1 to SpinEdit1.Value do
     begin
         p[i,j]:=random(41)-10;
         stringgrid1.Cells[j-1,i-1]:=inttostr(p[i,j]);
      end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
  se1,se2:integer;
begin
  sr:=0;
  sum:=0;
se1:=  spinEdit1.Value;
se2:=  SpinEdit2.Value ;
h:=se1*se2;
sum:=sum+p[i,j];
sr:=sum/h;
begin
k:=0;
 for i:=1 to SpinEdit2.Value do
  for j:=1 to SpinEdit1.Value do
if p[i,j]<sr then k:=k+1;
showmessage('Ñðåäíåå çàí÷åíèå: '+FormatFloat('0.00',sr)+#13+'Êîë-âî ÷èñåë ìåíüøå '+FormatFloat('0.00',sr)+' - '+IntToStr(k));
 end;
end;
 
end.



0



Типов сообщений компилятора — более двухсот. Рассмотрим перечень наиболее встречающихся сообщений класса Error

  • 0. <Что-то1> expected but <Что-то2> found. Обычно это сообщение возникает при синтаксической ошибке.Например,в случае небаланса скобок,компилятор сообщит: ‘)’ expected but ‘;’ found (вместо ожидавшейся скобки найдена запятая).

    Компилятор часто сообщает, что ‘end’ ожидается,например:x:= 5,7; здесь неуместен разделитель-запятая, а сообщается про end. (‘END’ expected but ‘,’ found)

  • 1. <Имя> is not a type identifier. Данное <Имя> не является именем типа.
  • 2. ‘;’ not allowed before ‘Else’. Перед else нельзя ставить точку с запятой
  • 3. Abstract method must be virtual or dynamic. Абстрактный метод должен быть виртуальным или динамическим.
  • 4. Ambiguous overloaded call to <Имя блока>. Компилятор не может однозначно выбрать перегружаемый блок. Измените параметр.
  • 5. Array type required. Ошибка возникает в случаях, когда в индексе элемента массива указано больше уровней, чем предусмотрено описанием, и если массив не описан. Например, после объявления двумерного массива х или простой переменной х ошибочно записывают элемент х[2,1,1] (в нем показано три измерения).
  • 6. Assignment to FOR-loop variable <Имя>. Присваивание значения параметру FOR-цикла в теле цикла.

    Например, вследствие описки дважды используется имя i в кратном цикле:

    For i:= 1 to n do For i:= 1 to m do ...
    
  • 7. Break or Continue outside of loop. Break или Continue — не в цикле.
  • 8. Cannot initialize local variables. Локальные переменные запрещено инициализировать (задавать им значения при описании).
  • 9. Cannot assign to/read a read-only/write-only property. Присвоение значения свойству read/only и чтение свойства write/only запрещены.
  • 10. Constant expression expected.В этом месте должна стоять константа или константное выражение, например константа выбора в структуре Case.
  • 11. Constant expression violates subrange bounds. Выход значения константы из диапазона. Контроль не полон. Например, «сойдет с рук» присваивание x:=3000000000, где х имеет тип integer, но начение х будет искажено.
  • 12. Constant or type identifier expected. Требуется имя типа или тип-диапазон.
  • 13. Could not compile used unit <Имя>. Компиляция присоединенного модуля <Имя> невозможна.
  • 14. Data type too large. Тип определяет структуру размером более 2 Гбайт; это слишком много.
  • 15. Declaration expected but <Что-то> found. Пропущено описание или оператор.
  • 16. Declaration of <Имя> differs from previous declarations… Данный заголовок блока не соответствует упреждающему объявлению блока.
  • 17. Default parameter <Имя> must be by-value or constant. Необязательный параметр (со значением по умолчанию) не должен вызываться по ссылке.
  • 18. Expression expected. В этом месте программы должно стоять выражение.
  • 19. Expression too complicated. Выражение излишне сложно для компиляции.
  • 20. File type not allowed here. В этом месте или в этой роли файловую переменную нельзя использовать. Например, она не может быть формальным параметром-значением.
  • 21. For loop control variable must be simple local variable. Параметр цикла должен быть простой локальной (описанной в этом же блоке) переменной.
  • 22. For loop control variable must have ordinal type. Параметр цикла должен иметь порядковый тип.Вещественный тип запрещен.
  • 23. Function needs result type. В заголовке функции надо указывать тип ее результата.
  • 24. Identifier expected but <Что-то> found. В этом месте должно стоять имя. Например, пропущено имя функции после Function.
  • 25. Identifier redeclared <Имя>.<Имя> описано повторно, но в пределах блока имя можно описать лишь раз. Проверьте, не обозначена ли локальная переменная тем же именем, что и формальный параметр блока.
  • 26. Illegal character in input file <знак>. Запретный знак, например «русская» буква, либо вы оставили скобку }, убрав открывающую скобку {.
  • 27. Illegal type in Read/Readln (Write/Writeln) statement. Элемент запрещенного типа в списке ввода/вывода.
  • 28. Incompatible types <указание типов>. Несоответствие типов по присваиванию или типов операндов одной операции. Сообщение выдается и при неверном использовании структур. Например, z — запись, ошибочно записано присваивание z:= 0 (работать надо с полями записи).
  • 29. Invalid function result type. Недопустимый тип результата функции.
  • 30. Label already defined: <Метка>. <Метка> уже помечает другой оператор.
  • 31. Left side cannot be assigned to. He может быть такой левой части в присваивании. Примеры: попытка присвоить значение файловой переменной, присвоение значения формальному параметру-константе.
  • 32. Line too long. В строке программного текста больше 255 знаков.
  • 33. Low bound exceeds high bound. Нижняя граница превышает верхнюю.
  • 34. Missing operator or semicolon.Пропуск операции (например перед скобкой) или пропуск точки с запятой. При пропуске ‘;’ маркер ошибки стоит на очередном предложении (объявлении или операторе).
  • 35. Missing parameter type. He указан тип формального параметра-значения или параметра процедурного типа.
  • 36. Not enough actual parameters. He хватает фактических параметров.
  • 37. Need to specify at least one dimension … Нужно задавать в операторе SetLength хотя бы один размер динамического массива.
  • 38. Number of elements differs from declaration. Число элементов в структурной константе не соответствует ее описанию.
  • 39. Operator not applicable to this operand type. Операция не применима к операндам данного типа. Например: ‘А’ or ‘В’; ‘Text1’* ‘Text2’.
  • 40. Order of fields in record constant differs from declaration. Порядок полей в записи-константе не соответствует описанию записи.
  • 41. Ordinal type required. Требуется порядковый тип (например, в индексе).
  • 42. Out of memory. Компилятору не хватает памяти.
  • 43. Statement expected but <Что-то> found. В этом месте должен стоять оператор. Сообщение выдается во всех случаях, когда в тело блока или секцию инициализации ошибочно помещают описание (<Что-то>). Ошибочная форма обращения к процедуре Procedure <Имя> или к функции Function <Имя> также вызывает сообщение.
  • 44. Sets may have at most 256 elements. Множество (тип Set) не может содержать более 256 элементов.
  • 45. Slice standard function only allowed as open array argument. Функцию Slice можно использовать лишь как фактический параметр
  • 46. Statement not allowed in interface part. Предложения в секции интерфейса программного модуля недопустимы.
  • 47. Syntax error in real number. Синтаксическая ошибка в записи числа вещственного типа.
  • 48. There is no overload version of <Имя> that can be called with these arguments.Не предусмотрен перегружаемый блок <Имя>, который мог бы вызываться с таким аргументом. Пример: IntToStr(x), где х – выражение вещественного типа.
  • 49. Too many actual parameters. Фактических параметров больше, чем формальных.
  • 50. Type actual and formal var parameters must be identical. Тип фактического параметра должен быть идентичен типу формального параметра-переменной.
  • 51. Type of expression must be <Тип>. Выражение должно быть указанного типа. Например,после While и Until должно стоять логическое выражение.
  • 52. Undeclared identifier: <Имя>.Не описано <Имя>. Проверьте есть ли описание в нужном месте,нет ли описок в имени. Если указано имя компонента формы, проверьте,поместили ли компонент на данную форму.
  • 53. Unexpected end of file in comment started on line <N>. Неожиданный конец файла при незавершенном комментарии, начало комментария — в строке N.
  • 54. Unit name mismatch: <Имя>. Имя модуля ошибочно.
  • 55. Unsatisfied forward or external declaration <Имя>. Отсутствует описание блока, объявление которого было дано (заголовок в интерфейсе или в описании объектного типа, либо упреждающее описание).
  • 56. Unterminate string. He закрыта апострофом строка-константа типа string.

Рассмотрим также некоторые сообщения классов warning и hint.

  • Return value of function <Имя> might be undefined. В теле функции нет присваивания ее результата.
  • Variable <Имя> might not have been initialized. Указывает имя переменой, которой не задали значения.
  • For-Loop variable <Имя> may be undefined after loop. Попытка использования значения параметра For-цикла после завершения этого цикла.
  • Text after final ‘END.’ ignored by compiler. Текст, идущий за конечной строкой модуля, игнорируется компилятором.
  • Variable <Имя> is declared but never used in <Имя блока>. Обращает внимание на переменную <Имя>, описанную,но не нашедшую применения.
  • Value assigned to <Имя> never used. Хотя бы одно значение переменной <Имя> никак не использовано.

Несколько рекомендаций

Сосредотачивайтесь на первом сообщении компилятора. Исправление хотя бы одной ошибки и повторная компиляция может значительно уменьшить число сообщений об ошибках,поэтому не упорствуйте, стремясь понять сразу причину каждого сообщения.

Не удаляйте прежний вариант кода,пока не убедитесь,что ошибка устранена. Лучше на время закомментировать код,заключив его в скобки: { код }

Компилятор не анализирует, как будет выполняться программа, поэтому выход значения индекса из диапазона выявляет только если индекс задан константным выражением. Деление на ноль вообще пропускается, кроме оператора div, в случае если делитель — константное выражение.

Go Up to Error and Warning Messages (Delphi)

This error message is given when the control variable of a for statement is not a simple variable (but a component of a record, for instance), or if it is not local to the procedure containing the for statement.

For backward compatibility reasons, it is legal to use a global variable as the control variable — the compiler gives a warning in this case. Note that using a local variable will also generate more efficient code.

program Produce;

var
  I: Integer;
  A: array [0..9] of Integer;

procedure Init;
begin
  for I := Low(A) to High(a) do  (*<-- Warning given here*)
    A[I] := 0;
end;

begin
  Init;
end.
	program Solve;
var
  A: array [0..9] of Integer;

procedure Init;
var
  I: Integer;
begin
  for I := Low(A) to High(a) do
    A[I] := 0;
end;

begin
  Init;
end.

Вот такая ошибочка… ‘for loop control variable must be simple local variable’ :evil: посмотрите код, что неправильно там? чем переменная для цикла не подходит? она задается перед началом цикла, ничего не понимаю, в чем ошибка… (программа после компилирования не выполняет цикл, загружает проц на 100% и висит…) :cry:

Код: Выделить всё

var
  Form2: TForm2;
  i:integer; // в какую сторону перемещать
  m1,m:integer; // кол-во тактов для перемещения

Код: Выделить всё

procedure TForm2.Timer1Timer(Sender: TObject);
begin
randomize;
i := random(0-3); { делаем выбор, в какую сторону премещать:
                        i = 0 - влево
                        i = 1 - вправо
                        i = 2 - вниз
                        i = 3 - вверх }
randomize;
m := random(1-100); // выбираем кол-во тактов для перемещения
for m1 := 1 to m do begin // перемещаем заданное кол-во раз
if ((not(image1.Left>235))or(not(image1.Left<0)))and((not(image1.Top<0))or(not(image1.top>185)))then begin
case i of
        0: image1.Left := image1.Left + 1;
        1: image1.Left := image1.Left - 1;
        2: image1.Top := image1.Top - 1;
        3: image1.Top := image1.Top + 1;
end;
                                                                                                     end;
                    end;
end;

это я пытался сделать свободное движение объекта с отражением от границ экрана… может кто подскажет другой способ? :roll:

Даже самое длинное путешествие начинается с первого шага.

  • Delphi как убрать сообщение об ошибке
  • Delphi webbrowser ошибка сценария
  • Delphi try except код ошибки
  • Delphi try except вывести ошибку
  • Delphi getlasterror текст ошибки