Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arrays mit drei Dimensionen... nicht einfach -.- (https://www.delphipraxis.net/103286-arrays-mit-drei-dimensionen-nicht-einfach.html)

mkinzler 13. Nov 2007 20:19

Re: Arrays mit drei Dimensionen... nicht einfach -.-
 
Delphi-Quellcode:
Keller[<Index>].Kellerzustand

ArchaicSeraphim 13. Nov 2007 20:23

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:
Keller[<Index>].Kellerzustand
auch mal erklären, pls? Ich bin halt schwer von Begriff... :pale:

mkinzler 13. Nov 2007 20:30

Re: Arrays mit drei Dimensionen... nicht einfach -.-
 
Delphi-Quellcode:
var
    Kellerelemente: array of TKeller;
   zustand: Integer;
...
  //Zustand des Rootelements
  zustand := Kellerelemente[0].Kellerzustand;
Records sind nicht dynamisch

ArchaicSeraphim 13. Nov 2007 20:40

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

mkinzler 13. Nov 2007 20:49

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?

ArchaicSeraphim 13. Nov 2007 20:51

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! ^^

mkinzler 13. Nov 2007 21:06

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:
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.
Deklaration von Konstanten für die Operationen:

Delphi-Quellcode:
const
    action_push=0;
    action_pop=1;
Record für Zustände:

Delphi-Quellcode:
TZustaende = Record
   Name: string;
   Input1: char;
   Input2: Integer;
   Folgezustand: String;
   Operation: byte;
end;
Du Zustaende würde ich auch in einer Liste verwalten

alzaimar 14. Nov 2007 06:47

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:
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;
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:
Delphi-Quellcode:
Var
  ZT : TZustandsuebergangstabelle;
  e : TEingabezeichenklasse;
  z : TZustand;
  k : TKellerzustand;

Begin
 ...
 DerNeueZustand := ZT[e,z,k].ZustandNeu;
 DerNeueKellerzustand := ZT[e,z,k].KellerzustandNeu;
...

mr_emre_d 14. Nov 2007 13:35

Re: Arrays mit drei Dimensionen... nicht einfach -.-
 
edit: hehe, mein beitrag war fehl am platz... :freak:
:wall:

ArchaicSeraphim 14. Nov 2007 16:31

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:
TUebergangstabelle = array [TEingabe,TZustand,TKellerZustand] of TUebergang;
? Ist das eine Variable?

Vielen Dank schon mal, viel Hilfe von euch hilft mir, Leute! Weiter so, pls!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz