Probleme mit procedure Aufruf

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 188
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Probleme mit procedure Aufruf

Beitrag von haderlump »

Hallo zusammen.
Ich möchte eine Procedue aufrufen, und bekomme die Fehlermeldung: illegal expression.

Hier die Deklaration: (die mittlere Zeile. )

Code: Alles auswählen

procedure weiche_umst(akt_element:Pdaten_element);
procedure aufzug_umstellen(akt_element:Pdaten_element);
procedure weiche_nach_links(element :Pdaten_element); 
Die Implementierung

Code: Alles auswählen

procedure aufzug_umstellen(akt_element :Pdaten_element);
          begin


          end; 
und hier der Aufruf der Procedur: Die Position 20

Code: Alles auswählen

 case funktionsnummer of 
   0: ......
 
 7:        //Weiche umstellen
     begin
       weiche_umst(akt_element);
       zeichnen_erforderlich := true;
     end;  
 
  20:
     begin
      //  funktionsnummer := 0;
        aufzug_umstellen(akt_element);
     end;          
Und hier die Fehlermeldungen main.pas(10422,25) Error: Illegal expression
main.pas(10422,25) Fatal: Syntax error, ";" expected but "(" found

Der Aufruf bei 7 funktioniert einwandfrei.

Und hier noch der ganze case-Block, falls da was wichtiges dabei wäre.

