Forum: Compiler & IDEs uint8_t data[8] von Funktion erwartet, wie übergeben?


von Danny (Gast)


Lesenswert?

Hi Zusammen!

Ich habe eine Funktion, die unter anderem ein Array aus uint8_t 
erwartet. Die Anzahl der zu übergebenen Bytes variiert, wird aber mit 
übergeben.

Nun möchte ich die Funktion aufrufen und direkt in der Parameterübergabe 
fixe Werte einsetzen können. Erwartet die Funktion ein einzelnes uint8_t 
ist der Fall klar. Aber auch nach diversen Versuchen und Suche im Netz 
finde ich keine Lösung um das erwartete Array direkt zu füttern.

Ein Array an sich zu übergeben, insbesondere mit nem Pointer wäre ja 
nicht tragisch, aber gibt es wirklich keine Möglichkeit das Array quasi 
im eigentlichen Funktionsaufruf zu füllen? Ein {0,1,0,1} mag er nicht ;)



Danke und Gruß
Danny

von Peter II (Gast)


Lesenswert?

geht in C nicht.

von DirkB (Gast)


Lesenswert?

Bei Typen, die von char abgeleitet werden, kann man ein Stringliteral 
missbrauchen.

"\x00\x01\x00\x01";

Da wird noch automatisch ein \0 angehängt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

In C99, das du offenbar verwendest, geht das:
1
void foo (char*);
2
3
void bar (void)
4
{
5
    foo ((char[]) { 1, 2, 3, 4 });
6
}

: Bearbeitet durch User
von Danny (Gast)


Lesenswert?

danke Euch beiden für die schnellen Antworten!

Beide Möglichkeiten habe ich getestet und sie funktionieren. Da aber 
auch andere Variablen mitten in dem Array stehen können müssen, scheidet 
die "vergewaltigte String-Variante" aus.

Etwas peinlich ist es mir, dass ich nun selbst eine vermeindlich noch 
bessere Lösung gefunden habe (wie immer, gesucht, gesucht, gesucht, hier 
gefragt und zack der Geistesblitz  ;)



void tx( uint8_t *data, ... )  durch die drei Punkte kann ich mehr 
Variablen übergeben als die dort bereits aufgeführten.

Ein tx(2,1,2); funktioniert genauso, wie ein tx(8,1,2,3,4,5,6,7,8). 
Durch das Mitgeben der Länge weiß die Funktion wann Schluß ist.

Für mich ist das grad eine traumhafte Lösung (Funktion mit variabler 
Parameterzahl) - oder handel ich mir damit andere Probleme ein?

Gruß
Danny

von DirkZ (Gast)


Lesenswert?

Variable Argumentenlisten (va list) gibt's schon seit K&R, Kapitel 7.3

http://www.dclc-faq.de/kap7.htm
http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html

von Rolf Magnus (Gast)


Lesenswert?

Danny schrieb:
> Für mich ist das grad eine traumhafte Lösung (Funktion mit variabler
> Parameterzahl) - oder handel ich mir damit andere Probleme ein?

Du mußt halt immer akribisch darauf achten, daß du die Anzahl anpasst, 
wenn du Parameter hinzufügst oder löschst. Und die Werte werden nicht 
als uint8_t übergeben, sondern alle auf int erweitert, weil das das 
kleinste ist, was per varargs übergeben werden kann. Ob das für dich ein 
Nachteil ist, hängt von der Zielplattform ab.

Danny schrieb:
> Da aber
> auch andere Variablen mitten in dem Array stehen können müssen, scheidet
> die "vergewaltigte String-Variante" aus.

Was verstehst du denn unter "andere Variablen mitten in dem Array"?

von Karl H. (kbuchegg)


Lesenswert?

Danny schrieb:

> Für mich ist das grad eine traumhafte Lösung (Funktion mit variabler
> Parameterzahl) - oder handel ich mir damit andere Probleme ein?

Das leidige 'printf'-Problem.
Du alleine bist dafür zuständig, dass die Argumente sowohl in Anzahl als 
auch im Datentyp korrekt sind. Der Compiler kann dir nicht mehr mit 
irgendwelchen Prüfungen unter die Arme greifen.

von Danny (Gast)


Lesenswert?

@Rolf: Das Achten auf die Länge ist nicht das Problem. Das Erweitern auf 
int stört mich allerdings (Prinzipsache). Mit "andere Variablen mitten 
in dem Array" meinte ich bspw. tx(4,1,temp_aussen,3,4);

@Karl Heinz: Das "Risiko" wäre ich eingegangen, aber das "Aufblasen" auf 
int versalzt mir sie Suppe...

also doch die Lösung von Johann: foo ((char[]) { 1, 2, 3, 4 });

von Oliver (Gast)


Lesenswert?

Danny schrieb:
> Das Erweitern auf
> int stört mich allerdings (Prinzipsache).

Nur mal rein aus Interesse gefragt: Was stört dich daran?

Oliver

von Bernd H. (Gast)


Lesenswert?

@Oliver: sorry für die späte Antwort, ich war den ganzen Tag 
unterwegs... Tja, was stört mich daran... im ersten Moment einfach das 
Prinzip insgesamt 8 Byte zu "verschwenden" nur zugunsten einer 
Schreibweise, die ich für mich schöner finde. Eher n Bauchgefühl... auf 
einem 8Bit Controller für eine 8Bit Variable 16Bit zu nutzen, dass 
widerstrebt mir irgendwie.

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.