Forum: Compiler & IDEs C: Konstante als Pointer an Funktion übergeben


von Sören (Gast)


Lesenswert?

Hallo zusammen,

einer gegebenen Funktion (C)
1
void func(const unsigned char* ptr)
soll eine Konstante, z.B. 0xAB, übergeben werden.

Dazu möchte ich diese Konstante nicht in einer Variable ablegen und den 
Zeiger darauf übergeben.
Geht das mit einem Cast direkt? Wie würde der aussehen?

Besten Dank.
Sören

von Mr. (Gast)


Lesenswert?

Cast? Auf was möchtest du denn casten?

Im übrigen: Nein, das geht nicht.

von Karl H. (kbuchegg)


Lesenswert?

Sören schrieb:
> Hallo zusammen,
>
> einer gegebenen Funktion (C)
>
1
> void func(const unsigned char* ptr)
2
>
> soll eine Konstante, z.B. 0xAB, übergeben werden.
>
> Dazu möchte ich diese Konstante nicht in einer Variable ablegen und den
> Zeiger darauf übergeben.

Wenn die Funktion eine Adresse haben will, an der sie den (die) unsigned 
chars vorfindet, dann will sie eine Adresse haben und du brauchst etwas, 
von dem du eine Adresse bilden kannst. Zahlenkonstante sind nichts, das 
eine Adresse im Speicher hätte.

Also kannst du es drehen und wenden wie du willst, du musst dir etwas 
bauen, von dem du eine Adresse abgreifen kannst. Eine Variable.

Auf der anderen Seite kann man sich natürlich fragen, warum diese 
Funktion eigentlich eine Adresse haben will. Aus dem Codeschnipsel ist 
das nicht erkennbar, warum das so sein soll. Kann ja auch sein, dass der 
Programmierer unsinnigerweise ein Pointerargument benutzt, obwohl er das 
überhaupt nicht müsste.

von Kai S. (zigzeg)


Lesenswert?

Wie waere es mit
1
func("\xab");
evtl. musst DU noch auf "const unsigned char *" casten, wenn char auf 
Deiner Architectur signed ist.

ZigZeg

von Sören (Gast)


Lesenswert?

Die Funktion nimmt Zeichenketten entgegen, die über eine serielle 
Schnittstelle verschickt werden. Der übergebene Pointer zeigt auf den 
Beginn der Zeichenkette. Außerdem wird noch die Länge übergeben, was 
hier nicht gezeigt ist.

In den meisten Fällen nutze ich die Funktion wie vom Programierer 
gedacht. Es gibt aber einige Fälle, in denen ich ein einzelnes 
konstantes Byte verschicken muss. Dann führt wohl nichts an der 
Deklaration einer Variable vorbei.

Trotzdem danke.

von Dirk B. (dirkb2)


Lesenswert?

Dann nimm die Funktion, die nur ein Zeichen versendet.
Diese wird (wahrscheinlich) in deiner Arrayfunktion auch nur aufgerufen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Sören schrieb:
> Dazu möchte ich diese Konstante nicht in einer Variable ablegen

Was ist dein Beweggrund dafür?

Möchtest du, dass die Konstante keinen Speicher belegt?

Dann gibt es keine Lösung für dein Problem, da Pointer nur auf Objekte
im Speicher zeigen können.

Möchtest du dir einfach nur die zusätzliche Zeile zur Definition einer
Variablen sparen, oder bist du zu phantasielos, die einen Variablennamen
auszudenken?

Dann kannst du folgendes schreiben:
1
  func(&(unsigned char){0xAB});

von Amateur (Gast)


Lesenswert?

>Dann führt wohl nichts an der Deklaration einer Variable vorbei.

Du kannst auch, wie gewünscht eine Konstante anlegen.

>func(&(unsigned char){0xAB});

Mag sein, dass so ein Konstrukt funktioniert, aber in der Praxis legt 
der Compiler dann doch eine Konstante an. Diese ist dann allerdings 
"unsichtbar" (Namenlos) und kann nicht anderweitig verwendet werden. 
Ersparnis = Null.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Amateur schrieb:
> Mag sein, dass so ein Konstrukt funktioniert, aber in der Praxis legt
> der Compiler dann doch eine Konstante an.

Natürlich.

> Ersparnis = Null.

Deswegen fragte ich den TE ja nach seinem Beweggrund. Vielleicht geht es
ihm ja primär gar nicht um die Speicherersparnis. Diese wäre ohnehin
vernachlässigbar, da es hier um eine Variable von gerade mal 1 Byte
Größe geht.

von Sören (Gast)


Lesenswert?

Besten Dank für die hilfreichen Antworten.
Hintergrund ist tatsächlich nicht Speicherersparnis oder dergleichen. 
Der Compiler darf gerne draus machen, was er für sinnvoll hält.

Mir geht es einfach darum, dass ich tatsächlich keine zig Variablen 
anlegen möchte bzw. eine Variable und der vor Aufruf der Funktion den 
Wert zuweisen.

Ob obige Konstruktion eleganter ist, sei dahin gestellt. Jedenfalls 
erfüllt sie ihren Zweck.

von Karl H. (kbuchegg)


Lesenswert?

Dirk B. schrieb:
> Dann nimm die Funktion, die nur ein Zeichen versendet.
> Diese wird (wahrscheinlich) in deiner Arrayfunktion auch nur aufgerufen.

Und wenn es diese Funktion (noch) nicht gibt, dann zerlegt man die 
Funktion die Zeichenketten versenden kann eben in 2 Teile: den Teil der 
alle Bytes eines Strings nacheinander abklappert und den Teil, der 1 
Byte versendet. Letzterer kommt in eine eigene Funktion und voila schon 
hat man seinen Baukasten um eine weitere sinnvolle Funktion ergaenzt.
1
void uart_putc( char c )
2
{
3
  ...
4
}
5
6
void uart_puts( const char* str )
7
{
8
  while (*str)
9
    uart_putc( *str++ );
10
}
2 Fliegen mit 1 Klappe usw.

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.