char[] mit Hex-Werten bei Parameterübergabe initialisieren?

OP #590640
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.
Gast #590645
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
#590656
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)
Gast #590660
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
OP #590667
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.
#590668
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

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.