amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > C - Strukturen strukturieren ... [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

23.11.2005, 09:42 Uhr

hawe
Posts: 130
Nutzer
Hallo zusammen,
ich hab da mal 'ne Frage...

... wie kann ich folgendes Problem lösen. Ich habe eine Struktur für
eine Message die aus einer Header- und einer Datenstruktur besteht.
Die Headerstruktur ist fest die Datenstruktur je nach Datenobjekt
unterschiedlich. Folgendes habe ich mir gedacht:

struckt {
struct header;
struct data
} message;

struct {
word eins;
word zwei;
...
} header;

// Message Strukturen
struct {
struct irgendwas;
word data;
} data1;

struct {
char ;
word ;
string
} data2;
usw.

soweit denke ich liege ich noch nicht so falsch. Aber was mache ich
mit der "struct data"? hier gibt es verschieden Strukturen, jenachdem
was ich übertragen möchte. Der Header enthält ein Kennzeichen was an
daten kommt.

Ach ja noch etwas, ist es besser in der Struct message für die
Headerinformationen eine Struktur zu bemühen oder soll ich die
Informationen direkt in die Message schreiben?

--
cu
hawe

[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 09:47 Uhr

Holger
Posts: 8116
Nutzer
Was Du brauchst ist entweder union oder pointer. Die Grundlagen dazu sollte jedes C-Buch enthalten.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 10:16 Uhr

hawe
Posts: 130
Nutzer
Zitat:
Original von Holger:
Was Du brauchst ist entweder union oder pointer.


Ich hab's befürchtet. Werde dann wohl Pointer nehmen. Eine
Randbedingung ist, ich habe nur sehr wenig RAM zur Verfügung. Muss
also alles zur Laufzeit zusammenbauen wenn es gesendet werden soll.


--
cu
hawe

[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 10:50 Uhr

thomas
Posts: 7718
Nutzer

Also ich fände eine union deutlich sinnvoller.

code:
struct {
  struct header;
  union data;
} message;

struct header {
  word eins;
  word zwei;
  ...
};

union data {

  // Message Strukturen
  struct data1 {
    struct irgendwas;
    word data;
  };

  struct data2{
    char ;
    word ;
    string
  };
  usw.

};


Dann greifst du auf data1 zu mit message.data.data1.irgendwas. Ist doch nicht zu kompliziert.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 11:25 Uhr

fisch08
Posts: 692
Nutzer
@hawe:

Also wenn du Angst vor Pointern hast, bist du bei C/C++ einfach falsch.

Ich würde den data Type als Void* deklarieren und zur Laufzeit den Speicher reservieren:

.data=malloc(sizeof(data1));
oder
.data=malloc(sizeof(data2));

usw.

Das hat den Vorteil, dass der Speicher erst zur Laufzeit reserviert bzw. freigegeben wird.

Auf welchem System programmierst du denn, dass die paar Bytes ausschlaggebend sind? Microcontroller? Wenn ja, wären vielleicht unions angebrachter. Rest siehe dir in jedem beliebigen C-Buch an.

Gruß
Fisch08





--
Um den Spamfilter zu umgehen: Bei direkter Antwort per Mail bitte "[Amiga]" ins Subject: Nur so 100%ige Garantie, dass man nicht im Filter landet!

[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 12:55 Uhr

hawe
Posts: 130
Nutzer
Original von fisch08:
Also wenn du Angst vor Pointern hast, bist du bei C/C++ einfach falsch.
[/quote]
Nee, Angst nicht. Finde die Dinger nur unhandlich und läßtig.


Zitat:
Ich würde den data Type als Void* deklarieren und zur Laufzeit den Speicher reservieren:

.data=malloc(sizeof(data1));
oder
.data=malloc(sizeof(data2));

usw.

Das hat den Vorteil, dass der Speicher erst zur Laufzeit reserviert bzw. freigegeben wird.

An Void* habe ich gar nicht gedacht...


Zitat:
Auf welchem System programmierst du denn, dass die paar Bytes ausschlaggebend sind? Microcontroller? Wenn ja, wären vielleicht unions angebrachter. Rest siehe dir in jedem beliebigen C-Buch an.
Ja, sind Microcontroller. Soll nen verteiletes System mit Sensoren und
Aktoren die über einen Bus verbunden sind werden.


--
cu
hawe

[ Dieser Beitrag wurde von hawe am 23.11.2005 um 12:56 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 13:01 Uhr

hawe
Posts: 130
Nutzer
Zitat:
Original von thomas:

Also ich fände eine union deutlich sinnvoller.
...
Dann greifst du auf data1 zu mit message.data.data1.irgendwas. Ist doch nicht zu kompliziert.

Ja eine union hat auch ihren Charm. Dann hätte ich im Eingangspuffer
immer genug Platz für die längste Message. Muss ich mal ausprobieren
und Bytes zählen.

--
cu
hawe

[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 13:08 Uhr

bubblebobble
Posts: 707
Nutzer
Eine Union würde ich nehmen, wenn die Structuren alles
in etwa gleich gross sind. Wenn eine aber sehr gross und selten ist,
die anderen aberklein und häufig, wäre eine Union Speicherverschwendung.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de



[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 13:44 Uhr

hawe
Posts: 130
Nutzer
Zitat:
Original von bubblebobble:
Eine Union würde ich nehmen, wenn die Structuren alles
in etwa gleich gross sind. Wenn eine aber sehr gross und selten ist,
die anderen aberklein und häufig, wäre eine Union Speicherverschwendung.


Mhh, warum? Da ich nicht weiss wann welche Message zur Laufzeit
eintrifft muss der Eingangspuffer immer die längste Message aufnehmen
können, auch wenn sie nur selten kommt.

Für den Augangspuffer sieht die Sache schon wieder anders aus. Hier
denke ich darüber nach das ganze über pointer zu realisieren um dann
zu Laufzeit die Daten dynamisch auszugeben ohne zusätzliches RAM für
den Wert und den Ausgangspuffer zu verwenden. Ich muss aber wohl noch
mal über das Busprotokoll nachdenken ...

1k RAM ist nicht viel, naja früher war das schon ne ganze Menge aber
irgendwie bin ich mittlerwile recht verwöhnt und sehr verschwenderisch
geworden.




--
cu
hawe

[ - Antworten - Zitieren - Direktlink - ]

23.11.2005, 14:31 Uhr

fisch08
Posts: 692
Nutzer
> Nee, Angst nicht. Finde die Dinger nur unhandlich und läßtig.

Hm. So schlimm sind die nun auch wieder nicht. Hat man sich einmal daran gewöhnt, klappt das soweit.

> An Void* habe ich gar nicht gedacht...

Der void* ist halt nicht an einem Typ gebunden. Für dein Fall vielleicht passend, aber das hängt von deiner MCU ab und wie viel RAM-Speicher du hast. Ich hatte vor einiger Zeit mal das Problem, dass ich zu wenig RAM Speicher hatte (gesamt 4 KByte), aber das Busprotokoll brauchte zuviel. Somit waren mir insoweit bereits die Hänge gebunden, wenn ich nur eine Unterfunktion aufrufen wollte. Das war ein Mistcode...

Wie gesagt: Pointer sind auch nur Strukturen und Arten, an die man sich gewöhnen kann/muß. C ist nunmal maschinenorientiert. So'n Pech aber auch. ;-)

Gruß
Fisch08


--
Um den Spamfilter zu umgehen: Bei direkter Antwort per Mail bitte "[Amiga]" ins Subject: Nur so 100%ige Garantie, dass man nicht im Filter landet!

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > C - Strukturen strukturieren ... [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.