AGB  ·  Datenschutz  ·  Impressum  







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

[Gelöst] Verwendung von TQueue

Ein Thema von MrMooed · begonnen am 13. Okt 2012 · letzter Beitrag vom 14. Okt 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.752 Beiträge
 
Delphi 12 Athens
 
#1

AW: Verwendung von TStack

  Alt 13. Okt 2012, 19:16
Weil Delphi bei TStack.Push(AItem: TPointer) erwartet. (Was doch soviel bedeutet wie "gib mir einen Zeiger auf deinen Wert"
TStack ist wie TList
Es will einen "Wert", den es speichern kann.
Wie bei TList also nicht einen Zeiger auf einen beliebigen Speicher.
Willst du wirklich einen Pointer speichern, dann müßtest du dafür sorgen, daß der Speicher nicht verloren geht, also z.B. per New einen Speicher vom Typ PWord (du willst ja ein Word speichern) erstellen, diesen puschen und am Ende (nach dem Pop) natürlich nicht das Dispose vergessen, oder du kastes das Word infach in einen Pointer und wieder zurück.

Wie gesagt, diese Variable "Key" ist nach Verlassen der Ereignisprozedur ungültig und damit auch der Zeiger auf sie.



In anktuelleren Delphis (D2009+) könnte man stattdessen auch den generischen Stack nutzen TStack<Word>, welcher direkt den "Wert" speichert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.422 Beiträge
 
Delphi 12 Athens
 
#2

AW: Verwendung von TStack

  Alt 13. Okt 2012, 19:38
Oder einfach den Wert auf Pointer (und später zurück) casten:
Delphi-Quellcode:
procedure TMain.MainKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    70: Tasten.Push(Pointer(Key)); // [F] - LINKS
    74: Tasten.Push(Pointer(Key)); // [J] - RECHTS
    end;
end;
und zurück:
Delphi-Quellcode:
procedure TMain.Timer1Timer(Sender: TObject);
var
  i: ^Integer;
begin
  i := Tasten.Pop;
  case Word(i) of
    70: Spieler[0].dreheLinks;
    74: Spieler[0].dreheRechts;
  darstellen(Sender);
end;
Achtung, TQueue ist die gewünschte Klasse, nicht TStack.

TQueue ist FIFO (First In, First Out), TStack ist FILO (First In, Last Out).

......
Lizbeth W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Verwendung von TStack

  Alt 13. Okt 2012, 19:43
TStack ist wie TList
Es will einen "Wert", den es speichern kann.

Wie gesagt, diese Variable "Key" ist nach Verlassen der Ereignisprozedur ungültig und damit auch der Zeiger auf sie.
Aber wie kann ich ihm den Wert übergeben, wenn er einen Zeiger erwartet stehe da gerade auf dem Schlauch

//Edit:
Argh habe den Post von sakura nicht gesehen. Werde es eben mal so testen

//Edit2:
So wie sakura es vorgeschlagen hat klappt es Das klärt auch meine Frage wie ich ihm einen Wert übergebe wenn er einen Pointer erwartet Vielen Dank an euch

Geändert von MrMooed (13. Okt 2012 um 19:58 Uhr)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Verwendung von TStack

  Alt 13. Okt 2012, 22:00
So wie sakura es vorgeschlagen hat klappt es Das klärt auch meine Frage wie ich ihm einen Wert übergebe wenn er einen Pointer erwartet Vielen Dank an euch
Statt dem Key kannst du ihm auch einen State übergeben.

Delphi-Quellcode:
type
  TDirections = (dirLeft, dirRight);

// ...

case Key of
  70: Tasten.Push(Pointer(dirLeft)); // [F] - LINKS
  74: Tasten.Push(Pointer(dirRight)); // [J] - RECHTS
end;
Ist einfacher, Bezeichner wie "dirLeft" und "dirRight" zu assoziieren, als 70, 74:
Delphi-Quellcode:
procedure TMain.Timer1Timer(Sender: TObject);
var
  i: ^Integer;
begin
  i := Tasten.Pop;
  case TDirection(i) of
    dirLeft: Spieler[0].dreheLinks;
    dirRight: Spieler[0].dreheRechts;
  darstellen(Sender);
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.752 Beiträge
 
Delphi 12 Athens
 
#5

AW: Verwendung von TStack

  Alt 13. Okt 2012, 23:19
Zitat:
Delphi-Quellcode:
var
  i: ^Integer;
begin
  i := Tasten.Pop;
  case TDirection(i) of
Warum nicht "verständlichen" Code schreiben?

Ich weiß auch nicht, was ^Integer aka PInteger mit TDirection ode Pointer zu tun hat.

Hinzu wurde ja doch direkt gecastet. ( TDirections > Pointer )
Warum dann nicht auch rückzu? ( Pointer > PInteger > TDirections )

Delphi-Quellcode:
var
  d: TDirection;
begin
  d := TDirection(Tasten.Pop);
  case d of
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Verwendung von TStack

  Alt 14. Okt 2012, 01:18
Wenn das über Pop so geht, ohne dass der Compiler wegen irgendwas rummeckert, dann noch besser.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.752 Beiträge
 
Delphi 12 Athens
 
#7

AW: Verwendung von TStack

  Alt 14. Okt 2012, 09:27
MinEnumSize für diesen Enum auf 4 stellen (bzw. unter 64 Bit auf 8)

Damit die Typen gleich groß und somit das Casten problemlos geht
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#8

AW: Verwendung von TStack

  Alt 14. Okt 2012, 10:49
Gelöscht
Lars
  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 07:35 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