Как в Delphi исправить ошибку "for loop control variable must be simple local variable"?

Рейтинг: 1Ответов: 3Опубликовано: 11.04.2023

Ошибка:

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)+'');

Ответы

▲ 2
for x := 0.8 to 2 do;

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

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

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

  • либо целочисленным (Integer и ему подобные типы),
  • либо перечислимым (enumerated),
  • либо символьным (Char и подобные),
  • либо или Boolean.
▲ 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.

▲ 0

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

  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)+'');