Forum: PC-Programmierung Lazarus und OOP: SIGSEGV-Fehler


von Matthias V. (Gast)


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.

von Jim M. (turboj)


Lesenswert?

Dein String hat 9 Zeichen und nicht 10.

Sollte das hier
1
Write(self.sudokumatrix[x][y]:10);

nicht einen Compiler Error auswerfen?

Ich hätte da eher
1
Write(sudokumatrix[x][y], length(sudokumatrix[x][y]));

geschrieben.

von Matthias V. (Gast)


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.

von René H. (Gast)


Lesenswert?

Häng mal das Projekt als .zip an bitte.

Grüsse,
René

von Uwe (Gast)


Lesenswert?

Wie sieht der Aufruf im Hauptprogramm aus?

von Maier (Gast)


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...

von Matthias V. (Gast)


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 ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.