Error: Illegal counter variable

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Zeff
Beiträge: 7
Registriert: Fr 12. Feb 2016, 21:44
OS, Lazarus, FPC: Winux (Lazarus 2.2.6, FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Rheinbach

Error: Illegal counter variable

Beitrag von Zeff »

Gegeben ist eine Konsolenanwendung.
Wenn ich eine Laufzeitvariable für eine For-Schleife während der Deklaration initialisiere, meckert mich der Compiler mit folgender Meldung an: Error: Illegal counter variable.

Hier der Testcode:

Code: Alles auswählen

Program TestCount;
Var l : LongInt = 0;
    z : LongInt = 0;
Begin
  For l := 1 to 10 do Writeln('z = ',z + l); //<-FPC meckert diese Zeile an.
End.
Wenn man die Initialisierung weglässt (l : LongInt), die ja eigentlich auch nicht notwendig ist, funktioniert es. Wenn man lokal in einer Procedure oder Function initialisiert,
funktioniert es ebenfalls. Das unterschiedliche Verhalten ist schon merkwürdig.

Hier mit lokaler Initialisierung klappt es:

Code: Alles auswählen

Program TestCount;
  Procedure DoIt;
  Var l : LongInt = 0;
      z : LongInt = 0;
  Begin
    For l := 1 to 10 do Writeln('z = ',z + l);
  End;
Begin
  DoIt;
End.
Ist das nun ein Fehler des Compilers, oder einer zwischen meinen Ohren?

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Error: Illegal counter variable

Beitrag von baumina »

Delphi XE liefert in beiden Fällen die Kompiler-Fehlermeldung : E1019 FOR-Schleifenvariable muss eine einfache lokale Variable sein
.

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Error: Illegal counter variable

Beitrag von Mathias »

Könnte dies ein Bug sein ?
Das sollte dem Compiler eigentlich nicht weh tun, wen der Variable am Anfang schon ein Wert zugewiessen wird.

Dafür wird aber solch ein Mist ohne Fehler kompiliert.

Code: Alles auswählen

program Project1;
var
  i: integer;
 
  procedure test;
  begin
    for i := 0 to 100 do begin
      WriteLn('x');
      if i = 10 then begin
        test;
      end;
    end;
  end;
 
begin
  test;
end.  
Auch wen man mehrere Thread einsetzen würde und dabei test mehrmals aufgerufen wird, würde es Probleme geben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten