Ich möchte gerne für eine UART Kommunikation nur 1 bestimmtes BYTE (ACK
/ 0x06) übertragen. Was gebe ich hier als Argument der Funktion an, ohne
vorher ein Array/Buffer zu deklarieren?
Im Argument sollte erkennbar sein, welches hex-Byte (also bitte kein
Ascii) hier übertragen wird.
1
#define ACK 0x06
2
3
voidsend(char*data,charlen){...}
4
5
voidmain(){
6
send(???,1);// Hier soll ein ACK übertragen werden
7
}
Mit dem #define ACK bin ich mir auch nicht sicher, ob das ne gute Idee
ist.
Versuche hier meine Programmierkenntnisse etwas zu verbessern :-)
Nur weil du keinen Buffer selbst anlegst, heißt es nicht, dass der
Compiler das nicht eh für dich tut. Irgendwo muss das Byte liegen, je
nach CPU und call stack.
Was spricht gegen "char temp"?
An sich spricht nichts dagegen.
Hab mich nur gefragt, ob es eine elegante Möglichkeit gibt dies zu
umgehen.
Kann ich ACK problemlos definieren oder könnte ich da Probleme bekommen?
Bin meist etwas vorsichtig bei so kurzen Name, da ich noch nicht so viel
Erfahrung habe :-D
Christian R. schrieb:> Kann ich ACK problemlos definieren oder könnte ich da Probleme bekommen?
sagen dir die warnings obs probleme gibt. Zur Not -wall -werror
Christian R. schrieb:> Mit dem #define ACK bin ich mir auch nicht sicher, ob das ne gute Idee> ist.
Tja, hier zeigt sich einer der Vorteile, für konstante Werte
C(++)-Konstanten statt Makros zu nutzen. Dann nämlich hat man
automatisch einen Puffer auf den man Pointer anlegen kann:
1
staticconstcharACK=0x06;
2
3
voidsend(constchar*data,charlen){...}
4
5
voidmain(){
6
send(&ACK,1);// Hier soll ein ACK übertragen werden
Dr. Sommer schrieb:> Tja, hier zeigt sich einer der Vorteile, für konstante Werte> C(++)-Konstanten statt Makros zu nutzen. Dann nämlich hat man> automatisch einen Puffer auf den man Pointer anlegen kann:
und wo ist da der Vorteil gegenüber C?
1
staticcharACK=0x06;
2
3
voidsend(char*data,charlen){...}
4
5
voidmain(){
6
send(&ACK,1);// Hier soll ein ACK übertragen werden
Rufus Τ. F. schrieb:> Du solltest Dir noch mal ansehen, was static bedeutet.
warum, ist doch modul lokal oder was übersehen ich?
> Auch C kennt const.
aber noch nicht immer.
Peter II schrieb:> und wo ist da der Vorteil gegenüber C?
Der gezeigte Code ist C-Code.
Peter II schrieb:> aber noch nicht immer.
Benutzt du nur Features der Original K&R-C? "const" halt nachhaltig in C
Einzug gehalten und ist insbesondere bei Mikrocontrollern interessant,
die ja read-only-Speicher besitzen (Flash).
Christian R. schrieb:>> Kann ich ACK problemlos definieren oder könnte ich da Probleme bekommen?> Bin meist etwas vorsichtig bei so kurzen Name, da ich noch nicht so viel> Erfahrung habe :-D
Da hast Du ein gutes Bauchgefühl! Wer z.B. leichtfertig so Dinge wie
#define SET ...
in seinem Code benutzt und während der Evolution der Software z.B. gegen
eine ebenso unbedachte Implementation einer HAL baut, hat gute Chancen,
multiple definition errors zu kriegen (oder noch besser die Fehler nicht
zu kriegen aber stattdessen ein Anderes unerwartetes Laufzeitverhalten).
Ich benutze deswegen gerne erklärende symbolische Konstanten wie
ASCII_ACK oder CHARSET_ACK, aus denen beim Lesen der Kontext mit
ersichtlich ist.
Peter II schrieb:>> Auch C kennt const.> aber noch nicht immer.
Auch wenn ich selbst gestehe, ein aktiver Nutzer eines ziemlich alten
C-Standards zu sein, denke ich doch im gleichen Atemzug sagen zu können,
daß man K&R-C mittlerweile wirklich als tot, gestorben und weg vom
Fenster ansehen kann.
C89 jedenfalls kennt const.
hans im glück schrieb:> sagen dir die warnings obs probleme gibt. Zur Not -wall -werror
Die Optionen heißen -Wall -Werror. Aber dem restlichen Text entnehme
ich, dass deine Shift-Taste zuweilen zu klemmen scheint.
Rufus Τ. F. schrieb:> Auch C kennt const.
Im Gegensatz zu C++ kann man aber keine echten Konstanten definieren,
sondern nur Variablen, die man nicht ändern darf.
Das ist für das vorliegende Problem aber nicht wirklich relevant, nein,
es dürfte sogar hilfreich sein.
Hier wird ein Pointer erwartet, der auf etwas zeigt. Deswegen kann nicht
der Adressoperator auf die numerische Konstante angewandt werden:
1
#define ACK 0x06
2
3
voidsend(char*data,charlen);
4
5
voidmain()
6
{
7
send(&ACK,1);// mööp
8
}
Das liefe auf das gleiche hinaus wie
send(&0x06, 1);
und ist natürlich auch nicht übersetzbar.
Die C-Konstante (mit const deklariert) nimmt zwar Speicherplatz weg,
den eine "echte" Konstante nicht implizit verbrauchen würde, hier aber
wird dieses Verhalten explizit benötigt, denn der der Funktion send
übergebene Pointer muss irgendwo hin zeigen.
Und nach all den Ausführungen hier entdeckt der TO dann per Zufall und
ganz plötzlich putchar (oder wie auch immer die Funktion zu Ausgabe
eines einzelen Zeichens in der verwendeten lib auch heissen mag).
Die gibt es garantiert.
Oliver