Error: Variable identifier expected

Für Fragen von Einsteigern und Programmieranfängern...

Error: Variable identifier expected

Beitragvon Tim » 20. Jul 2017, 10:58 Error: Variable identifier expected

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
Tim
 
Beiträge: 18
Registriert: 2. Dez 2016, 16:47

Beitragvon m.fuchs » 20. Jul 2017, 11:07 Re: Error: Variable identifier expected

Häng mal bitte den kompletten Quellcode an.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1676
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.6, FPC 3.0) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon braunbär » 20. Jul 2017, 11:14 Re: Error: Variable identifier expected

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 20. Jul 2017, 11:19, insgesamt 1-mal geändert.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon mse » 20. Jul 2017, 11:18 Re: Error: Variable identifier expected

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;
 
mse
 
Beiträge: 1677
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.4.2,git master FPC 3.0,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon braunbär » 20. Jul 2017, 11:32 Re: Error: Variable identifier expected

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).
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon Tim » 20. Jul 2017, 11:49 Re: Error: Variable identifier expected

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 20. Jul 2017, 12:42, insgesamt 3-mal geändert.
Tim
 
Beiträge: 18
Registriert: 2. Dez 2016, 16:47

Beitragvon Tim » 20. Jul 2017, 11:50 Re: Error: Variable identifier expected

Formular
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Tim
 
Beiträge: 18
Registriert: 2. Dez 2016, 16:47

Beitragvon braunbär » 20. Jul 2017, 15:23 Re: Error: Variable identifier expected

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.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried