AGB  ·  Datenschutz  ·  Impressum  







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

struct als TBytes nach record?

Ein Thema von Piberg · begonnen am 30. Okt 2007 · letzter Beitrag vom 31. Okt 2007
Antwort Antwort
Piberg

Registriert seit: 6. Jun 2006
6 Beiträge
 
Delphi 2006 Architect
 
#1

struct als TBytes nach record?

  Alt 30. Okt 2007, 17:16
Hallo Forum!

Nachdem ich einige Threads durchgeschaut habe, konnte ich diesen C++struct

Code:
typedef struct {
  short enable ;
  short side ;
  short angle ;
  short x ;
  short y ;
} pos_t ;

typedef struct {
  char name[16] ;
  short masse;
} obj_t ;

/* und endlich */
typedef struct {
  char pmode ;   /* nimmt Werte eines enum auf z.B. (pm_null, pm_1, pm_2) */
  obj_t figure[2] ;
  pos_t pos[3] ;
  short time ;
} info_t ;
in folgende Delphi-Typen überführen: (Hoffentlich ist es richtig. Bin für jede Bemerkung dankbar.)

Delphi-Quellcode:
type pos_t = packed record
  enable,
  side,
  angle,
  x, y : Smallint ;
end;

type obj_t = packed record
  name : string[16] ; // oder : array [0..15] of char ???
  masse: Smallint ;
end;

// und endlich
type info_t = packed record
  pmode : (pm_null, pm_1, pm_2) ;
  figure: array [0..1] of obj_t ;
  pos : array [0..2] of pos_t ;
  time : Smallint ;
end;


Jetzt zum eigentlichen Problem. Und zwar konnecte ich von Delphi aus zu einem Linux-Programm, das mir
das o.g. struct info_t über UDP sendet.
Dieses kann ich dann mit dem UDPRead-Ereignis von Indys idUDPServer empfangen. Die Daten sind dann im
Parameter AData vom Typ TBytes gespeichert.
Ach ja, ich muss noch erwähnen, dass es unterschiedliche structs verschickt werden. Das da Oben, war nur
ein kurzes Beispiel. Was sie nur gemeinsam haben ist pmode, anhand dessen ich unterscheiden kann,
was das nun fürn struct-Typ angekommen ist.

Und nun meine Frage:
Wie kann ich die empfangenen Bytes von AData nach mein record speichern? Ich muss ja auch zuerst
an pmode ran, um feststellen zu können, ob ich in mein info_t record oder ein anders
nehme.

Und bei der Gelegenheit noch ne Frage zur Typenwandlung:
Muss in diesem Fall wirklich ein packed record sein?


Danke im Voraus
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: struct als TBytes nach record?

  Alt 30. Okt 2007, 17:19
Ich würde das packed mal weglassen. AFAIK richten C-Compiler Strukturen auch auf 4 Byte aus, bin aber da nicht ganz sicher.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: struct als TBytes nach record?

  Alt 30. Okt 2007, 17:32
Du solltest keine Shortstrings verwenden, da in diesen noch ein Längenbyte ist. Also, wie du selbst vorgeschlagen hast, besser ein array[0..15] of char nehmen. Wenn ich mit den Indys Records empfangen habe, habe ich das immer so gemacht: Erstmal TBytes empfangen. TBytes ist ein dynamisches Array, also ein Zeiger auf eine Byte-Folge. Das ganze habe ich in den Zeigertyp des Records gecastet und gerne auch mal mit with umschlossen, also so:
Delphi-Quellcode:
var rec: TMeinRecord; Bytes: TBytes;
begin
IdTCPClient1.ReadBytes(Bytes, SizeOf(TMeinRecord));
rec:=PMeinRecord(Bytes)^;
//oder auch
with PMeinRecord(Bytes)^ do
  begin
  end;
end;
Das ganze ist ungetestet, es kann sein, dass ich die Syntax nicht mehr ganz im Kopf habe.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: struct als TBytes nach record?

  Alt 30. Okt 2007, 17:33
Moin Piberg,

name : string[16] ; // oder : array [0..15] of char ??? ich plädiere hier für das Oder

Ein ShortString enthält auf Index 0 noch die Länge, er würde also die Struktur stören.

Ob Du nun packed nehmen solltest, oder sogar eine spezielle $ALIGN-Einstellung benötigst, hängt davon ab, mit welchem Alignment die Strukur compiliert werden soll.

Um die Daten zu übertragen könntest Du einfach einen varianten Record nehmen, der alle möglichen Strukturen enthält.
U.A. auch eines vom Typ TBytes, dass Du dann der Funktion zum Füllen übergeben kannst.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: struct als TBytes nach record?

  Alt 30. Okt 2007, 17:39
Variante Records sind zwar grundsätzlich eine gute Idee, aber ich bezweifle, dass das mit TBytes funktioniert. In IdGlobal (Indy 10) ist TBytes als array of Byte deklariert, und wie bereits gesagt sind dynamische Arrays Zeiger.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: struct als TBytes nach record?

  Alt 30. Okt 2007, 17:45
ich würde einfach einen Pointertyp des Records erstellen und dann darüber zugreifen:
Delphi-Quellcode:
type
  PInfo_t = ^info_t;

[...]

var
  lInfo: PInfo_t;
begin
  lInfo = @TBytesParameter[0];
  //do anything with lInfo^.pmode etc.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Piberg

Registriert seit: 6. Jun 2006
6 Beiträge
 
Delphi 2006 Architect
 
#7

Re: struct als TBytes nach record?

  Alt 31. Okt 2007, 07:58
Hallo Leute.
Erstmal vielen Dank für die raschen Antworten. Es ist nämlich genau das, was ich wissen wollte.
Ich war mir nicht sicher, von welcher Seite ich mich an die empfangenen Bytes ranmachen sollte
und wollte wissen, wie das die anderen, die vielleciht mehr Erfahrung haben, machen würden.

Naja, ich werde noch ausprobieren müssen, welches record (packed oder nicht) ich nehmen werde,
denn leider weiss ich nicht, mit welchen Compiler-Einstellungen, das Gegenprogramm, das unter
Linux läuft compilert wurde.

Auf jeden Fall grosses Dankeschön an Alle
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: struct als TBytes nach record?

  Alt 31. Okt 2007, 08:16
Zitat von Piberg:
Naja, ich werde noch ausprobieren müssen, welches record (packed oder nicht) ich nehmen werde
Am Einfachsten erstmal nachsehn wie groß die empfangenen Recorddaten sind.
Wenn ich micht jetzt nich verrechnet hab, dann wäre der Record packed 51 Byte groß
und unpacked demnach eventuell größer.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 17:06 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