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


von Al3x (Gast)


Lesenswert?

Hi Leute,

ich suche einen Weg beider Kompilierung der FW zwei Zahlen zu addieren 
und das Ergebnis als String  zu bekommen.
1
#define z1 0x100
2
#define z2  2
3
#define STR_HELPER(x) #x
4
#define STR(x) STR_HELPER(x)
5
6
#define add(x , y) STR(x+y)
7
int main( void )
8
{
9
    char test[] = add(z1, z2);
10
//das Ergebnis ist “0x100+2“
11
//Was ich brauche muss aber „0x102“ sein
12
}
Wie kann ich dem Prerocessor sagen, dass es zuerst addieren soll und das 
Ergebniss der Addition dann in String umwandeln?

von Wegstaben V. (wegstabenverbuchsler)


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
von Jim M. (turboj)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
von kyrk.5 (Gast)


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.

von Al3x (Gast)


Lesenswert?

Schade :(

Ok Danke.

von Wilhelm M. (wimalopaan)


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 ...

von fop (Gast)


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 :
1
#define ZAHL1 (42)
2
#define ZAHL2 (112)
3
4
#define HEXDIGIT(X) (((X)>9)?('a'+(X)-10):('0'+(X)))
5
#define STELLE(X,Y) (((X)>>(4*(Y)))&0x0f)
6
#define OHJA(U,V) (HEXDIGIT(STELLE((U),(V))))
7
8
const char hurz[]={'0','x',OHJA((ZAHL1+ZAHL2),3),OHJA((ZAHL1+ZAHL2),2),OHJA((ZAHL1+ZAHL2),1),OHJA((ZAHL1+ZAHL2),0),'\0'};

von fop (Gast)


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. ;-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von fop (Gast)


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.

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.