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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.