AGB  ·  Datenschutz  ·  Impressum  







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

Untypisierte Daten wieder auslesen

Ein Thema von Wusel · begonnen am 17. Jan 2004 · letzter Beitrag vom 26. Jan 2004
Antwort Antwort
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#1

Untypisierte Daten wieder auslesen

  Alt 17. Jan 2004, 15:50
Hi Leute
Ich hab da ein kleines Problem beim auslesen untypisierte Daten aus einer TList.
hier erstmal der Code:
Delphi-Quellcode:
type
  THanoiList = class(TList)
  ...
  end;

procedure THanoiList.AddMove(aiFrom, aiTo : Integer);
Var
  pCur : PByte;
  bDS : Byte;
begin
  if dwClusterFill >= dwClusterSize shl 1 then
    AddCluster;
  if (aiFrom in [0..2]) and (aiTo in [0..2]) then
    begin
      bDS := aiFrom or (aiTo shl 2);
      pCur := Last;
      Inc(pCur, dwClusterFill shr 1);
      if (dwClusterFill and 1) = 0 then
        pCur^ := bDS
      else
        pCur^ := pCur^ or (bDS shl 4);
    end
end;

procedure THanoiList.GetMove(aiIndex : Int64; var iFrom, iTo : Integer);
Var
  pCur : PByte;
  bDS : Byte;
begin
  if Count = 1 then
    begin
      pCur := Last;
      Inc(pCur, aiIndex shr 1);
      if (aiIndex and 1) = 0 then
          bDS := pCur^
      else
        bDS := pCur^ shr 4;
    end;
  iTo := bDS shr 2;
  iFrom := bDS and (iTo shl 2);
end;
Bei GetMove hab ich irgendeinen Fehler gemacht, den ich leider nicht finde. Nach meiner Logik funktioniert es eigentlich aber nicht nach Delphis Logik

Kann mir vielleicht einer von euch sagen wo der Fehler steckt?

Schonmal vielen Dank an euch
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Untypisierte Daten wieder auslesen

  Alt 17. Jan 2004, 16:59
Ähm, irgendwie versteh ich gar nicht was du hier machst. Was sollen die funktionen machen? Ich benutz bei TList immer nur Add und solche grundlegenen funktionen um die pointer zu speichern
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#3

Re: Untypisierte Daten wieder auslesen

  Alt 17. Jan 2004, 18:41
Die Items der TList dienen nur als Cluster, in die ich die Daten speichere. Aber die TList spielt bei meinem jetzigen Problem eigentlich garkeine Rolle, weil ich erstmal nur davon ausgehe dass die Daten nur im 1. Element der Liste stehen.
Hilfe zur Verständniss:
aiIndex gibt dann an, die wievielte Information (bei meinem Beispiel die wievielte Bewegung) es ausgeben soll. Diese Information (2 Integer Werte) soll es in bDS speichern und dann voneinander trennen und getrennt ausgeben.
Nur leider funktioniert das bei mir mit dem richtigen und getrennten ausgeben noch nicht richtig.
  Mit Zitat antworten Zitat
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#4

Re: Untypisierte Daten wieder auslesen

  Alt 18. Jan 2004, 20:56
Zitat von Wusel:
Kann mir vielleicht einer von euch sagen wo der Fehler steckt?
Keiner?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#5

Re: Untypisierte Daten wieder auslesen

  Alt 23. Jan 2004, 18:36
Zitat von SirThornberry:
Ähm, irgendwie versteh ich gar nicht was du hier machst. Was sollen die funktionen machen? Ich benutz bei TList immer nur Add und solche grundlegenen funktionen um die pointer zu speichern
Er sollte 4 Bit Datensätze im Speicher ablegen!

Übrigens, man Klassen ableiten und für was neues Modifizieren!
Vielleicht ist Wusel so liebt und Posted noch mal die Lösung!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#6

Re: Untypisierte Daten wieder auslesen

  Alt 25. Jan 2004, 09:47
Klar
Hier mal die ganze Unit und das untere ist das, was ich eigentlich wissen wollte:

Delphi-Quellcode:
unit HanoiList;

interface

uses
  Classes, SysUtils;

const
  cSg = 'HANOI1';

type
  EHanoiList = class(Exception);

  THanoiListHeader = packed record
    cSg : array [0..5] of char;
    dwDiscs,
    dwClusterFill,
    dwClusterSize,
    dwClusterCount : Cardinal;
  end;

  THanoiList = class(TList)
  private
    dwClusterSize, // Größe eines Blockes in Byte
    dwDiscs, // Anzahl der bearbeiteten Scheiben
    dwClusterFill : Cardinal; // Zeigt auf neuen DS in letzten Block
      // (log. Einheiten)

    procedure AddCluster;
      // fügt neuen Datenblock in die Liste ein

  // -- properties --
    function GetMoveCount : Int64;
  protected
    procedure Notify(Ptr: Pointer; Action : TListNotification); override;
  public
    constructor Create(adwClusterSize, adwDiscs : Cardinal);
      // adwClusterSize: siehe dwClusterSize
    constructor LoadFromStream(astm : TStream);
    constructor LoadFromFile(const asFileName : String);

    procedure SaveToStream(astm : TStream);
    procedure SaveToFile(const asFileName : String);

    procedure AddMove(aiFrom, aiTo : Integer);
      // Fügt neuen DS an das Ende an
      // aiFrom, aiTo: Stab-bewegung (0..2 nur sinnvoll)
    procedure GetMove(aiIndex : Int64; var iFrom, iTo : Integer);
      // Holt einen DS
      // aiIndex: log. Position

    property MoveCount : Int64 read GetMoveCount;
  end;

