Pointer von einem Byte

OP #5106702
Lesenswert?

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
void send(char* data, char len){ ... }
4

5
void main(){
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 :-)
Gast #5106753
Lesenswert?

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
static const char ACK = 0x06;
2

3
void send(const char* data, char len){ ... }
4

5
void main(){
6
   send(&ACK , 1);  // Hier soll ein ACK übertragen werden
7
}
Sinnvollerweise nutzt man einen const-Pointer.
Gast #5106760
Lesenswert?

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
static char ACK = 0x06;
2

3
void send(char* data, char len){ ... }
4

5
void main(){
6
   send(&ACK , 1);  // Hier soll ein ACK übertragen werden
7
}
(Firma: keine) #5106925
Lesenswert?

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.
#5107187
Lesenswert?

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.
Persönliche Seite #5107492
Lesenswert?

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
void send(char* data, char len);
4

5
void main()
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren