mikrocontroller.net

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


Autor: Karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das klingt nach einer "union":

http://de.wikibooks.org/wiki/C-Programmierung:_Kom...

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned short comm (struct tcom (*b)[16])
{
 b[7]->baud = 9600 ;
}

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

Autor: Karlheinz (Gast)
Datum:

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

Vielen Dank noch einmal an alle.

Autor: Karlheinz (Gast)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...der da wäre?

Autor: Karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler meldet nur Syntaxerror "near struct".

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgender Code muß eigentlich fehlerfrei übersetzen, sonst ist der 
Compiler kaputt:
struct tcom
{
 unsigned long baud ;
 unsigned short bits ;
} ;

unsigned char buffer[0x100] ;

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

int main()
{
    comm((struct tcom(*)[16])buffer);
    return 0;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.