www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem bei der Wertzuweisung einer konstanten Zeichenkette


Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da der RAM des AVRs für ein umfangreiches Menü nicht ausreicht, bin ich
gezwungen die Daten im Rom abzulegen. Reiner Text ist dabei kein
Problem, bei der Kombination aus Text und Zahlenwerten komme ich jedoch
nicht weiter.

Es folgt ein Ausschnitt aus dem Prorgamm. [w] fungiert als Platzhalter.
An dieser Stelle sollte eigentlich ein vom Zahlenwert definierter
Charakter stehen, also 0-255. Natürlich könnte man stattdessen auch
einfach die Zahlen als Zeichen reinschreiben, doch das würde das
auslesen nur unnötig erschweren, abgesehen vom zusätzlichen
Speicherplatzbedarf.

const char ProgHMD0[] PROGMEM = "Anzahl Sensoren:
%z,[w],[w],LOGFILE,[w]%

Habt ihr eine Idee?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir zwar nicht sicher ob es das ist wonach du suchst.
In C koennen Character Codes in einen String enigebettet werden
indem man eine Escape-Character ('\') gefolgt von einem 'x'
und der Hex-Zahl des Codes schreibt.


"Hall\x6F Wo\x72ld"

Dies ist der String "Hallo World", nur habe ich anstatt 'o' und
'r' die Zeichen durch ihren ASCII Code angegeben.

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, genau so etwas habe ich gesucht!

Kann man mittels des Escape-Characters anstatt der Hex-Zahl auch eine
Dezimalzahl angeben?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, nur als Oktalzahl. \0377 ist beispielsweise dezimal 255.

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ganz hat sich die Sache leider doch noch nicht geklärt. Die Frage ist
die: Wie gehe ich vor wenn statt des direkt ausgebschreibenen
Zahlenwertes eine Konstante benutzen will?
Ganz einfach könnte man sagen, in dem du sie vollstädnig ausgeschrieben
definierst. Z.B:
#define DATE_STR \xC3

Dies führt jedoch zu Problemen, bei Benutzung außerhalb einer
Zeichenkette, wie z.B. eine Switchanweisung, wo "\xC3" nicht als
Wert akzeptiert wird.

Wisst ihr wie ich vorgehen kann?

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist noch nicht ganz klar, worauf Du rauswillst, bitte um eine
ausführliches Beispiel incl. der erwarteten Ausgabe!

Folgende Denkansätze von meiner Seite:
1. Die Strings in n+1 Teile zerlegen (n=Anzahl der auszugebenden
Werte). Ausgabe mit printf ("%s%d%s",teil1,wert,teil2);

2. Wie von Dir oben vorgeschlagen ein Byte als Kennzeichen. Eine
Routine muss den String auswerten und daraus einen neuen String
erzeugen, in dem der Platzhalter durch den Wert ersetzt wird.

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du vergisst, dass es sich hier um die Wertzuweisung eine Konstanten
handelt.

Also im Klartext:
Ich möchte einzelne Bytes eines im Rom definierten Arrays festlegen.
Dabei soll einerseits lesbarer Text, andererseits Konstanen zum Einsatz
kommen.

Beispiel:
Die ersten vier Einträge des Arrays enthalten die Zeichenkette "Datum:
" und der fünfte den Wert einer Konstanten DATE_STR = 0xC3.

Alles klar?

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, jetzt verstehe ich: dann brauchst Du 2 Defines:
#define DATE_WRT 0xC3
#define DATE_STR \DATE_WRT

geht zumindest mit meinem TCPP nicht, dann vielleicht

#define DATE_WRT 0xC3     //für case...
#define DATE_STR \xC3     //für Strings

geht auch nicht, in Strings wertet er immer die Namen als Buchstaben.


wenns nicht unbedingt ein Array sein muss, geht evtl. ein struct.


Aber warum willst Du "Datum:" 4x abspeichern? das ist
Speicherverschwendung.

Es folgt ein Ausschnitt aus dem Prorgamm.
const char ProgHMD0[] PROGMEM = "Anzahl Sensoren:
%z,[w],[w],LOGFILE,[w]%

Wo ist das schließende " ?

Der Ausschnitt ist schon ein wenig zu kurz.
Erklär uns doch mal ausführlich, was Du willst, wie Du es versucht
hast und was nicht so klappt, wie Du Dir es vorstellst.

Autor: Yagan Ζ. Dongobar (yagan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julius,

meinst Du so etwas:

const char ProgHMD0[] PROGMEM =
{ "Anzahl Sensoren:", DATE_WRT, 0 };   ?

Ciao, Yagan

Autor: Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder meintest Du sowas:
#define TEIL1 "Hall"
#define TEIL2 "elt"

const char ProgHMD0[] PROGMEM= TEIL1 "o W" TEIL2 "!";
ist dann synonym zu:
const char ProgHMD0[] PROGMEM="Hallo Welt!";

(Mit Leerzeichen  zwischen String-Constanten kann man die
aneinanderhängen)


/Ernst

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.