Error: Variable identifier expected

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Tim
Beiträge: 21
Registriert: Fr 2. Dez 2016, 16:47

Error: Variable identifier expected

Beitrag von Tim »

Hi, ich hab ein kleines Problem...tausende Webseiten durchstöbert, aber nichts gefunden. Bei mir kommt der Error Variable Identifier expected beim Aufruf einer Prozedur und ich weiß nicht wie ich den lösen kann. Hier ist der Quellcode

Code: Alles auswählen

 
procedure insertion(var col:integer; SG:TStringGrid; Edt:TEdit);
begin
  IF Edt.Text='' then
     SG.cells[col,reihe]:=IntToStr(0)
  ELSE  SG.cells[col,reihe]:=Edt.Text;
end;
 
procedure TForm1.BtnInsertClick(Sender: TObject);
begin
  IF (reihe<=2) AND (zaehlen<=2) then       //Erste zwei Zeilen der schriftlichen
     begin
       insertion(1, SGschrift, EdtHJ1);
    end;
 


Und diese zwei Fehler bekomme ich:

Projekt kompilieren, Ziel: p_abi.exe: Exit code 1, Fehler: 1, Hinweise: 1
u_abi.pas(173,19) Error: Variable identifier expected
u_abi.pas(59,15) Hint: Found declaration: TForm1.insertion(var LongInt,TStringGrid,TEdit);

Er markiert dabei das Komma hinter der 1 beim Aufruf der Prozedur.
Kann da jemand helfen? Wäre euch sehr dankbar!

Liebe Grüße
Tim

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Error: Variable identifier expected

Beitrag von m.fuchs »

Häng mal bitte den kompletten Quellcode an.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Error: Variable identifier expected

Beitrag von braunbär »

Das var in "procedure insertion(var ...)" bedeudet, dass nicht ein Wert, sondern die Speicheradresse, wo der Wert steht, übergeben wird.
Da kannst du keine Konstante übergeben. Das var vor dem col hat in dieser Prozedurdeklaration nichts verloren.

Code: Alles auswählen

procedure insertion(col:integer; SG:TStringGrid; Edt:TEdit);
Zuletzt geändert von braunbär am Do 20. Jul 2017, 12:19, insgesamt 1-mal geändert.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Error: Variable identifier expected

Beitrag von mse »

Tim hat geschrieben:u_abi.pas(173,19) Error: Variable identifier expected
u_abi.pas(59,15) Hint: Found declaration: TForm1.insertion(var LongInt,TStringGrid,TEdit);

Du möchtest die Methode mit der Signatur

Code: Alles auswählen

 
TForm1.insertion(var LongInt,TStringGrid,TEdit)
 

aufrufen.
"var LongInt" bedeutet, dass die Methode einen "Longint"-Wert lesen und schreiben will, du übergibst aber "1", das ist eine Konstante, in die nicht geschrieben werden kann. Also:

Code: Alles auswählen

 
procedure TForm1.BtnInsertClick(Sender: TObject);
var
 i1: LongInt
begin
  IF (reihe<=2) AND (zaehlen<=2) then       //Erste zwei Zeilen der schriftlichen
     begin
       i1:= 1;
       insertion(i1, SGschrift, EdtHJ1);
    end;
 

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Error: Variable identifier expected

Beitrag von braunbär »

Noch was:

u_abi.pas(59,15) Hint: Found declaration: TForm1.insertion(var LongInt,TStringGrid,TEdit);

Hast du im interface-Teil insertion als Methode der form deklariert? Im Impementation-Teil, den du u hier gezeigt hast, ist insertion eine normale prozedur, keine Methode des Formulars, sonst müsste es

Code: Alles auswählen

procedure TForm1.insertion(col:integer; SG:TStringGrid; Edt:TEdit);

heissen.
Aber in dem Fall ist es sinnlos, das als Methode zu schreiben, weil in der ganzen Prozedur keine Referenz auf Formularvariable vorkommen, sondern nur (formularunabhängige) Prozedurparameter.
Ich würde die Prozedur aus der Formulardeklaration entfernen.

Reihe gehört natürlich genauso wie col als Parameter übergeben, wobei diese Mixtur aus ans deutsche und ans englische angelehnte Variablennamen nicht schön ist.
Also entweder row und col oder Spalte und Reihe (oder Zeile).

Tim
Beiträge: 21
Registriert: Fr 2. Dez 2016, 16:47

Re: Error: Variable identifier expected

Beitrag von Tim »

Ok danke, das mit der Variablen vorher deklarieren hat erst mal geklappt. Aber das kann doch nicht die Lösung sein...
Ich erkläre mal mein Programm. Es soll ein Programm werden, welches den Abiturdurchschnitt berechnet. Dazu gebe ich mein Fach an, dann die Punktzahlen für jedes Halbjahr und diese werden dann in das StringGrid übernommen. Nun kann man aber einzelne Noten aus Fächern streichen und dafür wird dann nichts im Editfeld eingegeben. Ich teste nun also ob das Editfeld leer ist und wenn ja, dann trage ich an der entsprechenden Stelle im StringGrid eine 0 ein. Um jetzt mit dem Button die einzelnen Werte in das StringGrid einzutragen muss ich natürlich die Spalte angeben und aus welchem Editfenster das herausgelesen werden soll. Ich hab das jetzt so gemacht:

Code: Alles auswählen

 
procedure insertion(col:integer; SG:TStringGrid; Edt:TEdit);
begin
  IF Edt.Text='' then
     SG.cells[col,reihe]:=IntToStr(0)
  ELSE  SG.cells[col,reihe]:=Edt.Text;
end;
 
procedure TForm1.BtnInsertClick(Sender: TObject);
var colum:integer;
begin
  IF (reihe<=2) AND (zaehlen<=2) then       //Erste zwei Zeilen der schriftlichen Prüfungen
     begin
       colum:=1;
       insertion(colum, SGschrift, EdtHJ1);
       colum:=2;
       insertion(colum, SGschrift, EdtHJ2);
       colum:=3;
       insertion(colum, SGschrift, EdtHJ3);

Aber ich glaube es ist doch nicht die finale Lösung vorher immer der Variable einen Wert zuweisen zu müssen...das wollte ich eigentlich direkt im Aufruf der Prozedur machen. (Also für die Variable colum, wie oben, einfach die Zahl für die entsprechende Spalte im StringGrid einfügen)

Irgendjemand wollte noch den kompletten Quelltext haben: hier ist er...

Code: Alles auswählen

 
unit u_abi;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, Menus, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BoxFach: TComboBox;
    BtnInsert: TButton;
    BtnLos: TButton;
    BtnOK: TButton;
    EdtHJ1: TEdit;
    EdtHJ2: TEdit;
    EdtHJ3: TEdit;
    EdtHJ4: TEdit;
    EdtPr1: TEdit;
    EdtPr2: TEdit;
    EdtPr3: TEdit;
    EdtPr4: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    LabelDurchschnitt: TLabel;
    LabelFach: TLabel;
    LabelFach1: TLabel;
    LabelFach2: TLabel;
    LabelFach3: TLabel;
    LabelFach4: TLabel;
    LabelWaehlen: TLabel;
    LabelNP: TLabel;
    LabelHJ1: TLabel;
    LabelHJ2: TLabel;
    LabelHJ3: TLabel;
    LabelHJ4: TLabel;
    LabelWaehlen1: TLabel;
    L_ueber1: TLabel;
    L_ueber2: TLabel;
    L_ueber3: TLabel;
    SGschrift: TStringGrid;
    SGsonstig: TStringGrid;
    SGmuendl: TStringGrid;
    Shape1: TShape;
    procedure BtnInsertClick(Sender: TObject);
    procedure BtnLosClick(Sender: TObject);
    procedure BtnOKClick(Sender: TObject);
    procedure erstellen;
    procedure show;
    procedure hide;
    procedure title;
    procedure summe1;
    procedure summe2;
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  zaehlen, reihe: integer;
  s1, s2, fact, summe:integer;
  punkte: Integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.erstellen;
begin
  zaehlen:=1;
  reihe:=1;
  s1:=0;
  s2:=0;
  summe:=0;
end;
 
procedure TForm1.show;
begin
  LabelNP.Visible:=true;
  LabelHJ1.Visible:=true;
  LabelHJ2.Visible:=true;
  LabelHJ3.Visible:=true;
  LabelHJ4.Visible:=true;
  EdtHJ1.Visible:=true;
  EdtHJ2.Visible:=true;
  EdtHJ3.Visible:=true;
  EdtHJ4.Visible:=true;
  BtnInsert.Visible:=true;
end;
 
procedure TForm1.hide;
begin
  LabelNP.Visible:=False;
  LabelHJ1.Visible:=False;
  LabelHJ2.Visible:=False;
  LabelHJ3.Visible:=False;
  LabelHJ4.Visible:=False;
  EdtHJ1.Visible:=False;
  EdtHJ2.Visible:=False;
  EdtHJ3.Visible:=False;
  EdtHJ4.Visible:=False;
  BtnInsert.Visible:=False;
 
  EdtHJ1.Text:='';
  EdtHJ2.Text:='';
  EdtHJ3.Text:='';
  EdtHJ4.Text:='';
end;
 
procedure TForm1.title;
begin
  case zaehlen of
       1: LabelFach.Caption:='1. schriftliches Prüfungsfach:';
       2: LabelFach.Caption:='2. schriftliches Prüfungsfach:';
       3: LabelFach.Caption:='3. schriftliches Prüfungsfach:';
       4: LabelFach.Caption:='mündliches Prüfungsfach:';
       5: LabelFach.Caption:='Leistungskurs (keine Prüfung):';
       6: LabelFach.Caption:='Leistungskurs (keine Prüfung):';
       7: LabelFach.Caption:='2. Fremdsprache:';
       8: LabelFach.Caption:='Grundkurs:';
       9: LabelFach.Caption:='Grundkurs:';
       10: LabelFach.Caption:='Grundkurs:';
       11: LabelFach.Caption:='Grundkurs:';
       12: LabelFach.Caption:='Grundkurs:';
  end;
end;
 
procedure TForm1.BtnOKClick(Sender: TObject);
begin
  Form1.show;
  If zaehlen<=3 then
     begin
       SGschrift.cells[0,reihe]:=BoxFach.Text;
     end
  ELSE IF (zaehlen>3) AND (zaehlen<=4) then
     begin
       SGmuendl.cells[0,reihe]:=BoxFach.Text;
     end
  ELSE IF (zaehlen>=5) AND (zaehlen<=12) then
     begin
       SGsonstig.cells[0,reihe]:=BoxFach.Text;
       IF zaehlen=12 then
          BtnOk.Enabled:=False;
     end;
end;
 
procedure insertion(col:integer; SG:TStringGrid; Edt:TEdit);
begin
  IF Edt.Text='' then
     SG.cells[col,reihe]:=IntToStr(0)
  ELSE  SG.cells[col,reihe]:=Edt.Text;
end;
 
 
procedure TForm1.BtnInsertClick(Sender: TObject);
var colum:integer;
begin
  IF (reihe<=2) AND (zaehlen<=2) then       //Erste zwei Zeilen der schriftlichen
     begin
       colum:=1;
       insertion(colum, SGschrift, EdtHJ1);
       colum:=2;
       insertion(colum, SGschrift, EdtHJ2);
       colum:=3;
       insertion(colum, SGschrift, EdtHJ3);
       colum:=4;
       insertion(colum, SGschrift, EdtHJ4);
 
 
       zaehlen:=zaehlen+1;
       reihe:=reihe+1;
       Form1.title;
       Form1.hide;
     end
  ELSE IF (reihe=3) AND (zaehlen=3) then     //Dritte Zeile der schriftlichen
     begin
       colum:=1;
       insertion(colum, SGschrift, EdtHJ1);
       colum:=2;
       insertion(colum, SGschrift, EdtHJ2);
       colum:=3;
       insertion(colum, SGschrift, EdtHJ3);
       colum:=4;
       insertion(colum, SGschrift, EdtHJ4);
 
       zaehlen:=zaehlen+1;
       reihe:=1;
       Form1.title;
       Form1.hide;
     end
  ELSE IF (reihe=1) AND (zaehlen=4) then      //erste und einzige Zeile mündlich
     begin
       colum:=1;
       insertion(colum, SGmuendl, EdtHJ1);
       colum:=2;
       insertion(colum, SGmuendl, EdtHJ2);
       colum:=3;
       insertion(colum, SGmuendl, EdtHJ3);
       colum:=4;
       insertion(colum, SGmuendl, EdtHJ4);
 
       zaehlen:=zaehlen+1;
       reihe:=1;
       Form1.title;
       Form1.hide;
     end
  ELSE IF (reihe>=1) AND (zaehlen>=5) AND (zaehlen<=12) then   //alle Zeilen sonstig
     begin
       colum:=1;
       insertion(colum, SGsonstig, EdtHJ1);
       colum:=2;
       insertion(colum, SGsonstig, EdtHJ2);
       colum:=3;
       insertion(colum, SGsonstig, EdtHJ3);
       colum:=4;
       insertion(colum, SGsonstig, EdtHJ4);
 
 
       zaehlen:=zaehlen+1;
       reihe:=reihe+1;
       Form1.title;
       Form1.hide;
 
       IF zaehlen=13 then
          begin
             LabelWaehlen1.Visible:=True;
             EdtPr1.Visible:=True;
             EdtPr2.Visible:=True;
             EdtPr3.Visible:=True;
             EdtPr4.Visible:=True;
             LabelFach1.Visible:=True;
             LabelFach2.Visible:=True;
             LabelFach3.Visible:=True;
             LabelFach4.Visible:=True;
             Shape1.Visible:=True;
             Form1.show;
             BtnInsert.Enabled:=False;
             BtnLos.Visible:=True;
          end;
     end;
