Forum: Compiler & IDEs #define in einen String eintragen


von Joachim .. (joachim_01)


Lesenswert?

Moin,
wie kann ich mehrere #defines nacheinander in einen String oder ein 
Array eintragen?

1
#define expr_1    'A', 'B', 'C', 'D'
2
#define expr_2    'E', 'F', 'G', 'H', 'I', 'J'
3
#define expr_3    'K', 'L', 'M'
4
5
  char *string_1;
6
  string_1 = "ABCD";
7
  
8
  char *string_2;
9
  string_2 = expr_1;
10
11
  printf("\r%s", string_1); //geht
12
  printf("\r%s", string_2); //geht nicht

von Peter II (Gast)


Lesenswert?

lass doch mal das , weg.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> lass doch mal das , weg.

Das reicht nicht, die einzelnen character -Konstanten werden auch dann 
nicht zu einem String zusammengefügt.

Wenn, dann so:

#define expr_1    "A" "B" "C" "D"

aber das ist ganz sicher nicht das, was der Threadstarter vorhat.

von Joachim .. (joachim_01)


Lesenswert?

> lass doch mal das , weg.
Nee, das geht nicht; das Beispiel ist vereinfacht.
Ich muß später Asciis in dez, hex und als gewöhnliche alpanum. Zeichen 
eintragen. So etwa:
#define DEF_EraseDisplay    0x03, 0x1B, 'D', 'L'
#define DEF_DisableTouch    0x05, 0x1B, 'A', 'L', 0, 1

Prob ist auch, daß ein 'A' nicht als Datentyp char mit Wert 65 sondern 
als 32-bit int mit Wert 65 erkannt wird.

von Peter II (Gast)


Lesenswert?

Joachim ... schrieb:
> Nee, das geht nicht; das Beispiel ist vereinfacht.
> Ich muß später Asciis in dez, hex und als gewöhnliche alpanum. Zeichen
> eintragen. So etwa:

warum muss es denn eine define sein? zeigt mal etwas mehr vom dem 
Problem. Vermutlich gibt es dafür eine bessere lösung

von Joachim .. (joachim_01)


Lesenswert?

Ich hatte das bisher so gelöst:


in main:

unsigned char ctddark90[]  = {0x04, 0x1B, 'Y', 'H', 90};
unsigned char ctddark100[] = {0x04, 0x1B, 'Y', 'H', 100};    //100%
unsigned char ctdcursoroff[] = {0x04, 0x1B, 'T', 'C', 0};    //cursor 
off ESC T C 0
unsigned char ctdfont2[]   = {0x04, 0x1b, 'Z','F',2};   //ESC Z F n1 
Font 2: 6x8 monospaced


Ich brauche ctddark90[] aber in mehreren Dateien und muß es jedesmal 
dort mit extern deklarieren. Schöner wäre aber eine einzige Datei mit 
#defines die ich einfach inkludiere wo ich sie brauche.

von Peter II (Gast)


Lesenswert?

Joachim ... schrieb:
> Ich brauche ctddark90[] aber in mehreren Dateien und muß es jedesmal
> dort mit extern deklarieren. Schöner wäre aber eine einzige Datei mit
> #defines die ich einfach inkludiere wo ich sie brauche.

dann schreibe das "extern ctddark90[] " doch in eine Headerdatei, dann 
kannst du sie auch inkludieren.

von Joachim .. (joachim_01)


Lesenswert?

>dann schreibe das "extern ctddark90[] " doch in eine Headerdatei, dann
>kannst du sie auch inkludieren.

Gute Idee, das probier ich.

von Mark B. (markbrandis)


Lesenswert?

Sowas hier geht:

1
#define STR_HELPER(x) #x
2
#define STR(x) STR_HELPER(x)
3
4
#define EXPR_1    ABCD
5
#define EXPR_2    1234
6
#define EXPR_3    "test" STR(EXPR_1) STR(EXPR_2)
7
8
#include <stdio.h>
9
10
int main()
11
{
12
    char* string;
13
    string = EXPR_3;
14
15
    printf("%s\n", string);
16
    
17
    return 0;
18
}

Ob das das ist, was der Themenersteller will? Keine Ahnung.

von Joachim .. (joachim_01)


Lesenswert?

>Ob das das ist, was der Themenersteller will? Keine Ahnung.
Nee, weil das hier:
#define EXPR_1    ABCD

später so aussieht:
#define ctdEraseTouchArea    0x05, 0x1B, 'A', 'L', '0', '0'


Aber die Idee mit den inkludierten externs ist gut; hätt ich mit meinem 
verschlafenen Kopp auch selbst drauf kommen können. Ich löt' zu viel und 
programmier zu wenig...

von Harald S. (hasti)


Lesenswert?

Token Pasting (##):

The token-pasting operator (##) within a macro definition combines two 
arguments. It permits two separate tokens in the macro definition to be 
joined into a single token.

hilft das eventuell weiter ?
Gruss

von Peter II (Gast)


Lesenswert?

Harald Stinux schrieb:
> hilft das eventuell weiter ?

nein, weil er keine DEFINES verbinden will.

von Karl H. (kbuchegg)


Lesenswert?

> #define DEF_EraseDisplay 0x03, 0x1B, 'D', 'L'

Warum nicht
1
#define ETX "\x03"
2
#define ENQ "\x05"
3
#define ESC "\x1b"
4
5
#define DEF_ERASE_DISPLAY    ETX ESC "DL"
6
#define DEF_DISABLE_TOUCH    ENQ ESC "AL01"

DEF_ERASE_DISPLAY ist dann ein String Literal, da der Compiler die 
aufeinanderfolgenden Strings ETX ESC und "DL" aneinanderfügen muss, da 
sie nicht duech , voneinander getrennt sind.

Die Hilfsmakros ETX ENQ bzw. ESC dienen nur dazu, 'benannte' 
Einzelstrings zur Verfügung zu haben, die lediglich aus dem jeweiligen 
Zeichen mit einem bestimmten Hex-Wert bestehen.

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.