Code: Alles auswählen

    case funktionsnummer of
   0 :
     begin
          if akt_element^.elementart = k_hallentor then hallentor_manuell(akt_element);
          if akt_element^.elementart = k_weiche then weiche_umst(akt_element);
          if akt_element^.elementart = k_bue then schranke_manuell(akt_element);
     end;

   1 :       {Ziel Zugstrasse}
     begin

     if akt_element^.zug_zielfaehig  or hilfsaufl then
       begin
         funktionsnummer := 0;
         alle_ziele_loeschen;
         akt_element^.ziel_gesetzt := true;
         akt_element := elementpuffer;
         THzugfahrstr.create(false);
       end
     else
       begin
         Statusfeld.text := 'Dieses Element ist nicht als Ziel für Zugfahrten erlaubt (nur Signale)'  ;
         ShowMessage('Dieses Element ist nicht als Ziel für Zugfahrten erlaubt (nur Signale)');
         allgemeiner_timer.enabled := true;
       end;
   end;

   2:        {Ziel MMrangierstrasse}
     begin
     if not akt_element^.rangier_zielfaehig then
       begin
         showmessage('Das angeklickte Element ist nicht rangierzielfähig !');
         exit;
       end;
     funktionsnummer := 0;
     Statusfeld.text := ''  ;
     alle_ziele_loeschen;
     akt_element^.ziel_gesetzt := true;
   { if  (akt_element^.P_linkes_element^.Pbz_konto^.loknummer = '                    ') and
         (akt_element^.P_linkes_element^.Pbz_konto^.kontostand <> 0) then
             begin
                 zugauswahl.FZugauswahl.visible := false;
                 zugauswahl.FZugauswahl.show;
                 P_loknummer  := P_erste_loknummer;
                 a := 0;
                 repeat
                     begin
                         if a =  loknummernzeile then break;
                         inc(a);
                         P_loknummer := P_loknummer^.P_next_loknummer ;
                     end;
                 until P_loknummer = nil
             end
         else
             loknummernsuche(akt_element^.P_linkes_element^.Pbz_konto^.loknummer); }
         akt_element := elementpuffer;
         THrangierstr.create(false);
   end;
   3:
     begin
       hallentor_manuell(akt_element);
     end;
   4:       {bz-Kontoberichtigung}
     begin
       if akt_element^.Pbz_konto = nil then
         begin
           Showmessage('Das angeklickte Element hat kein belegungszählkonto');
           exit;
         end ;
       bz_korrekturelement :=akt_element;
       Achszaehlkorrektur_.close;
       Achszaehlkorrektur_.show;
       zeichnen_erforderlich := true;
     end;
   5:         //Ziel Hilfsauflösung
     begin
     funktionsnummer := 1;
     Statusfeld.text := ''  ;
     alle_ziele_loeschen;  hilfsaufl := true;
     elementpuffer := akt_element;
     akt_element^.ziel_gesetzt := true;

   end;
   6:        //Einzelauflösung
     begin
     with akt_element^ do
       begin
         If akt_element^.Pbz_konto <> nil then
           begin
              if fahrtreg[Pbz_konto^.fahrtreg].v_ist =0 then
                 begin
                   Pbz_konto^.fahrstrassennummer :=0;
                   Pbz_konto^.lokal:= false;
                   fahrtreg[Pbz_konto^.fahrtreg].lokal:= false;
                   fahrtreg[Pbz_konto^.fahrtreg].anforderungen := 0;
                   Pbz_konto^.fahrtreg := 0;
                   hp2markierung := false;
                   P_signaladresse := nil;
                   gn := false;
                   rot1 := ja;
                   rot2 := ja;
                   ws := nein;
                   ge := nein;
                   if bue <> nil then
                     begin
                       if bue^.Pbz_konto^.BUE_Anforderungen >0 then
                         begin
                           dec (bue^.Pbz_konto^.BUE_Anforderungen);
                             if  (bue^.Pbz_konto^.BUE_Anforderungen = 0 )then
                               begin
                                 zwischenadresse := akt_element;
                                 akt_element := akt_element^.bue;
                                 weiche_nach_links(akt_element);
                                 akt_element^.Pbz_konto^.bue_geschlossen:= false;
                                 akt_element := zwischenadresse;
                               end;
                         end;
                     end;
                    zeichnen_erforderlich := true;
                 end
              else
                 begin
                   Showmessage('Fahrzeug fährt noch. Auflösung nicht möglich.');
                   exit;
                 end;
           end;
       end;
   end;
   7:        //Weiche umstellen
     begin
       weiche_umst(akt_element);
       zeichnen_erforderlich := true;
     end;
   8 :       //MMrangierstrasse
     begin
       if   not akt_element^.startfaehig then
         begin
           Showmessage('Das angeklickte Element ist nicht startfähig !');
           Statusfeld.text := 'Das angeklickte Element ist nicht startfähig !';
           exit;
         end ;
       if  not akt_element^.rangierstr then
         begin
           Showmessage('Das angeklickte Element ist für Rangierfahrten nicht zugelassen !');
           Statusfeld.text := 'Das angeklickte Element ist für Rangierfahrten nicht zugelassen !';
           exit;
         end;
       funktionsnummer := 2;
       elementpuffer := akt_element;
       akt_element^.startsignal := true;
       Statusfeld.text := 'Ziel anklicken !'  ;
      end;
   9 :       //MMZugfahrstrasse
     begin
       if  not akt_element^.startfaehig then
         begin
           Showmessage('Das angeklickte Element ist nicht startfähig !');
           Statusfeld.text := 'Das angeklickte Element ist nicht startfähig !';
           exit;
         end ;
       if  not akt_element^.zugfahrstr  then
         begin
           Showmessage('Das angeklickte Element ist nicht für Zugfahrstrassen zugelassen !');
           Statusfeld.text := 'Das angeklickte Element ist nicht für Zugfahrstrassen zugelassen !';
           exit;
         end ;
       funktionsnummer := 1;
       elementpuffer := akt_element;
       akt_element^.startsignal := true;
       Statusfeld.text := 'Ziel anklicken !'  ;
     end;
   10:       //Hilfsauflösung
     begin
       if akt_element^.startfaehig = false then
         begin
           Showmessage('Das angeklickte Element ist nicht startfähig !');
           Statusfeld.text := 'Das angeklickte Element ist nicht startfähig !';
           exit;
         end ;
       funktionsnummer := 5;     {MMZugfahrstrasse}
       elementpuffer := akt_element;
       Statusfeld.text := 'Ziel anklicken !'  ;
     end;
   11:    {manuelle Schattenbahnhofsausfahrt}
     begin


             end;
   12:     {manuelle Schattenbahnhofseinfahrt}
     begin
             end;
   13:    {loknummern ändern }
     begin
       if akt_element^.Pbz_konto = nil then
         begin
           Showmessage('Das angeklickte Element hat kein Belegungszählkonto');
           exit;
         end ;
       bz_korrekturelement :=akt_element;
       achszaehlkorrektur_.show;
       zeichnen_erforderlich := true;
     end;
   14:      //Lokalfahrt
     lokalfahrt(akt_element);
   15:      //Entkuppler
     if lastshift = [] then entkuppler(akt_element);
   16:      //Bahnübergang manuell
     if lastshift = [] then Schranke_manuell(akt_element);
   17:      //MMSperrfahrt
     begin
       if  akt_element^.startfaehig = false then
         begin
           Showmessage('Das angeklickte Element ist nicht startfähig !');
           Statusfeld.text := 'Das angeklickte Element ist nicht startfähig !';
           exit;
         end ;
           funktionsnummer := 18;     {MMSperrfahrt}
           elementpuffer := akt_element;
           akt_element^.startsignal := true;
           Statusfeld.text := 'Ziel anklicken !'  ;
     end;
   18:
     begin

       funktionsnummer := 0;
       Statusfeld.text := ''  ;
       alle_ziele_loeschen;
       akt_element^.ziel_gesetzt := true;
       sperrfahrt_;
     end;
   19:      //Gleis sperren
   //lastshift := GetKeyShiftState ;
   if lastshift = [] then
 // if not(ssCtrl in lastshift) then
     gleis_sperren_(akt_element);
   20:
     begin

      //  funktionsnummer := 0;

        aufzug_umstellen(akt_element);
     end;

   21:goto editmode;
   end;

  exit;                                 
Alle anderen Prozedureaufrufe gehen einwandfrei.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Probleme mit procedure Aufruf

Beitrag von MmVisual »

Fehlt bei der Prozedur nicht die Klasse?

procedure aufzug_umstellen(akt_element :Pdaten_element);

so z.B.:

procedure TFrmMain.aufzug_umstellen(akt_element :Pdaten_element);
EleLa - Elektronik Lagerverwaltung - www.elela.de

haderlump
Beiträge: 188
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Probleme mit procedure Aufruf

Beitrag von haderlump »

Da sich alles in der eigenen Klasse abspielt, ist die explizite Klassenangabe nicht nötig. Beim angegebenen Beispiel "weiche_umst(akt_element)" funktioniert das ja auch.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1651
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Probleme mit procedure Aufruf

Beitrag von fliegermichl »

Könntest du das Projekt mal als Zip Datei anhängen, damit man es nachvollziehen kann?

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Probleme mit procedure Aufruf

Beitrag von Zvoni »

Hast du zufälligerweise irgendwo anderst (andere Unit?) eine Prozedur gleichen Namens jedoch ohne Argumente?
Vielleicht findet ein Overload statt, das den Compiler durcheinander bringt.
bzw. Falls gezeigter Code Bestandteil einer Klasse ist, mal versucht mit "Self" zu qualifizieren?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: Probleme mit procedure Aufruf

Beitrag von Mathias »

Und hier die Fehlermeldungen main.pas(10422,25) Error: Illegal expression
main.pas(10422,25) Fatal: Syntax error, ";" expected but "(" found
Klammere doch mal die Blöcke 19 und 20: mal aus. Der Fehler sieht nach einem Struktur Fehler aus.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Probleme mit procedure Aufruf

Beitrag von Zvoni »

Mathias hat geschrieben: Do 7. Nov 2024, 08:59
Und hier die Fehlermeldungen main.pas(10422,25) Error: Illegal expression
main.pas(10422,25) Fatal: Syntax error, ";" expected but "(" found
Klammere doch mal die Blöcke 19 und 20: mal aus. Der Fehler sieht nach einem Struktur Fehler aus.
Ist ne Idee. Würde aber sogar bei Block 21 anfangen (Ich hasse Goto's). Blöcke auskommentieren (ausser Block 20!!), bis es geht. Dann haste den Bock (vielleicht)
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Probleme mit procedure Aufruf

Beitrag von Zvoni »

fliegermichl hat geschrieben: Do 7. Nov 2024, 07:12 Könntest du das Projekt mal als Zip Datei anhängen, damit man es nachvollziehen kann?
Mit über 10.000 Zeilen allein in "main.pas"?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

haderlump
Beiträge: 188
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Probleme mit procedure Aufruf

Beitrag von haderlump »

Ich habe den Fehler gefunden, es gab einen Menüeintrag mit dem selben Namen.

Wenn jemand interesse an dem Projekt , die Steuerung einer Modelleisenbahn, hat ,kann er die Dateien gerne haben. Ich muss das ja nicht ins Grab mitnehmen.
Um das Programm zu verstehen, sollte man aber wenigstens eine Ahnung von Signaltechnik, bzw. der Philosophie die hinter der Signaltechnik steht, verstehen.

Leider ist die rar Datei zu groß (15 MB) um sie hier anzuhängen. Ich kann sie euch aber über WeTransfer oder über E-Mail zukommen lassen. Bitte dazu eine PM mit der Mail-Adresse.
Ich muss aber dazu noch sagen, dass ich Zusätzliche Packages installiert habe, ohne die das Programm nicht compailierbar ist.

Ich habe auch noch ein Testprogramm dazu geschrieben, mit der man die Kontakte der Anlage simulieren kann.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Probleme mit procedure Aufruf

Beitrag von Zvoni »

haderlump hat geschrieben: Do 7. Nov 2024, 10:38 Ich habe den Fehler gefunden, es gab einen Menüeintrag mit dem selben Namen.
Da lag ich ja mit meiner Vermutung gar nicht so verkehrt....
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: Probleme mit procedure Aufruf

Beitrag von Mathias »

Leider ist die rar Datei zu groß (15 MB) um sie hier anzuhängen. Ich kann sie euch aber über WeTransfer oder über E-Mail zukommen lassen. Bitte dazu eine PM mit der Mail-Adresse.
Noch schöner wäre es auf GITHUB oder was ähnlichem, dann wird es am wenigsten in einem Datengrab verschwinden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten