PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strukturtypen übermitteln



Deever
11-02-2005, 10:44
Hey Amigos, wie geht's?

Ich habe hier mehrere Prozesse oder Threads, die per Shared Memory kommuniziern. Ausgetauscht werden müssen etwa 5 verschiedene Typen von Strukturen. Mein Problem ist jetzt: Wie weiß jetzt der Empfänger, um welchen Strukturtyp es sich handelt?

Folgende Lösungen habe ich mir überlegt:

Ich reserviere als erstes Member einen int oder char, der den Typ definiert
Ich teile jedes Shm Segment in [Anzahl Typen] Abschnitte auf und in jedem Abschnitt dürfen nur Structs eines bestimmten Typs abgelegt werden

1. scheint am einfachsten, jeoch wird dann in jedem Struct zusätzlicher Speicherplatz benötigt, was in erhöhtem Speicherbedarf ausartet, da sehr viele kleinere Strukturen kopiert werden müssen.
2. sieht komplizierter aus, ist aber im Endeffekt sicher einfacher, auch kann ich dann gleich mit Arrays arbeiten.

Im Moment würde ich zu 2. tendieren, aber ich möchte dazu noch eure Meinung hören, und vielleicht gibt es ja noch weitere Wege, die ich vergessen habe?

Vielen Dank für eure Antworten!
Gruß,
/dev

Joghurt
11-02-2005, 13:00
Also ich würde zu 1 tendieren, 4 Byte mehr sind nun nicht so der Overkill, und außerdem werden Structs heutzutage meistens eh auf durch 16 teilbare Adressen gelegt (zumindest bei i386), da der Prozessor so schneller drauf zugreifen kann.
Ob das bei Shared Memory auch gemacht wird, weiss ich nicht, aber ich halte Methode 2 für schlechter, insbesondere, wenn später mal neue strukturen hinzukommen sollen.

Ich würde es wie folgt machen:
typedef struct {
int Type;
union {
struct { ...; } Struct1;
struct { ...; } Struct2;
} u; /* bzw. einfach kein Name, wenn du C++ benutzt */
} InfoStruct;

Deever
11-02-2005, 14:33
Vielen Dank für deine schnelle Antwort!
Es ist noch zu sagen, daß ich für jede übermittelte Struktur eine typ-spezifische Funktion aufrufen muß. Was ist schneller, eine if-Schlaufe oder ein Array mit Funktionszeigern?
if ( struct.typ==1 ) funktion1(&struct);
else if ( struct.typ==2 ) funktion2(&struct);
else if ( struct.typ==3 ) funktion3(&struct);
[...]
else foobar();oder
funktionen[struct.typ](&struct);Die zweite Lösung führt natürlich ins Unheil, wenn in dem Typ-int ein ungültiger Wert gespeichert ist!

Nach ein wenig Programmierung gefällt mir 1. doch auch besser! ;)

Danke && Gruß,
/dev

Joghurt
11-02-2005, 19:00
Möglichkeit 2 ist natürlich schneller, aber auch gefährlich.
Möglichkeit 1 kannst du eleganter mit einem switch lösen
switch (struct.typ) {
case FOOBAR:
blabla;
break;
case HALLIGALLI:
blubb;
break;
default:
Fehler;
}Ich würde übrigens doch anstatt eines integers ein enum Vorschlagen, dann liest sich der Code auch besser
struct {
enum {WAFFEL, KARTOFFEL, HAEHNCHEN, FUSIONSKRAFTWERK} Typ;
...

Noch was: programmierst du C oder C++? In C++ kann man das natürlich noch eleganter lösen