Recent

Author Topic: EXC_BAD_ACCESS (code=1, address=Oxf0) on Button Click  (Read 887 times)

Zunnen

  • Newbie
  • Posts: 3
EXC_BAD_ACCESS (code=1, address=Oxf0) on Button Click
« on: January 18, 2023, 05:14:55 pm »
This is a Lazarus project
It happens when I press Button4. I have a few ideas what could be the reason but I really have no idea how to fix this.

The Error is:

Projekt EnglischOlympics
»Process stopped with reason:
EXC_BAD_ACCESS (code=1, address=Oxf0)
Address 10000C61E


Assambler:
000000010000C5DE                          :  48 83 7b 08 00                 cmpq   $0x0, 0x8(%rbx)


The Interface Unit

Code: Pascal  [Select][+][-]
  1. unit Oberflache;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
  9.   uZaehler, uSpeicher; //Hier eigene Units eingebunden
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     Button1: TButton;
  17.     Button2: TButton;
  18.     Button3: TButton;
  19.     Button4: TButton;
  20.     Edit1: TEdit;
  21.     Edit2: TEdit;
  22.     Edit3: TEdit;
  23.     Label1: TLabel;
  24.     Label2: TLabel;
  25.     Label3: TLabel;
  26.     Label4: TLabel;
  27.     Label5: TLabel;
  28.     procedure Button1Click(Sender: TObject);
  29.     procedure Button2Click(Sender: TObject);
  30.     procedure Button3Click(Sender: TObject);
  31.     procedure Button4Click(Sender: TObject);
  32.     procedure Edit1Change(Sender: TObject);
  33.     procedure FormCreate(Sender: TObject);
  34.   private
  35.  
  36.   public
  37.  
  38.   end;
  39.  
  40. var
  41.   Form1: TForm1;
  42.   Zaehler:TZaehler; //Objekte deklarieren
  43.   Speicher:TSpeicher;
  44. implementation
  45.  
  46. {$R *.lfm}
  47.  
  48. { TForm1 }
  49.  
  50. procedure TForm1.FormCreate(Sender: TObject);
  51. begin
  52.     Zaehler := TZaehler.Create;   // Objekte erzeugen
  53.     Speicher := TSpeicher.Create;
  54.     Zaehler.SetzeSchulNr(1);
  55.     Zaehler.SetzeSchulerNr(1);
  56. end;
  57.  
  58. procedure TForm1.Button1Click(Sender: TObject);
  59. var
  60.   Zahl : integer;
  61. begin
  62.      Zahl:= StrToInt(Edit1.Text);
  63.      Speicher.AnzahlSchulen(Zahl);
  64.      Zaehler.AnzahlSchulen(Zahl);
  65. end;
  66.  
  67. procedure TForm1.Button2Click(Sender: TObject);
  68. var
  69.   Bezeichnung : string;
  70. begin
  71.      Bezeichnung:= Edit2.Text;
  72.      Speicher.EingabeSchulen(Bezeichnung);
  73.      Zaehler.SchulNrHoch(1);
  74.  
  75.      If Zaehler.GibSchulNr > Zaehler.GibAnzahlSchulen
  76.      then
  77.      begin
  78.        Zaehler.SetzeSchulNr(1);
  79.        Label1.Caption:='Name der Schule: ' + IntToStr(Zaehler.GibSchulNr);
  80.        Edit2.Text:= 'Name der Schule';
  81.        Zaehler.SetzeSchulerNr(1);
  82.        Label2.Caption:= Speicher.GibSchule;
  83.      end;
  84.  
  85.      Edit2.Text:= 'Name der Schule';
  86.      Label1.Caption:='Name der Schule: ' + IntToStr(Zaehler.GibSchulNr);
  87.  
  88.      Label4.caption:=IntToStr(Zaehler.GibAnzahlSchulen);
  89.      Label5.caption:=IntToStr(Zaehler.GibSchulNr);
  90. end;
  91.  
  92. procedure TForm1.Button3Click(Sender: TObject);
  93. begin
  94.     Zaehler.Free;
  95.     Speicher.Free;
  96.     Close;
  97. end;
  98.  
  99. procedure TForm1.Button4Click(Sender: TObject);
  100. var
  101.   Bezeichnung : string;
  102. begin
  103.      Bezeichnung:= Edit3.Text;
  104.      Speicher.EingabeSchuler(Bezeichnung);
  105.      Zaehler.SchulerNrHoch(1);
  106.  
  107.      Label1.Caption:='Name des Schülers: ' + IntToStr(Zaehler.GibSchulerNr);
  108.      Edit2.Text:= 'Name des Schülers';
  109.  
  110. end;
  111.  
  112. procedure TForm1.Edit1Change(Sender: TObject);
  113. begin
  114.  
  115. end;
  116.  
  117. end.
  118.  
  119.  


This Unit counts what Number we're on

Code: Pascal  [Select][+][-]
  1. UNIT uZaehler;
  2.  
  3. interface
  4.  
  5. //--------------------  ggf Uses-Liste einfügen !  --------------------
  6. //uses ....;
  7.  
  8. type
  9.    TZaehler = CLASS
  10.  
  11.      // weitere Attribute
  12.      private
  13.         SchulerNr : integer;
  14.         SchulNr : integer;
  15.         AnzahlS : integer;
  16.  
  17.      // weitere Methoden
  18.      public
  19.         procedure AnzahlSchulen (pAnzahlS : integer);
  20.         function GibAnzahlSchulen : integer;
  21.  
  22.         procedure SetzeSchulerNr (pSchulerNr: integer); virtual;
  23.         procedure SchulerNrHoch (pUm: integer); virtual;
  24.         function  GibSchulerNr : integer; virtual;
  25.  
  26.         procedure SetzeSchulNr (pSchulNr: integer); virtual;
  27.         procedure SchulNrHoch (pUm: integer); virtual;
  28.         function GibSchulNr : integer; virtual;
  29.  
  30.    end;
  31.  
  32. implementation
  33.  
  34. //+---------------------------------------------------------------------
  35. //|         Zaehler: Methodendefinition
  36. //+---------------------------------------------------------------------
  37.  
  38. //-------- SetzeSchulerNr (public) -------------------------------------
  39. procedure TZaehler.SetzeSchulerNr (pSchulerNr: integer);
  40. begin
  41.    SchulerNr := pSchulerNr;
  42. end;
  43.  
  44. //-------- Gib Anzahl Schulen (public) -------------------------------------
  45. function TZaehler.GibAnzahlSchulen : integer;
  46. begin
  47.    result := AnzahlS;
  48. end;
  49.  
  50. //-------- Anzahl Schulen (public) ---------------------------------------
  51. procedure TZaehler.AnzahlSchulen (pAnzahlS: integer);
  52. begin
  53.    AnzahlS := pAnzahlS;
  54. end;
  55.  
  56. //-------- GibSchulerNr (public) ---------------------------------------
  57. function TZaehler.GibSchulerNr : integer;
  58. begin
  59.    result := SchulerNr;
  60. end;
  61.  
  62. //-------- SchulerNrHoch (public) -------------------------------------
  63. procedure TZaehler.SchulerNrHoch (pUm: integer);
  64. begin
  65.    SchulerNr := SchulerNr + pUm;
  66. end;
  67.  
  68. //-------- SetzeSchulNr (public) -------------------------------------
  69. procedure TZaehler.SetzeSchulNr (pSchulNr: integer);
  70. begin
  71.    SchulNr := pSchulNr;
  72. end;
  73.  
  74. //-------- SchulNrHoch (public) -------------------------------------
  75. procedure TZaehler.SchulNrHoch (pUm: integer);
  76. begin
  77.    SchulNr := SchulNr + pUm;
  78. end;
  79.  
  80. //-------- GibSchulNr (public) ---------------------------------------
  81. function TZaehler.GibSchulNr : integer;
  82. begin
  83.    result := SchulNr;
  84. end;
  85.  
  86. end.
  87.  


This Unit saves the current data

Code: Pascal  [Select][+][-]
  1. UNIT uSpeicher;
  2.  
  3. interface
  4.  
  5. //--------------------  ggf Uses-Liste einfügen !  --------------------
  6. uses
  7. Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, uZaehler; //Hier eigene Units eingebunden
  8.  
  9. type
  10.    TSchuler = record   // Ein Schüler mit Namen, 6 Punktzahlen können eingegebn werden,
  11.      SName: string;    // daraus ergibt sich TotalScore (Gesamtpunktzahl)
  12.      Score1: real;
  13.      Score2: real;
  14.      Score3: real;
  15.      Score4: real;
  16.      Score5: real;
  17.      Score6: real;
  18.      TotalScore: real;
  19.    end;
  20.  
  21.    TSchule = record     // Ein Team hat einen Namen und mehrere Schüler vom Typ TSchuler
  22.      TName: string;   // der TeamScore wird aus den einzelnen TotalScores berechnet
  23.      Schueler: Array[1..8] of TSchuler;
  24.      TeamScore: real;   //Wird aus allen TotalScores berechnet
  25.    end;
  26.  
  27.    TSpeicher = CLASS
  28.  
  29.    // weitere Attribute
  30.      private
  31.  
  32.    // weitere Methoden
  33.      public
  34.  
  35.         Teams : Array of TSchule;
  36.  
  37.         procedure AnzahlSchulen (pAnzahl: integer);
  38.         procedure EingabeSchulen (pName: string);
  39.         procedure EingabeSchuler (pName: string);
  40.         procedure ZahlenAktualisieren;
  41.         function GibSchule : string;
  42.  
  43.    end;
  44.  
  45.    var
  46.    SchuleZahl : integer;
  47.    SchulerZahl: integer;
  48.  
  49. implementation
  50.  
  51. //+---------------------------------------------------------------------
  52. //|         Speicher: Methodendefinition
  53. //+---------------------------------------------------------------------
  54.  
  55.  
  56. //-------- Anzahl Festlege (public) -------------------------------------
  57. procedure TSpeicher.AnzahlSchulen (pAnzahl: integer);
  58. begin
  59.    SetLength(Teams, pAnzahl); //Anzahl der Schulen festlegen
  60. end;
  61.  
  62. //-------- Eingabe Schulen (public) -------------------------------------
  63. procedure TSpeicher.EingabeSchulen (pName: string);
  64. var
  65. i: integer;
  66. Zaehler: TZaehler;
  67. begin
  68. Zaehler := TZaehler.Create;
  69. i := Zaehler.GibSchulNr;
  70. Teams[i].TName := pName;
  71.  
  72. Zaehler.Free;
  73. end;
  74.  
  75. //-------- Zahl Schule Aktualisieren (public) -------------------------------------
  76. procedure TSpeicher.ZahlenAktualisieren;
  77. var
  78. i, h: integer;
  79. Zaehler: TZaehler;
  80. begin
  81. Zaehler := TZaehler.Create;
  82. i := Zaehler.GibSchulNr;
  83. h := Zaehler.GibSchulerNr;
  84. SchuleZahl:= i;
  85. SchulerZahl:= h;
  86. Zaehler.Free;
  87. end;
  88.  
  89. //-------- Eingabe Schuler (public) -------------------------------------
  90. procedure TSpeicher.EingabeSchuler (pName: string);
  91. var
  92. i: integer;
  93. n: integer;
  94. Zaehler: TZaehler;
  95. begin
  96. Zaehler := TZaehler.Create;
  97. i := Zaehler.GibSchulNr;
  98. n := Zaehler.GibSchulerNr;
  99. Teams[i].Schueler[n].SName := pName;
  100. Zaehler.Free;
  101. end;
  102.  
  103. //-------- GibSchule (public) ---------------------------------------
  104. function TSpeicher.GibSchule : string;
  105. begin
  106.      result := Teams[SchuleZahl].TName;
  107. end;
  108.  
  109.  
  110. end.
  111.  

I played around with changing the input for *Teams.Schueler[n].SName := pName;* in the *procedure TSpeicher.EingabeSchuler * in *Speicher* But that isn't doing anything.

Any ideas? Thanks in advance.
« Last Edit: January 18, 2023, 10:53:35 pm by Zunnen »

KodeZwerg

  • Hero Member
  • *****
  • Posts: 2269
  • Fifty shades of code.
    • Delphi & FreePascal
Re: EXC_BAD_ACCESS (code=1, address=Oxf0) on Button Click
« Reply #1 on: January 18, 2023, 05:40:24 pm »
I havent run your sources yet but I am pretty sure that without checking and validating you run into troubles.
« Last Edit: Tomorrow at 31:76:97 xm by KodeZwerg »

Zunnen

  • Newbie
  • Posts: 3
Re: EXC_BAD_ACCESS (code=1, address=Oxf0) on Button Click
« Reply #2 on: January 18, 2023, 05:47:25 pm »
Could you eleborate please? I'm sadly not that into coding and would appreciate any help :)

KodeZwerg

  • Hero Member
  • *****
  • Posts: 2269
  • Fifty shades of code.
    • Delphi & FreePascal
Re: EXC_BAD_ACCESS (code=1, address=Oxf0) on Button Click
« Reply #3 on: January 18, 2023, 05:57:21 pm »
Could you eleborate please? I'm sadly not that into coding and would appreciate any help :)
Ofc I can, exemplary your first method:
Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Zahl : integer;
  4. begin
  5.      Zahl:= StrToInt(Edit1.Text);
  6.      Speicher.AnzahlSchulen(Zahl);
  7.      Zaehler.AnzahlSchulen(Zahl);
  8. end;
You do not check for nothing you just assume that it'll be correct.

Here is the same, but at least with a minimalistic checking if Edit1.Text really had a number in to be used, the following I can not quick check.
Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Zahl : integer;
  4. begin
  5.   if TryStrToInt(Edit1.Text, Zahl) then
  6.     begin
  7.       Speicher.AnzahlSchulen(Zahl);
  8.       Zaehler.AnzahlSchulen(Zahl);
  9.     end;
  10. end;

Can you add a zip of project without binaries to investigate it better?
« Last Edit: Tomorrow at 31:76:97 xm by KodeZwerg »

Thaddy

  • Hero Member
  • *****
  • Posts: 18529
  • Here stood a man who saw the Elbe and jumped it.
Re: EXC_BAD_ACCESS (code=1, address=Oxf0) on Button Click
« Reply #4 on: January 18, 2023, 09:14:00 pm »
1. solve the warnings!!! They are all over the place....
2. use an advanced record, not a class
Due to censorship, I changed this to "Nelly the Elephant". Keeps the message clear.

jamie

  • Hero Member
  • *****
  • Posts: 7421
Re: EXC_BAD_ACCESS (code=1, address=Oxf0) on Button Click
« Reply #5 on: January 18, 2023, 10:39:42 pm »
Code: Pascal  [Select][+][-]
  1. {$mode objfpc}{$H+}
  2.  

Put that at the top of all your UNIT sources ?
The only true wisdom is knowing you know nothing

Zunnen

  • Newbie
  • Posts: 3
Solved
« Reply #6 on: January 18, 2023, 10:53:19 pm »
Thanks for all the help, I've been able to fix the problem by removing the create and free from the methods in the Speicher Unit, I'll try to use ur tips :)

 

TinyPortal © 2005-2018