Dynamische Arrays und Sigsegv

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
tuetenelch
Beiträge: 14
Registriert: Do 13. Mär 2008, 11:48
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Dynamische Arrays und Sigsegv

Beitrag von tuetenelch »

Hallo,
ich hoffe ich bin hier im richtigen Unterforum gelandet :D
Habe lange Jahre in Delphi programmiert, wegen Studium dann C und jetzt wollte ich für ein kleines Programm mal Lazarus probieren. Klappt soweit auch alles ganz fein, aber jetzt habe ich einen Fehler bei dem ich nicht weiterkomme.
Ich habe einen dynamischen, zweidimensionalen Array und möchte nun auf ihn zugreifen:

Code: Alles auswählen

showmessage(inttostr(aktuell)+'+'+inttostr(lesepos));
  command := funktionen[aktuell-1,lesepos];
Das ich mir die Daten für die Stelle im Array vorher ausgebe hat einen einfachen Grund, so kann ich prüfen ob die entsprechenden Zeilen im Array vorhanden sind. Sind sie definitiv, das ganze funktioniert aber nur für die 1. Zeile im Array, danach schmiert mir das Programm mit der Exception External:Sigsegv ab.
Ist das ein Bug, habe ich einen dämlichen Fehler gemacht oder liegt es daran das ich der Pascal-Sprache einfach nicht mehr mächtig bin? :)
Für Hinweise bin ich dankbar.
LG
Tütenelch

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von alexander »

ich nehme mal einfach an dass du den oben genannten Befehl in einer schleife laufen lässt. Könnte es sein, dass du aktuell mit 0 initialisiertst und deswegen mit aktuell-1 einen nicht vorhandenes Array-Element aufrufen willst?

Es wäre nützlich wenn du ein bissche mher code, also die ganz procedure oder alles was für das Array wichtig ist postest, denn aus den 2 Zeilen kann ich nichts herauslesen.....
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

tuetenelch
Beiträge: 14
Registriert: Do 13. Mär 2008, 11:48
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Beitrag von tuetenelch »

Alles klar, hier kommt natürlich mehr:

Code: Alles auswählen

var
  funktionen:array of array of string;
  anfang:integer=1;
  aktuell:integer=0;
  positionb:longint=0;
  fehler:string;
  schritt:integer=0;
Es geht um die SImulation einer Turingmaschine. In der Tabelle funktionen sind Überführungsfunktionen der Turingmaschine (als String in Form ZxGx{L,N,R}) gespeichert wobei die Spalten den ausgelesenen Wert aus dem Alphabet angeben und die Zeilen die Nummer der Funktion.
Wird auf einen Button geklickt wird das Programm ausgeführt:

Code: Alles auswählen

[...] aktuell:=anfang;
  rechne;
  ausgabe;    [...]
Der Wert Anfang wird aus einer Liste ausgewählt und gibt die Startfunktion, also die Zeile des Arrays, wird durch eine Funktion auf eine andere geleitet wird der Wert für aktuell, sozusagen die aktuell laufende funktion verändert.
Ich poste hier einmal die Prozedure Rechne, zugegebenermaßen nicht sehr ellegant:

Code: Alles auswählen

procedure rechne;
var lese:string;
    lesepos:integer;
    command:string;
begin
 with form1 do begin
  inc(schritt);
  lese := band[positionb];
  lesepos := gibpos(lese);
  if ( (lesepos = endez) and (aktuell=ende) ) then begin
   fehler := 'Ende : Das Programm ist bis zum Endzustand durchgelaufen.';
   exit;
  end;
  //showmessage(inttostr(aktuell)+'+'+inttostr(lesepos));
  command := funktionen[aktuell-1,lesepos]; // in dieser Zeile passiert der Fehler
  //showmessage ((command));
  band[positionb]:=gibschreibe(command);
  positionb := positionb + gibrichtung(command);
  if positionb < 0 then fehler := 'Fehler: Das Programm läuft über das linke Bandende hinaus!';
  aktuell := gibzustand(command);
 end;
end;
Ich hoffe das reicht an Informationen. Ich danke dir aber schonmal für deine Antwort, Alexander.

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

Beitrag von theo »

Da kann ich auch nicht viel sagen.
Bist du sicher, dass das Array ordentlich dimensioniert ist?
z.B.
Setlength(funktionen,10,10);

P.S. Upgraden wäre auch empfehlenswert.
Wir sind bei FPC 2.2.0 Laz 0.9.24 resp. 25

tuetenelch
Beiträge: 14
Registriert: Do 13. Mär 2008, 11:48
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Beitrag von tuetenelch »

Danke für die Antwort.
Ich habe mal das Update installiert.
Nun habe ich mir auch die Dimension des Arrays ausgeben lassen: es wird definitiv auf einen Wert zugegriffen der existiert. Trotzdem kommt es zu der Exception. Wieso?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Vereinfache mal den Code soweit wie möglich und poste hier.
Ich glaub eigentlich nicht das es ein fpc Bug ist liegt aber im bereich des Möglichen. Denke du hast nur noch irgendwo nen Denkfehler drin aber solang du nicht deinen Kompletten Code oder ein vereinfachtes Beispiel mit dem wir den Fehler selbst nachvollziehen können Postest kann man dir da nicht helfen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von theo »

Ich seh das auch so wie Christian.
Anhand deines geposteten Codes würde ich sagen, dass funktionen[aktuell-1,.. bei
var aktuell:integer=0;
Im ersten Durchgang -1 ergibt. Aber woher sollen wir denn wissen, ob du den Wert vorher noch änderst?

tuetenelch
Beiträge: 14
Registriert: Do 13. Mär 2008, 11:48
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Beitrag von tuetenelch »

Autsch, ich bin so hohl...
(hier fehlt der Smilie der seinen Kopf gegen die Wand schlägt...)
Es tut mir echt leid euch mit meiner eigenen Dummheit belästigt zu haben, ich habe den Fehler gefunden (habe an einer ganz anderen Stelle vergessen die Dimension der zweiten DImension zu erhöhen...).
Danke für eure Geduld.

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von alexander »

kein problem....... ist ja ganz normal... ;-)

Gruß Alexander
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

Antworten