Lazarus und OOP: SIGSEGV-Fehler

Gast #5582518
Lesenswert?

Guten Abend,

meine Programmierkenntnisse aus dem Studium sind lange her, jetzt wollte 
ich mit Lazarus mal versuchen zu reaktivieren, was noch da ist, und 
scheitere relativ schnell:
Ich möchte mir einen eigenen Sudoku-Solver bauen. Klappt grundsätzlich 
rein prozedural ganz gut, aber selbst in diesem Miniprojekt wirds doch 
schnell unübersichtlich. Also die Idee, nochmal neu mit OOP aufzusetzen.

Eine Klasse TSudoku geschaffen, und im Hauptprogramm eine entsprechende 
Variable angelegt (var meinSudoku: TSudoku;).
Dann meinSudoku.Create() aufgerufen, und anschließend 
meinSudoku.Ausgeben(). Bei letzterem wird die Fehlermeldung "External: 
SIGSEGV" ausgelöst.

Ich habe die vage Vermutung, dass der Zugriff auf das interne Array 
innerhalb der Klasse nicht zulässig ist, was aber nicht abhängt von der 
Sichtbarkeit nach außen (private vs. public). Ist das Array hier mit 
static zu deklarieren? Falls ja, wie?/Ich erhalte immer die Meldung, an 
dieser und jener Stelle sei das Schlüsselwort static nicht zulässig.
Oder ist die Ursache für die Fehlermeldung eine andere?
Die Fehlermeldung ist unabhängig vom "self.", write an sich 
funktioniert.

Vielen Dank!
1
unit USudoku;
2

3
{$mode objfpc}{$H+}
4

5
interface
6

7
uses
8
  Classes, SysUtils,Crt;
9

10
type
11
  TSudoku = class
12
    private
13
      sudokumatrix: array[1..9] of array[1..9] of String;
14
    public
15
      procedure Ausgeben();
16
      constructor Create();
17
  end;
18

19
implementation
20

21
  constructor TSudoku.Create();
22
  var
23
    x,y: integer;
24
  begin
25
    for x:=1 to 9 do begin
26
      for y:=1 to 9 do begin
27
        sudokumatrix[x][y]:='123456789';
28
      end;
29
    end;
30
  end;
31

32
  procedure TSudoku.Ausgeben();
33
  var
34
    x,y: integer;
35
    inhalt: String;
36
  begin
37
    for x:=1 to 9 do begin
38
      for y:=1 to 9 do begin
39
        // die folgende Zeile löst SIGSEGV aus
40
        Write(self.sudokumatrix[x][y]:10);
41
      end;
42
      writeln;
43
    end;
44
  end;
45
end.
Gast #5582815
Lesenswert?

Nein, daran liegt es nicht. Die :10 sind ja nur eine Formatanweisung, 
kürzere Strings werden aufgefüllt mit Leerzeichen für eine bündige 
Ausrichtung.

Selbst wenn ich das weglasse, oder statt write eine Zuweisung an eine 
Variable vornehme, bleibt der Fehler beim Versuch, auf das Array 
zuzugreifen.
Gast #5582932
Lesenswert?

Matthias V. schrieb im Beitrag #558251
> Dann meinSudoku.Create() aufgerufen,
Hier liegt der Fehler, richtig muss es heissen:
meinSudoku:= TSudoku.Create;

Ist eine echte Falle, in die ich auch schon oefters getappt bin...
Gast #5583604
Lesenswert?

@Maier: Vielen Dank, das war der entscheidende Hinweis.

(Und ich wäre da nicht von alleine drauf gekommen...!)

Danke!

@Uwe: Das Hauptprogramm als solches existiert noch nicht, ich hatte den 
OO-Ansatz als Neuanfang umgesetzt und im Hauptprogramm existieren 
wirklich nur der Create-Aufruf und der Aufruf meinSudoku.Ausgeben().

@René H.: Bei Interesse gerne, wenn der Fortschritt etwas größer ist ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren