Forum: Mikrocontroller und Digitale Elektronik char[] mit Hex-Werten bei Parameterübergabe initialisieren?


von Alexander I. (daedalus)


Lesenswert?

Hallo,
bevor ich meine Frage stelle, erstmal etwas C-Code:
1
unsigned char drawText(char message[], int x, int y)
2
{
3
  // Message-Verarbeitung
4
}

Funktionsaufruf 1:
1
char mychar[] = "hallo welt!"
2
drawText(mychar, 10,15); // -> Funktioniert

Funktionsaufruf 2:
1
drawText("hallo welt!", 10,15); // -> Funktioniert auch

Funktionsaufruf 3:
1
char mychar[] = {0x01, 0x02, 0x03}
2
drawText(mychar, 10,15); // -> Funktioniert ebenfalls

Funktionsaufruf 4:
1
drawText({0x01, 0x02, 0x03}, 10,15); // -> Funktioniert NICHT!

Jetzt lautet meine Frage:
Wie kann ich einer Funktion einen char[] übergeben OHNE das ich vorher 
eine Variable deklarieren muß (siehe 3.)?

Ich möchte also drawText so aufrufen wie in 2. aber eben mit von mir 
definierten (nicht "druckbaren") Hex-Zeichen. Ich bin mir fast sicher, 
dass C da ein Makro anbietet, aber weder im Google noch hier hab ich was 
gefunden ... achso, stdio und Konsorten fallen aus Speicherplatzgründen 
schonmal aus dem Rahmen :) Bei 4. sagt der IAR EW430 übrigends:
Error[Pe029]: expected an expression.


Ich hoff ihr könnt mir helfen.

von Johannes M. (johnny-m)


Lesenswert?

Einen Textstring übergibt man nicht als Array, sondern als Zeiger. 
Überhaupt ist es fast immer sinnvoll (und machbar), keine Arrays an 
Funktionen zu übergeben, sondern das mit einem Zeiger auf das erste 
Array-Element zu erledigen.

von Matthias (Gast)


Lesenswert?

Ich vermute, das wird nicht gehen, weil der Compiler solche Übergaben 
wohl als call_by_reference macht, also er übergibt nicht deine Werte, 
die in der variablen stehen, sondern nur den Pointer, wo im RAM diese 
Werte stehen.
Und wenn du jetzt diskret Werte übergeben willst, müssen diese dann im 
RAM stehen, also in einer Variablen....

Bin mir nicht ganz sicher, aber hatte schon selbiges Problem

von Johannes M. (johnny-m)


Lesenswert?

BTW: Schau Dir mal an, wie z.B. die Standard-Funktionen zur 
Stringausgabe definiert sind (printf und Verwandte). Da wird auch 
jeweils nur ein Zeiger übergeben. Am besten mal im Kernighan & Ritchie 
nachschauen, da stehen afair auch Beispiele drin.

von Alexander I. (daedalus)


Lesenswert?

Ich hatte grade mal die Idee beim Kollegen printf() zu spicken. Es 
funktioniert:
1
drawText("\x01\x02\x03", 10,15); // -> Funktioniert!

Der Compiler erzeugt die Zeichenkette im ROM und übergibt der Funktion 
einen Pointer dorthin.

Gefunden hab ich das mit dem \x hier:
http://www.cplusplus.com/reference/clibrary/cstdio/printf.html

von Karl H. (kbuchegg)


Lesenswert?

Alex Wurst wrote:

> Funktionsaufruf 4:
>
1
> drawText({0x01, 0x02, 0x03}, 10,15); // -> Funktioniert NICHT!
2
>
>
> Jetzt lautet meine Frage:
> Wie kann ich einer Funktion einen char[] übergeben OHNE das ich vorher
> eine Variable deklarieren muß (siehe 3.)?

So, gar nicht.
Man könnte höchstens machen

  drawText( "\x01\x02\x03", 10, 15 );

aber auch das ist nicht 100% identisch, weil der zwischendurch
generierte String die Länge 4 hat (wegen der abschliessenden 0)

>
> Ich möchte also drawText so aufrufen wie in 2. aber eben mit von mir
> definierten (nicht "druckbaren") Hex-Zeichen.

Dann lerne wie man Hex-Zeichen in einen String einbetten kann
(Tip: Genauso wie ich es da oben gemacht habe)

von Alexander I. (daedalus)


Lesenswert?

@Johannes:
2 Dumme ein Gedanke in Bezug auf printf() ;)

Hat sich dann somit wohl geklärt. Danke.

von marc (Gast)


Lesenswert?

Also ich würd sagen dem fehl die /0 am ende eines Strings, wenn man 
einen string per "" einträgt wird ja am ende die NULL also /0 angehängt. 
Daher funktionierend ie ersten beiden Aufrufe. Der dritte dürfte 
eigentlich cniht funktionieren, hat bei mir nciht 100%ig gestimmt wes 
wurden mehr als 3 Zeichen Zeichen ausgegeben. und der 4. Aufruf tut bei 
mir so auch nicht. Versuchs mal mit:
1
char mychar[] = {0x01, 0x02, 0x03, 0x00};
2
drawText(mychar, 10,15);
1
drawText({0x01, 0x02, 0x03, 0x00}, 10,15);


Gruß Marc

von Alexander I. (daedalus)


Lesenswert?

@Marc
Du hast Recht, da hab ich das Beispiel wohl etwas zu sehr vereinfacht. 
Es muß hinten auf jeden Fall noch ein 0x00 dran bei Beispiel 3! 
Ansonsten wird der Text solange rausgeblubbert bis irgendwann mal 
zufällig ein 0x00 kommt.

Ist echt immer faszinierend wie lebendig dieses Forum ist :) Danke an 
alle.

von Klaus F. (kfalser)


Lesenswert?

Ich denke, folgendes ist was Du suchst.
Der Parameter ist eine Zeichenkette (char[]) mit Spezial-Zeichen, welche 
in Hex angegeben werden. Trotzdem wird auch in diesem Fall nur ein 
Zeiger auf den temporären String an die Funktion übergeben.

drawText("\x01\x02\x03", 10,15);


Übrigens ist Dein Beispiel 3 falsch.
Die Funktion drawText() weiss nichts über die Länge von message[] und 
wird sich deshalb an die C-Convention halten daß der String mit einem 
NULL-Character '\0* endet. Bei Beispiel 1 und 2 schließt der Compiler 
die Zeichenkette automatisch mit '\0' ab.
In Deinem Beispiel 3 definierst Du aber ein Feld von char ohne 
Längenangabe mit expliziter Initialisierung.
Der Unterschied dazu ist daß der Compiler in diesem Fall das Feld nicht 
mit '\0' abschließt, sondern das Feld mit genau 3 chars definiert.
Wenn Du dieses Feld an drawText() übergibts, dann fehlt der Anschluß für 
den String und drawText schreibt die zufällig in Speicher folgenden 
Zeichen bis irgendwann eine Null gelesen wird.

Klaus

von Klaus F. (kfalser)


Lesenswert?

Da war ich wohl ein wenig zu langsam !

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.