implementation

constructor THanoiList.Create(adwClusterSize, adwDiscs : Cardinal);
begin
  inherited Create;
  dwClusterSize := adwClusterSize;
  dwDiscs := adwDiscs;
  AddCluster;
end;

constructor THanoiList.LoadFromStream(astm : TStream);
Var fHead : THanoiListHeader;
    i : Integer;
    pTmp : Pointer;
begin
  inherited Create;

  astm.Read(fHead, SizeOf(fHead));
  if not CompareMem(@fHead.cSg, PChar(cSg), 6) then
     raise EHanoiList.Create('LoadFromStream - Datei ist ungültig (Signatur)!');

  dwClusterSize := fHead.dwClusterSize;
  dwDiscs := fHead.dwDiscs;
  dwClusterFill := fHead.dwClusterFill;

  for i := 0 to fHead.dwClusterCount - 1 do
      begin
        GetMem(pTmp, dwClusterSize);
        astm.Read(pTmp^, dwClusterSize);
        Add(pTmp);
      end;
end;

constructor THanoiList.LoadFromFile(const asFileName : String);
Var stm : TFileStream;
begin
  stm := TFileStream.Create(asFileName, fmOpenRead);
  try
    LoadFromStream(stm);
  finally
    stm.Free;
  end;
end;

procedure THanoiList.AddCluster;
Var pTemp : Pointer;
begin
  dwClusterFill := 0;
  GetMem(pTemp, dwClusterSize);
  Add(pTemp);
end;

procedure THanoiList.AddMove(aiFrom, aiTo : Integer);
Var pCur : PByte;
    bDS : Byte;
begin
  if dwClusterFill >= dwClusterSize shl 1 then
    AddCluster;
  if (aiFrom in [0..2]) and (aiTo in [0..2]) then
     begin
       bDS := aiFrom or (aiTo shl 2);
       pCur := Last;
       Inc(pCur, dwClusterFill shr 1);
       if (dwClusterFill and 1) = 0 then
          pCur^ := bDS
       else
          pCur^ := pCur^ or (bDS shl 4);
       Inc(dwClusterFill);
     end
   else
     raise EHanoiList.Create('AddMove - aiFrom oder aiTo außerhalb des zulässigen Bereichs!!!');
end;

procedure THanoiList.GetMove(aiIndex : Int64; var iFrom, iTo : Integer);
Var pCur : PByte;
    bDS : Byte;
    iCluster,
    iCur : Integer;
begin
  // In welchem Block steht der Datensatz
  iCluster := (aiIndex shr 1) div dwClusterSize;

  if iCluster >= Count then
     raise EHanoiList.Create('GetMove - Index außerhalb des zulässigen Bereiches!');

  pCur := Items[iCluster];

  iCur := aiIndex mod (dwClusterSize shl 1);
  Inc(pCur, iCur shr 1);

  if (iCur and 1) = 0 then
     bDS := pCur^ and $F
  else
     bDS := pCur^ shr 4;

  iTo := bDS shr 2;
  iFrom := bDS and 3;
end;

procedure THanoiList.Notify(Ptr: Pointer; Action : TListNotification);
begin
  if Action = lnDeleted then
    FreeMem(Ptr);
end;

function THanoiList.GetMoveCount : Int64;
begin
  Result := (dwClusterSize shl 1) * (Count - 1) + dwClusterFill;
end;

procedure THanoiList.SaveToStream(astm : TStream);
Var fHead : THanoiListHeader;
    i : Integer;
begin
  StrLCopy(fHead.cSg, PChar(cSg), 6);

  fHead.dwClusterCount := Count;
  fHead.dwDiscs := dwDiscs;
  fHead.dwClusterSize := dwClusterSize;
  fHead.dwClusterFill := dwClusterFill;

  astm.Write(fHead, SizeOf(fHead));

  for i := 0 to Count - 1 do
      astm.Write(Items[i]^, dwClusterSize);
end;

procedure THanoiList.SaveToFile(const asFileName : String);
Var stm : TFileStream;
begin
  stm := TFileStream.Create(asFileName, fmCreate);
  try
    SaveToStream(stm);
  finally
    stm.Free;
  end;
end;

end.
Delphi-Quellcode:
procedure THanoiList.GetMove(aiIndex : Int64; var iFrom, iTo : Integer);
Var pCur : PByte;
    bDS : Byte;
    iCluster,
    iCur : Integer;
begin
  // In welchem Block steht der Datensatz
  iCluster := (aiIndex shr 1) div dwClusterSize;

  if iCluster >= Count then
     raise EHanoiList.Create('GetMove - Index außerhalb des zulässigen Bereiches!');

  pCur := Items[iCluster];

  iCur := aiIndex mod (dwClusterSize shl 1);
  Inc(pCur, iCur shr 1);

  if (iCur and 1) = 0 then
     bDS := pCur^ and $F
  else
     bDS := pCur^ shr 4;

  iTo := bDS shr 2;
  iFrom := bDS and 3;
end;
Vielleicht erkennt ja jemand worums geht
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Untypisierte Daten wieder auslesen

  Alt 25. Jan 2004, 10:43
Hi,
könntest du bitte solche langen Sourcecodes als Anhang anhängen!? Danke.

Chris
  Mit Zitat antworten Zitat
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#8

Re: Untypisierte Daten wieder auslesen

  Alt 26. Jan 2004, 17:15
Kann den Beitrag oben leider nichtmehr editieren. Trotzdem hier nochmal als Anhang.
Das nächste mal mache ich es gleich richtig
Angehängte Dateien
Dateityp: pas hanoilist.pas (4,6 KB, 2x aufgerufen)
  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 22:42 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