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
Bei Typen, die von char abgeleitet werden, kann man ein Stringliteral missbrauchen. "\x00\x01\x00\x01"; Da wird noch automatisch ein \0 angehängt.
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
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
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
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"?
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.
@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 });
Danny schrieb: > Das Erweitern auf > int stört mich allerdings (Prinzipsache). Nur mal rein aus Interesse gefragt: Was stört dich daran? Oliver
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.