end;
 
procedure TForm1.summe1;
var i, x, wert: integer;
begin
  for i:=1 to 3 do
      begin
          for x:=1 to 4 do
              begin
                 wert:=StrToInt(SGschrift.cells[x,i]);
                 wert:=wert*2;
                 s1:=s1+wert;
              end;
      end;
  Label1.Caption:=IntToStr(s1);
end;
 
procedure TForm1.summe2;
var i, x, wert, mdl: integer;
    s:integer;
begin
  s:=0;
  mdl:=0;
  for i:=1 to 8 do
      begin
          for x:=1 to 4 do
              begin
                 wert:=StrToInt(SGsonstig.cells[x,i]);
                 s:=s+wert;
              end;
      end;
  for i:=1 to 4 do
      begin
           wert:=StrToInt(SGmuendl.cells[i,1]);
           mdl:=mdl+wert;
      end;
 
  s2:=s+mdl;
  Label2.Caption:=IntToStr(s2);
end;
 
procedure TForm1.BtnLosClick(Sender: TObject);
begin
  Form1.summe1;
  Form1.summe2;
  summe:=s1+s2;
  punkte:=Round(summe*(40/54)+ StrToInt(EdtPr1.Text)*5 + StrToInt(EdtPr2.Text)*5 + StrToInt(EdtPr3.Text)*5 + StrToInt(EdtPr4.Text)*5);
  LabelDurchschnitt.Caption:='Durchschnitt: ' + IntToStr(punkte);
end;
 
begin
  Form1.erstellen;
end.
 


Habt ein bisschen Rücksicht mit mir, das da oben ist definitiv nicht perfekt, aber es funktioniert. Ich bin Schüler und versuche dass, was uns unsere inkompetente Info-Lehrerin vermittelt etwas auszubauen und etwas darüber hinaus zu machen...nebenbei ist das Programm auch noch nicht komplett fertig.

Grüße
Tim
Zuletzt geändert von Tim am Do 20. Jul 2017, 13:42, insgesamt 3-mal geändert.

Tim
Beiträge: 21
Registriert: Fr 2. Dez 2016, 16:47

Re: Error: Variable identifier expected

Beitrag von Tim »

Formular
Dateianhänge
Hier ist noch das Formular
Hier ist noch das Formular

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Error: Variable identifier expected

Beitrag von braunbär »

Tim hat geschrieben:Aber ich glaube es ist doch nicht die finale Lösung vorher immer der Variable einen Wert zuweisen zu müssen...das wollte ich eigentlich direkt im Aufruf der Prozedur machen. (Also für die Variable colum, wie oben, einfach die Zahl für die entsprechende Spalte im StringGrid einfügen)

Natürlich nicht. Hast du meine Antwort nicht gelesen? Lass einfach das "var" im Prozedurkopf weg. Es gibt überhaupt keinen Grund dafür, die Spalte als var-Parameter zu übergeben.

Antworten