mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Preprocessor Addition von zwei zahlen und Umwandlung in String


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Al3x (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich suche einen Weg beider Kompilierung der FW zwei Zahlen zu addieren 
und das Ergebnis als String  zu bekommen.
#define z1 0x100
#define z2  2
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#define add(x , y) STR(x+y)
int main( void )
{
    char test[] = add(z1, z2);
//das Ergebnis ist “0x100+2“
//Was ich brauche muss aber „0x102“ sein
}
Wie kann ich dem Prerocessor sagen, dass es zuerst addieren soll und das 
Ergebniss der Addition dann in String umwandeln?

Autor: Wegstaben V. (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein prä-Prozessor ist eine "dumme" Text-Ersetzungs-Maschine.

Setze einfach mal den zu ersetzenden text selbst ein in deinen Ausdruck, 
und überlege was passiert.

Wenn du einen Ausdruck findest, welcher durch text-Ersetzung deine 
gewünschte Aktion durchführt, dann hast du dein Problem gelöst.

: Bearbeitet durch User
Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Böse Falle: Der Präprozessor kann nicht addieren, außer in der #if 
Anweisung.

Deinen Fall könnte man mit Textersetung erschlagen - das funktioniert 
natürlich nicht für z2>9. Für sowas wie eine Versionsnummer reicht das 
aber.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Al3x schrieb:
> //Was ich brauche muss aber „0x102“ sein
Das bezweifle ich. Das ist nur das, was du willst.

Kein Mensch braucht einen String im Speicher, der die Firmware in 
BCD-Darstellung mit führendem 0x beinhaltet. Was brauchst du denn 
wirklich? Was soll denn mit diesem String später passieren? Warum muss 
die Firmwareversion überhaupt als String abgespeichert sein?

: Bearbeitet durch Moderator
Autor: kyrk.5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Ersatz könntest du vor dem kompilieren einen Script automatisch 
laufen lassen der dir die Strings in ein C File generiert. Den kannst du 
dann einfach kompilieren.

Den Script musst du aber so schreiben dass der seine Inputdaten 
irgendwie geschickt bekommt. C File parsen geht auch, dann bist du 
schnell dabei deinen eigenen preprocessor zu schreiben. Also eher Text 
File lesen oder C file Zeilen basiert lesen und suchen.

Autor: Al3x (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schade :(

Ok Danke.

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht um C oder C++ ?

In C++ kannst Du diese Umwandlung zur Compilezeit in ein 
constexpr-String bzw. constexpr-Array machen.

Aber auch ich bezweifle, dass Du das überhaupt brauchst ...

Autor: fop (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Der Preprocessor alleine kann das nicht. Aber er kann Dir helfen 
Monstermakros zu bauen, die dem Compiler Konstanten vorgeben, die er zur 
Compilierzeit auflösen kann :
#define ZAHL1 (42)
#define ZAHL2 (112)

#define HEXDIGIT(X) (((X)>9)?('a'+(X)-10):('0'+(X)))
#define STELLE(X,Y) (((X)>>(4*(Y)))&0x0f)
#define OHJA(U,V) (HEXDIGIT(STELLE((U),(V))))

const char hurz[]={'0','x',OHJA((ZAHL1+ZAHL2),3),OHJA((ZAHL1+ZAHL2),2),OHJA((ZAHL1+ZAHL2),1),OHJA((ZAHL1+ZAHL2),0),'\0'};

Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Kein Mensch braucht einen String im Speicher, der die Firmware in
> BCD-Darstellung mit führendem 0x beinhaltet.

Reiht sich irgendwann hinter
> 640k ought to be enough for everybody

ein. ;-)

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
fop schrieb:
> Lothar M. schrieb:
>> Kein Mensch braucht einen String im Speicher, der die Firmware in
>> BCD-Darstellung mit führendem 0x beinhaltet.
> Reiht sich irgendwann hinter
>> 640k ought to be enough for everybody
> ein. ;-)
Auch eine Art berühmt zu werden...  ;-)

Aber es ist tartsächlich so, dass ich auch mit größter mentaler 
Anstrengung nicht verstehe, wozu man so einen String im Speicher 
brauchen könnte. Das sieht mir eher aus, als ob da wer die 
Zahlendarstellung und die Zahlensysteme miteinander verknotet hätte.

Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mir fällt da spontan <Unified Diagnostic Services (UDS; deutsch 
etwa „vereinheitlichte Diagnosedienste“)>[Zitat aus Wikipedia] ein. Im 
besonderen der Dienst Nummer 0x22 Read by identifier.
Du glaubst gar nicht, was Deine Kunden da alles auslesen können wollen.

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.