Forum: Mikrocontroller und Digitale Elektronik C-Frage (cast)


von Karlheinz (Gast)


Lesenswert?

Es gibt eine Struktur mit ein paar Komponenten, einen Buffer, eine 
Funktion und einen Funktionsaufruf.

struct tcom
{
 unsigned long baud ;
 unsigned short bits ;
} ;

...

unsigned char buffer[0x100] ;

...

unsigned short comm (struct tcom *b[16])
{
 ...
 b[7]->baud = 9600 ;
 ...
}

...

Wie muß der cast für buffer aussehen, wenn ich die Funktion aufrufe?

i = comm ( ???buffer )


Was der Compiler nicht anmeckert ist comm ((void *)&buffer).

von Marius W. (mw1987)


Lesenswert?

Erstelle dir ein Array aus struct tcom mit 16 Einträgen.

Die Zeiger auf alle diese structs ebenfalls als Array will comm als 
Argument haben.

Ein einfacher Cast nützt dir nix.

MfG
Marius

von Tom M. (tomm) Benutzerseite


Lesenswert?

Karlheinz schrieb:

> unsigned char buffer[0x100] ;

Möchtest du buffer nicht als Array von tcom Strukturen deklarieren?
tcon buffer[16];

> Wie muß der cast für buffer aussehen, wenn ich die Funktion aufrufe?
> i = comm ( ???buffer )

Ein cast ist nicht nötig, wenn du die Variablen "richtig" definierst!
i = comm( &buffer ); // Zeiger auf Array von tcon-Strukturen übergeben

von Karlheinz (Gast)


Lesenswert?

Vielen Dank für eure raschen Antworten.

Bei mir liegt wohl ein Verständnisproblem vor.

Ws möchte ich:

Einmal ein Array von 16 gleichen Strukturen. Die Elemente der Strukturen 
sind jeweils 16 Bytes lang. Und einmal möchte ich einen unsigned char 
Buffer[0x100] an eine Funktion übergeben, die diesen Buffer als Array 
mit 16 Strukturen beschreibt. Das Array ist also genaus so groß wie der 
Buffer.

von Tom M. (tomm) Benutzerseite


Lesenswert?

Das klingt nach einer "union":

http://de.wikibooks.org/wiki/C-Programmierung:_Komplexe_Datentypen#Unions

In die Union packst du beide Deklarationen rein (Array von chars bzw. 
Array von tcom Typen) und verwendest dann den jeweiligen Array nach 
Belieben.

von Rolf Magnus (Gast)


Lesenswert?

> Einmal ein Array von 16 gleichen Strukturen.

Du übergibst aber an die Funktion einen Zeiger auf einen Zeiger auf eine 
Struktur, nicht einen Zeiger auf ein Array. Wenn du auf diese Weise 
den Puffer in der Funktion nutzen willst, müßtest du erst ein Array aus 
16 Zeigern erzeugen.
Man kann aber auch einen Zeiger auf ein Array aus 16 Strukturen 
übergeben.  Das würde dann so gehen:
1
unsigned short comm (struct tcom (*b)[16])
2
{
3
 b[7]->baud = 9600 ;
4
}

Dann kannst du deinen Puffer übergeben mit:
1
comm((struct tcom(*)[16])buffer);

von Karlheinz (Gast)


Lesenswert?

@Markus
Sieht nicht gerade einfach aus, aber ich denke, daß ich das gesucht 
habe.

Vielen Dank noch einmal an alle.

von Karlheinz (Gast)


Lesenswert?

Die Verwendung von "comm((struct tcom(*)[16])buffer);" führt zu einem 
Syntaxerror.

von Simon K. (simon) Benutzerseite


Lesenswert?

...der da wäre?

von Karlheinz (Gast)


Lesenswert?

Der Compiler meldet nur Syntaxerror "near struct".

von Simon K. (simon) Benutzerseite


Lesenswert?

Das wäre ja nicht mal ein kompletter Satz ;)

von Rolf Magnus (Gast)


Lesenswert?

Folgender Code muß eigentlich fehlerfrei übersetzen, sonst ist der 
Compiler kaputt:
1
struct tcom
2
{
3
 unsigned long baud ;
4
 unsigned short bits ;
5
} ;
6
7
unsigned char buffer[0x100] ;
8
9
unsigned short comm (struct tcom (*b)[16])
10
{
11
 b[7]->baud = 9600 ;
12
 return 0;
13
}
14
15
int main()
16
{
17
    comm((struct tcom(*)[16])buffer);
18
    return 0;
19
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.