![]() |
Re: Arrays mit drei Dimensionen... nicht einfach -.-
Delphi-Quellcode:
Keller[<Index>].Kellerzustand
|
Re: Arrays mit drei Dimensionen... nicht einfach -.-
Records sind aber nicht dynamisch oder? Ich müsste dann ja dynamisch Cards anlegen, stimmt das? Kann man das auch umgehen? :oops:
mkinzler, kannst du das
Delphi-Quellcode:
auch mal erklären, pls? Ich bin halt schwer von Begriff... :pale:
Keller[<Index>].Kellerzustand
|
Re: Arrays mit drei Dimensionen... nicht einfach -.-
Delphi-Quellcode:
Records sind nicht dynamisch
var
Kellerelemente: array of TKeller; zustand: Integer; ... //Zustand des Rootelements zustand := Kellerelemente[0].Kellerzustand; |
Re: Arrays mit drei Dimensionen... nicht einfach -.-
Wieso machst du das array variabel? Die Automatentabelle beschreibt doch das "Verhalten" des Automaten, also sollte sie fest sein. Da will ich ja quasi eintragen was bei Eingabe X und Zustand Y und Kellerzustand Z für ein neuer Zustand Y' und Kelleroperation k rauskommt.
Sorry, das ich euch so nerve. -.- Ich bin halt langsam... ;] |
Re: Arrays mit drei Dimensionen... nicht einfach -.-
Also du hast einen Stack und eine definierte Anzahl von Zuständen und für jeden Zustand verschiedene Eingabekombinationen (2 Parameter) und daraus resultierende Aktionen auf dem Stack und Folgezustände?
|
Re: Arrays mit drei Dimensionen... nicht einfach -.-
Ganz genau so schaut's aus!
€dit: Leute, sorry, ich geh' jetzt mal pennen, ich muss den morgigen Tag noch überstehen xD Bis denne! ^^ |
Re: Arrays mit drei Dimensionen... nicht einfach -.-
Dann sollten wir die Struktur etwas ändern. Zuerst würde ich den Array durch eine Liste oder besser durch eine fertige Stack-Klasse ersetzten
Delphi-Quellcode:
Deklaration von Konstanten für die Operationen:
unit Stack;
interface uses SysUtils, Classes; type TStack = class private FList: PPointerList; FCapacity, FCount: Cardinal; procedure Grow; public destructor Destroy; override; procedure Push( const Data: Pointer ); function Pop: Pointer; end; implementation { TStack } destructor TStack.Destroy; begin FreeMem( FList ); inherited; end; procedure TStack.Grow; begin if FCapacity > 64 then Inc( FCapacity, FCapacity div 4 ) else if FCapacity > 8 then Inc( FCapacity, 16 ) else Inc( FCapacity, 4 ); ReallocMem( FList, FCapacity * SizeOf( Pointer ) ); end; function TStack.Pop: Pointer; begin if FCount > 0 then begin Dec( FCount ); Result := FList^[FCount]; end else Result := nil; end; procedure TStack.Push(const Data: Pointer); begin if FCapacity = FCount then Grow; FList^[FCount] := Data; Inc( FCount ); end; end.
Delphi-Quellcode:
Record für Zustände:
const
action_push=0; action_pop=1;
Delphi-Quellcode:
Du Zustaende würde ich auch in einer Liste verwalten
TZustaende = Record
Name: string; Input1: char; Input2: Integer; Folgezustand: String; Operation: byte; end; |
Re: Arrays mit drei Dimensionen... nicht einfach -.-
ArchaicSeraphim, ich glaube, Du vermischt hier zwei Dinge:
Zum einen benötigst Du vermutlich einen Stack (Keller), und zum Anderen eine Zustandsübergangstabelle. Der Keller hat aber mit der Übergangstabelle nichts zu tun. Für die Übergänge (Y',Z') bei Eingabezeichen X, Zustand Y und Kellerzustand Z) verwendest Du ein statisches 3D-'Array of TÜebergang', so etwa:
Delphi-Quellcode:
Sei nun ZT so eine Tabelle, e das Eingabezeichen, z der aktuelle Zustand und k der aktuelle Kellerzustand, dann findest Du den nächsten Zustand so:
Type
TEingabezeichenklasse = (ezA, ezB, ezIllegal); // Dein Alphabet TZustand = (zsNeutral, zsMehrAalsB, zsMehrBalsA, zsFehler); // Deine DEA-Knoten TKellerZustand = (kzA, kzB); // Deine Kellerzustände, kann aber Quark sein TUebergang = Record ZustandNeu : TZustand; KellerzustandNeu : TKellerZustand; End; TZustandsuebergangstabelle = Array [TEingabezeichenklasse,TZustand, TKellerZustand] Of TUebergang;
Delphi-Quellcode:
Var
ZT : TZustandsuebergangstabelle; e : TEingabezeichenklasse; z : TZustand; k : TKellerzustand; Begin ... DerNeueZustand := ZT[e,z,k].ZustandNeu; DerNeueKellerzustand := ZT[e,z,k].KellerzustandNeu; ... |
Re: Arrays mit drei Dimensionen... nicht einfach -.-
edit: hehe, mein beitrag war fehl am platz... :freak:
:wall: |
Re: Arrays mit drei Dimensionen... nicht einfach -.-
Hoi Leutz,
Sorry, mkinzler, aber dein Modell trifft leider nicht ganz das, was ich brauche, denn das ist ja der Stack/Keller, den ich schon programmiert habe. Ich brauche ja noch den Automaten, der einen Stack benutzt. Dein Ansatz gefällt mir, alzaimar. Aber was soll das mit
Delphi-Quellcode:
? Ist das eine Variable?
TUebergangstabelle = array [TEingabe,TZustand,TKellerZustand] of TUebergang;
Vielen Dank schon mal, viel Hilfe von euch hilft mir, Leute! Weiter so, pls! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz