Forum: PC-Programmierung Pointer von einem Byte


von Christian R. (cris06)


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 :-)

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Ohne eine Variable gehts nicht, denn es muss zwingend Speicherplatz 
reserviert werden:
1
#define ACK 0x06
2
3
void send(char* data, char len){ ... }
4
5
void main(){
6
   char ack_c = ACK;
7
   send( &ack_c , 1); 
8
}

von Erik (Gast)


Lesenswert?

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"?

von Christian R. (cris06)


Lesenswert?

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

von hans im glück (Gast)


Lesenswert?

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

von Erik (Gast)


Lesenswert?

Christian R. schrieb:
> Bin meist etwas vorsichtig bei so kurzen Name

Bitte keine Diskriminierung der (Lauf-)Variablen i, l, ...

von Dr. Sommer (Gast)


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.

von Peter II (Gast)


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
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> und wo ist da der Vorteil gegenüber C?

Es geht nicht um C ./. C++, sondern um #define ./. Konstante.
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
}

Du solltest Dir noch mal ansehen, was static bedeutet.

Auch C kennt const.

von Peter II (Gast)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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).

von Ruediger A. (Firma: keine) (rac)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Rolf M. (rmagnus)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Oliver S. (oliverso)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.