Pointer von einem Byte

OP #5106702
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
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"?
OP
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
Gast
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
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
}
Gast
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).
(Firma: keine)
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.
Persönliche Seite
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.
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.