AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Daten organisieren

Ein Thema von Lenny15 · begonnen am 5. Jan 2007 · letzter Beitrag vom 5. Jan 2007
Antwort Antwort
Lenny15

Registriert seit: 5. Jan 2007
10 Beiträge
 
#1

Daten organisieren

  Alt 5. Jan 2007, 15:53
Hallo, dies ist mein erster Beitrag. Ich hoffe mal ich krieg das hin mein Problem zu schildern.
Ich entschuldige mich gleich für den Thread-Titel, ich wusste nicht wie ich mein Problem besser präzisieren sollte.

Ich bin dabei eine Datei zu parsen und verschiedene Datenstrukturen da rauszuparsen.
Hier mal ein paar Beispiele:

PlayerAmmo: byte, byte
TextMsg : byte, Pchar
Status : short
PlayerH : byte
Score : byte, byte, byte
..
...

Zusätzlich zu diesen Informationen beinhaltet jede Struktur ein TimeStamp und eine Signatur um zu erkennen um welche Datenstruktur es sich handelt.

Da es sich hier um sogenannte "GameMessages" handelt, wollte ich diese in einem record verallgemeinern und ein Array draus machen.
(Es gibt noch mehr Informationen, die ich rausparse).
Sortiert soll das nach dem Offset bzw. gleichzeitig dann auch nach dem Timestamp sein. (Messages sind konsekutiv nach dem Zeitablauf angeordnet)

Delphi-Quellcode:
const
  MSG_TXT: 1;
  MSG_SCORE: 2;

type
   TXT_MSG = record;
     ID : byte;
     TXT : String;
   end;
   SCORE_MSG = record;
     KScore: byte;
     DScore: byte;
     EScore: byte;
   end;
   .......
  
  GAME_MESSAGE = record
    OffSet : Integer;
    Typ : Integer;
    case Typ of
      MSG_TXT: MESSAGE: TXT_MSG;
      SCORE : MESSAGE: SCORE_MSG;
      ...
  end;

var
 ALL_MESSAGES: Array of GAME_MESSAGE;
Natürlich geht das so nicht mit case im record. Aber ich weiss sonst nicht wie ich die verschiedenen Messages zusammenfassen soll, weil ich ja am Ende alles sortiert nach Timestamps anzeigen will. Also muss irgendwie alles in ein großes sortierbares Array. Zudem will ich am Ende noch Messages rausfiltern können aus der Anzeige im Memo. Das würde bedeuten jedesmal wieder den Record durchzugehen (wenn ich denn erstmal eins hätte, das damit klappt) und die Messages nicht ins Memo zu kopieren, welche im Filter angegeben sind.
Egal wie ich es drehe, irgendeine Aufgabe scheint unheimlich kompliziert und mein Programm rödelt stundenlang an einem 80 MB grossen File rum um eine Art von Message da rauszuparsen und anzuzeigen. :S

Ich hoffe ihr habt eine Idee, wie ich das effizient hinbekomme.
Danke schonmal im vorraus.

Lenny
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Daten organisieren

  Alt 5. Jan 2007, 15:57
Kannst Du mal bitte ein bis drei Datensätze als Beispiel bringen.
Wäre für das Verständnis nicht schlecht.

Sind denn alle Datensätze gleich lang?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Lenny15

Registriert seit: 5. Jan 2007
10 Beiträge
 
#3

Re: Daten organisieren

  Alt 5. Jan 2007, 16:10
Wie ich oben schon schrieb:

PlayerAmmo: byte, byte
TextMsg : byte, Pchar
Status : short
PlayerH : byte
Score : byte, byte, byte

Zum Beispiel bei TextMsg, weisst man von vornherein nicht wie lang das ganze sein wird, da es ein Pchar beinhaltet, welches erst durch ein $00 beendet wird. Und alle Messages sind verschieden lang, wie man oben sieht.

Delphi-Quellcode:
PlayerAmmo: /in Sekunden\
  /Signatur\ /Timestamp: Single\ AM1 AM2
$00 $22 $01 $55 $DC $5C $9B $41 $9C $04 $12

TextMsg: /in Sekunden\
  /Signatur\ /Timestamp: Single\ ID Pchar ---------------------|
$00 $22 $05 $87 $28 $DB $B8 $42 $B5 $C3 "Hey, das war lustig!" + $00
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Daten organisieren

  Alt 5. Jan 2007, 16:23
Ich würde von Records nach Klassen umsteigen.
Hier die Basisklasse als ganz grober Entwurf:
Delphi-Quellcode:
TGameMessage=class(TPersistent)
public
   property Offset:integer;
   property Typ:Integer;
   property TimeStamp:TDateTime;
end;
Von dieser Basisklasse gibt es nun diverse Ableitungen:
Delphi-Quellcode:
TTextMessage=class(TGameMessage)
public
   property Text:string;
   property ID:byte;
end;
Alle Objekte werden in einer TObjectList gespeichert.
Da Objekte im Stack ja dynamisch angelegt werden, ist damit das Problem mit den unterschiedlich langen Messages erschlagen.
Andreas
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Daten organisieren

  Alt 5. Jan 2007, 16:33
Hallo,

mit dem Case geht, man muss sich nur an die korrekte Syntax halten.
siehe Hilfe "Variante Teile in Record-Typen"
Delphi-Quellcode:
type
  TTestRec = record
    case MyType: Integer of
      0:
         (i: Integer;
          j: Integer);
      1:
         (b: Byte);
  end;
Ich würde aber ebenfalls Klassen benutzen,
eine Basisklasse mit den gemeinsamen properties
und für jeden Type eine abgeleitete.


Heiko
Heiko
  Mit Zitat antworten Zitat
Lenny15

Registriert seit: 5. Jan 2007
10 Beiträge
 
#6

Re: Daten organisieren

  Alt 5. Jan 2007, 16:33
Zitat:
Da Objekte im Stack ja dynamisch angelegt werden, ist damit das Problem mit den unterschiedlich langen Messages erschlagen.
Danke. Das mit den Klassen sieht gut aus. Ich schau mir gleich an wie das so funktioniert.
Dachte bisher mit Klassen organisiert man nur Funktionen zum erledigen verschiedener Aufgaben, wusste nicht, dass die auch zum "verpacken" von Daten zu gebrauchen sind.

Dankeschön. (Diese Seite scheint nur so voller Informationen zu Delphi zu strotzen, ich finde bestimmt viel zu Klassen).
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Daten organisieren

  Alt 5. Jan 2007, 16:46
Zitat von Lenny15:
Dachte bisher mit Klassen organisiert man nur Funktionen zum erledigen verschiedener Aufgaben, wusste nicht, dass die auch zum "verpacken" von Daten zu gebrauchen sind.
Du wirst bestimmt auch noch Funktionen (=Methoden) zu diesen Klassen hinzufügen.
Du könntest z.B. folgende Methode einbauen:
Delphi-Quellcode:
TGameMessage=class(TPersistent)
public
   function DumpData:string; virtual; // <==========
   property Offset:integer;
   property Typ:Integer;
   property TimeStamp:TDateTime;
end;

function TGameMessage.DumpData:string; // <==========
begin
   Result := Format('Typ=%d Offset=%x TimeStamp=%s', [Typ, Offset, DateTimeToStr(TimeStamp)]);
end;
Später kannst du dann die Liste deiner Objekte durchgehen, jeweils DumpData aufrufen und z.B. in ein TMemo schreiben.
Die Methode ist virtuell, damit sie von den abgeleiteten Klassen überladen werden kann:
Delphi-Quellcode:
function TTextMessage.DumpData:string;
begin
   result := inherited DumpData + Format(', Text=<%s>', [Text]);
end;
Andreas
  Mit Zitat antworten Zitat
Lenny15

Registriert seit: 5. Jan 2007
10 Beiträge
 
#8

Re: Daten organisieren

  Alt 5. Jan 2007, 16:52
Stimmt. Die Kombination macht Klassen unheimlich praktisch. Ich weiss auch schon ungefähr wie das ganze aussehen wird. Aber besser man plant schön alles vorher, bevor man es Mitten im entwickeln wieder bereut.
Vielen Dank shmia
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.
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