Denkfehler???

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Denkfehler???

Beitrag von Maik81SE »

Moin,
Ich weiß jetzt nicht, ob ich dafür einfach nur zu Blond bin, oder einfach nur einen Logischen Denkfehler habe.

Ich weiß, das ich an stelle von

Code: Alles auswählen

if (x = False) then
auch mit der Weisung

Code: Alles auswählen

if not(x) then
arbeiten kann.

Naja, wie dem auch sei.

Ich habe das Problem, das diese Schleife

Code: Alles auswählen

if (y = false) then begin
    caption := 'FALSE';
    MessageDLG('"' + LAnschrift.Text + '"'+#13+ 'Nicht gefunden', mtInformation, [mbOK], 0);
  end;
 
nicht verarbeitet wird.

Hier mal die vollständige Procedure

Code: Alles auswählen

procedure TForm4.Button2Click(Sender: TObject);
var x : Int64;
    y : Boolean;
begin
  if (LAnschrift.Text <> '') and (LPLZ.Text <> '') and (LOrt.Text <> '') then begin
    if Form2.fArtikel.index = (High(Form2.fArtikel.fArtikel) + 1) then
      SetLength(Form2.fArtikel.fArtikel, High(Form2.fArtikel.fArtikel) + 2);
    Form2File_Artikel;
    Form2.fArtikel.fArtikel[Form2.fArtikel.index]:= Artikel;
    Form2.fArtikel.SetArtikel;
    x := low(Form2.fLiefer.fLieferant);
    repeat
      if _Lieferant.Text = Form2.fLiefer.fLieferant[x].Firma then begin
        y:=True;
        MessageDLG('"'+_Lieferant.Text+'"'+#13+'gefunden', mtInformation, [mbOK], 0);
      end;
      inc(x);
      until y or (x = High(Form2.fLiefer.fLieferant));
    end
  else MessageDLG('Ihr Eingabe ist Unvollständig', mtError, [mbOK], 0);
  // Diese Schleife wird KOMPLETT Ignoriert
  if (y = false) then begin
    caption := 'FALSE';
    MessageDLG('"' + LAnschrift.Text + '"'+#13+ 'Nicht gefunden', mtInformation, [mbOK], 0);
  end;
  LAnschrift.Text:= '';
  LPLZ.Text:='';
  LOrt.Text:='';
end;

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Denkfehler???

Beitrag von theo »

Welchen Anfangswert hat denn y?
Du gehst offenbar davon aus, das y mit false initialisiert wird. Das darf man nicht.

Schreib oben rein y:=false;

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Denkfehler???

Beitrag von Maik81SE »

theo hat geschrieben:Welchen Anfangswert hat denn y?
Du gehst offenbar davon aus, das y mit false initialisiert wird. Das darf man nicht.

Schreib oben rein y:=false;


Jopp, davon gehe ich Standartmäsig aus.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Denkfehler???

Beitrag von theo »

Maik81SE hat geschrieben:Jopp, davon gehe ich Standartmäsig aus.

By default, variables in Pascal are not initialized after their declaration. Any assumption that they contain 0 or any other default value is erroneous: They can contain rubbish.

Horst_h
Beiträge: 72
Registriert: Mi 20. Mär 2013, 08:57

Re: Denkfehler???

Beitrag von Horst_h »

Hallo,

aber man kann davon ausgehen, dass globale Variablen mit 0 { = NIL,false ...} initialisiert sind.
Bei procedure und function aber nicht.Hier beispielsweise zwei Variablen i,r : tUint128; {eigener Typ 16 byte Typ}
wird mit yero 16 initialisiert.

Code: Alles auswählen

.section .bss
   .balign 8
# [122] i,r: Uint128;
   .type U_P$TESTINT128_I,@object
   .size U_P$TESTINT128_I,16
U_P$TESTINT128_I:
   .zero 16

Ich weiß jetzt nicht, ob das bei Klassen, mit den Variablen dort bei private public.., nicht auch der Fall ist. Es scheint aber Sinn zu machen, das Daten die auf dem Heap angelegt werden, mit 0 initialisiert sind und Daten auf dem Stack aka lokale Variablen eben nicht.Man denke nur daran wie if NOT(assigned(myStringlist) ) then sonst funktionieren sollte, wenn nicht zu Beginn der Zeiger darauf auf NIL zeigte.

Gruß Horst

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Denkfehler???

Beitrag von Maik81SE »

War ein versuch wert der Tip.
jetzt meldet sich die selbe funktion mit einem

External: SIGSEGV zurück.
anstelle der Adresse 6C83A0 würde ich jetzt aber lieber mal den genauen punkt in der funtion sehen. :evil:

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Denkfehler???

Beitrag von Michl »

Mal zu debuggen versucht?! Sollte doch einfach zu lokalisieren sein.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Denkfehler???

Beitrag von Maik81SE »

Ähmmm
Du meinst eizelschritt, mit Watch-fenster.

Das bekomm i bei Lazarus 1.2.4 iwie net gebacken, der zeigt mir nur die Register an. oder bin einfach gerade dafür zu blond.
Schon am überlegen, mit eine Temp Ini zu arbeiten...

EDIT
habe diese Funktion nochmal mit einer Leereingabe im entsprechenden Formular getestet und siehe da?
Die Schleife wird mitgenommen.

Da diese aber für die Gundfunktion keine Große rolle spielt werde ich das via ToDo in meine Release einarbeiten. Somit Problem erst mal beiseite gelegt.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Denkfehler???

Beitrag von theo »

Aber mal ehrlich, dein Design macht das Ganze natürlich auch sehr anstrengend zu lesen.
Ich bekomme Kopfweh, wenn ich so etwas debuggen muss:

Code: Alles auswählen

 
  if (LAnschrift.Text <> '') and (LPLZ.Text <> '') and (LOrt.Text <> '') then begin
    if Form2.fArtikel.index = (High(Form2.fArtikel.fArtikel) + 1) then
      SetLength(Form2.fArtikel.fArtikel, High(Form2.fArtikel.fArtikel) + 2);
    Form2File_Artikel;
    Form2.fArtikel.fArtikel[Form2.fArtikel.index]:= Artikel;
    Form2.fArtikel.SetArtikel;


Dabei tut das nicht mal viel mehr, als ein TList.Add.
Und dann noch kreuz und quer über Formulare hinweg.
Das Ganze ist unnötig fehleranfällig und arbeitsintensiv.

Besser mal zu Anfang etwas länger planen, dann geht das Programmieren und Debuggen nachher viel leichter. :wink:

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Denkfehler???

Beitrag von Maik81SE »

theo hat geschrieben:Aber mal ehrlich, dein Design macht das Ganze natürlich aus sehr anstrengend zu lesen.
Ich bekomme Kopfweh, wenn ich so etwas debuggen muss:

Code: Alles auswählen

 
  if (LAnschrift.Text <> '') and (LPLZ.Text <> '') and (LOrt.Text <> '') then begin
    if Form2.fArtikel.index = (High(Form2.fArtikel.fArtikel) + 1) then
      SetLength(Form2.fArtikel.fArtikel, High(Form2.fArtikel.fArtikel) + 2);
    Form2File_Artikel;
    Form2.fArtikel.fArtikel[Form2.fArtikel.index]:= Artikel;
    Form2.fArtikel.SetArtikel;


Dabei tut das nicht mal viel mehr, als ein TList.Add.
Und dann noch kreuz und quer über Formulare hinweg.
Das Ganze ist unnötig fehleranfällig und arbeitsintensiv.

Besser mal zu Anfang etwa länger planen, dann geht das Programmieren und Debuggen nachher viel leichter. :wink:


Ich weiß auf was du hinaus willst.
Aber mit dem Debuggen habe ich zugegeben sowieso meine Probleme. Gebe ich offen zu.
k.P. wie man das auf der Konsole ausgibt.
Egal ob via Lazarus und Terminal gestarte

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

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: Denkfehler???

Beitrag von m.fuchs »

Maik81SE hat geschrieben:Aber mit dem Debuggen habe ich zugegeben sowieso meine Probleme. Gebe ich offen zu.

Ohne dir jetzt zu Nahe treten zu wollen: Du hast nicht mit dem Debuggen Probleme, sondern mit sauberem Code. Folge mal theos Empfehlung und gehe ein paar Schritte zurück.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Denkfehler???

Beitrag von Maik81SE »

m.fuchs hat geschrieben:
Maik81SE hat geschrieben:Aber mit dem Debuggen habe ich zugegeben sowieso meine Probleme. Gebe ich offen zu.

Ohne dir jetzt zu Nahe treten zu wollen: Du hast nicht mit dem Debuggen Probleme, sondern mit sauberem Code. Folge mal theos Empfehlung und gehe ein paar Schritte zurück.


Alles Gut.
also werd ich wohl in den sauren Apfel beisen und

Code: Alles auswählen

TArt       = class
    fArtikel         : Array of TArtikel;
    fPath, fFilename : String;
    index            : Int64;
  private
  public
    constructor Create;
    destructor  Done;
    procedure   GetArtikel;
    procedure   SetArtikel;
  end;


Einige sachen sehe ich ein, liegen im Programm total schäg. :(
Da läuft aber schon der Drucker auf Hochtouren...

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Denkfehler???

Beitrag von pluto »

Ich habe auch meine Probleme mit dem Debugger. Darum nutzte ich die "Klassische" Methode ohne Debugger und finde damit JEDEN Fehler(Meistens, jedenfalls).

du arbeitest dann mit writeln Anweisungen. Du musst das Start Programm Aktivieren.
Dann siehst du die Ausgaben.

Was mir noch aufgefallen ist:

Code: Alles auswählen

SetLength(Form2.fArtikel.fArtikel, High(Form2.fArtikel.fArtikel) + 2);

Warum +2? Sollte nicht ein +1 reichen?
Mit +1 und -1 komme ich immer durcheinander.... selbst nach 20 Jahren Programmier Erfahrung.

Wenn du Klassen nicht magst, könntest du auch mit einem Record arbeiten und mit TList.
MFG
Michael Springwald

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: Denkfehler???

Beitrag von m.fuchs »

Maik81SE hat geschrieben:

Code: Alles auswählen

fArtikel         : Array of TArtikel;

Aber da geht es doch schon weiter. Warum muss es unbedingt ein Array sein? Eine Liste (idealerweise eine spezialisierte, generische) ist doch einfacher in der Bedienung. Die ganze Vergrößerei fällt dann weg. Freepascal bietet jede Menge moderne, objektorientierte Möglichkeiten. Nutze sie, das ist bei allen Projekten, die über die Größe eines Minitools herausgehen, von Vorteil.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Denkfehler???

Beitrag von pluto »

@m.fuchs
Genau das meinte ich doch, ein Record in einer TList rein packen. Praktisch über Pointer....

Hin und wieder muss man Array direkt verwenden, aber in diesen Fall würde ich TObjectList nehme oder wie gesagt TList.
Weil es einfach einfacher ist.
MFG
Michael Springwald

Antworten