PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : struktur in C



chogle
17.02.2005, 21:54
folgende Frage:

Ich habe Variablen von versch. Variablentypen welche ich in eine Struktur abfüllen möchte. Von der Struktur weiss ich in welcher Reihenfolge welche Variablentypen kommen und welche grösse die haben (zb von den Arrays). Ich kenne aber die Namen nicht der einzelnen Variablen in der Struktur, habe nur den Pointer auf die Struktur.
Ist die Adresse des Pointers die Gleiche wie die erste Variable in der Struktur? und wäre es dann möglech (angenommen die erste Variable in der Struktur wäre ein int) mit dem pointer + 4 (angenommen ein standart 32 bit prozessor) auf die zweite Variable zuzugreifen?

Oder gibt es da in C eine andere Vorgehensweise/Syntax?

engineer
18.02.2005, 00:50
Geht schon, birrgt aber Gefahrenquellen.

Korrekt ist die Derefernezierung gem X.Y. Ist in jedem C-Buch erklärt.

Kaiser-F
30.08.2005, 12:36
Hallo,

Ich hätte da eben auch mal eine Frage zu Strukturen.

Ich arbeite momentan mir CAN und will eine Funktion für das Lesen des Empfangspuffers schreiben.

Wie ich eine Struktur in eine Funktion übergebe weiß ich aus meinem Buch.

Wie ich aber eine Struktur aus einer Funktion herausbekomme, konnte ich leider nicht herausfinden.

Könntet Ihr mir da vielleicht ein wenig auf die Sprpünge helfen?

PicNick
30.08.2005, 13:00
Wie Engineer schon sagte, sowas tut man nicht
Beispiel:


// -------- Struktur -----------
typedef struct {
int iInteger;
char bWtlbrnft[6];
} MY_STRUC;

// -------- deklaration -----------
static MY_STRUC sStruc;

main()
{
// -------- so greift der main hin -----------
sStruc.iInteger = 24;
sStruc.bWtlbrnft[0] = 12;
myfunc((MY_STRUC*)&sStruc);
}
// -------- so greift die Funktion hin -----------
void myfunc(MY_STRUC* pPntr)
{
pPntr->iInteger = pPntr->bWtlbrnft[0];
}

Kaiser-F
30.08.2005, 16:24
Vielen Dank PicNick für deine Antwort.

Aber wie Ihr schon gesagt habt werd ich es dann doch lieber mit "Zeigern" machen.

Hat wohl was damit zu tun, dass alle Daten zuerst kopiert werden müssen, was sehr viel CPU-Zeit in Anspruch nimmt... ODER?

Andun
30.08.2005, 18:31
Also bei der Lösung die oben steht wird doch auch nur ein Zeiger an myfunc übergeben, es wird also die eigentlich struct Variable nicht kopiert.

Andun

Kaiser-F
30.08.2005, 20:02
Sorry, hab ich wohl nicht aufgenommen ;-)

Aber warum sollte man dann sowas nicht verwenden?

Ich muss zB. 3 Bytes und ein Array( bzw 8 weitere Bytes) aus einer Funktion holen

Wenn ich Globale Variablen bzw. Arrays nutze dann kommt das aufs selbe raus wie mit den Strukturen?!?

Was würdet Ihr mir denn empfehlen? Was ist am besten für die Laufzeit?

Wär echt klasse, wenn Ihr mir da noch ein paar Tipps geben könntet.

SprinterSB
30.08.2005, 21:21
Wenn es wirklich arg Laufzeitkritisch ist würd ich verschiedene Versionen ausprobieren und ins generierte asm schauen, da siehst du was wirklich ab geht und erkennst den optimalen Code.

SprinterSB
30.08.2005, 22:00
folgende Frage:
Ich habe Variablen von versch. Variablentypen welche ich in eine Struktur abfüllen möchte. Von der Struktur weiss ich in welcher Reihenfolge welche Variablentypen kommen und welche grösse die haben (zb von den Arrays). Ich kenne aber die Namen nicht der einzelnen Variablen in der Struktur, habe nur den Pointer auf die Struktur.
[...]
Die Namen der Strukturkomponenten kennst du. Alles andere ist HACK.

im Header:



// typedef of hurz_t
typedef struct
{
short val1;
short arr[8];
...
} hurz_t;

// prototype for func
void func (hurz_t *phurz);

in der Quelle


#include "header.h"
hurz_t hurz1, hurz2, ...;

//
void foo()
{
// calling func()
hurz1.val = 0;
hurz2.arr[7] = 7;
...
func (&hurz1);
func (&hurz2);
...
}

// implementation of func()
void func (hurz_t *phurz)
{
...
phurz->arr[2] = 0x1234;
...
}


Code Convention in C ist übrigens, Namen von definierte Strukturen eine Suffix "_t" zu verpassen. Pointern wird gerne ein "p" vorangestellt.
Namen von Funktionen und Objekten werden komplett klein, Macros komplett groß geschrieben.

Psiyou
31.08.2005, 00:05
Hi,
kann da nur empfehlen mal einen Blick in di Application Notes von Atmel zu werfen, efficinter C Code für Atmels (http://www.atmel.com/dyn/resources/prod_documents/doc1497.pdf).
Da wird genau diese Problematik behandelt, und vor allem stehen da noch jede Menge andere Sachen drin die man wissen sollte.