#define in einen String eintragen

OP #3277089
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
OP #3277109
> 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.
Gast #3277117
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
OP #3277122
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.
Gast #3277124
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.
#3277131
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.
OP #3277162
>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...
#3277166
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
#3277440
> #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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.