Forum: PC-Programmierung Präprozessorproblem Stringumwandlung


von Andreas (Gast)


Lesenswert?

Hallo zusammen,

ich möchte ein Strukt mit einem Wide Character String initialisieren. 
Dazu muss der Präprozessor den Ausdruck

 L"Hallo" in {'H','a','l','l','o'} umwandeln.

Hat jemand ne Idee, wie ich ihm das beibringen kann? Mir fällt partout 
nix ein.

Vielen Dank schonmal
Andreas

von StinkyWinky (Gast)


Lesenswert?

Ich würde das mit einem externen Tool lösen, z.B. aus einer 
Excel-Tabelle generieren.

von Sam .. (sam1994)


Lesenswert?

Einen Präpräprozessor schreiben, der nach der Bearbeitung den Compiler 
startet.

von (prx) A. K. (prx)


Lesenswert?

Gibt es schon. Mit dem M4 Präprozessor müsste es möglich sein:
http://de.wikipedia.org/wiki/M4_(Programmiersprache)

von Rolf Magnus (Gast)


Lesenswert?

Irgendwie verstehe ich nicht ganz, wozu das gut sein soll. Wenn deine 
Struktur keine wide character strings enthält, warum willst du sie dann 
mit welchen initialisieren?

von Imon (Gast)


Lesenswert?

Andreas schrieb:
> Dazu muss der Präprozessor den Ausdruck
>
>  L"Hallo" in {'H','a','l','l','o'} umwandeln.

kann sein das ich auf den Schlauch stehe aber

wchar_t bla[] ={ L"Hallo" } ;


geht nicht?

mein gcc unter linux frist das.
1
#include <stdio.h>
2
#include <wchar.h>
3
4
int main (int argc, char *argv[])
5
{
6
        wchar_t bla[] ={ L"Hallo" } ; 
7
        int i = 0;
8
9
        for ( i = 0;i < 6; i++)
10
        {
11
                printf("%lc \n",bla[i]);
12
        }
13
        return 0;
14
}

von Andreas (Gast)


Lesenswert?

Hallo Imon,

wenn ich eine Variable vorinitialisieren möchte, geht das schon. Ich 
will aber einen Strukt vorinitialisieren. In entwa so:
1
#define STR L"Hallo"
2
3
typedef struct STest
4
{
5
  unsigned int iNumber1;
6
  unsigned short sBuffer[sizeof(STR)/sizeof(STR[0])-1];
7
  unsigned int iNumber2;
8
}STest;
9
10
struct STest stest =
11
{
12
  1,
13
  {'H','a','l','l','o'},
14
  2,
15
};
16
17
int _tmain(int argc, _TCHAR* argv[])
18
{
19
  return 0;
20
}

Nur dass ich eben nicht {'H','a','l','l','o'} angeben will sondern der 
Präprozessor den Inhalt von STR automatisch eintragen soll.

Viele Grüße
Andreas

von Imon (Gast)


Lesenswert?

Andreas schrieb:
> Hallo Imon,
>
> wenn ich eine Variable vorinitialisieren möchte, geht das schon. Ich
> will aber einen Strukt vorinitialisieren. In entwa so:
>
>
1
> #define STR L"Hallo"
2
> 
3
> typedef struct STest
4
> {
5
>   unsigned int iNumber1;
6
>   unsigned short sBuffer[sizeof(STR)/sizeof(STR[0])-1];
7
    ^^^^^                  ^^^^^^^^^^^^^
8
    der type ist wchar_t denn solltest du auch nutzen ausserdem
9
    brauchst du hier ein Pointer um das so zu intitialiesieren wie du es   vorhast
10
    
11
    wchar_t *sBuffer;
12
    
13
14
>   unsigned int iNumber2;
15
> }STest;
16
> 
17
> struct STest stest =
18
> {
19
>   1,
20
>   {'H','a','l','l','o'},
21
    ^^^^^^^^^^
22
    hier dann einfach STR, schreiben.
23
>   2,
24
> };
25
> 
26
>
>
> Nur dass ich eben nicht {'H','a','l','l','o'} angeben will sondern der
> Präprozessor den Inhalt von STR automatisch eintragen soll.
>

1
#include <stdio.h>
2
#include <wchar.h>
3
4
#define STR L"Hallo"
5
6
typedef struct STest
7
{
8
        unsigned int iNumber1;
9
        wchar_t *sBuffer;
10
        unsigned int iNumber2;
11
}Stest ;
12
13
14
15
int main (void)
16
{
17
        Stest bla ={
18
                1,
19
                STR ,
20
                2,
21
        };
22
23
        int i = 0;
24
25
        for ( i = 0;i < 6; i++)
26
        {
27
                printf("%lc \n",bla.sBuffer[i]);
28
        }
29
        return 0;
30
}

von Andreas (Gast)


Lesenswert?

Hallo Imon,

Du hast zwar prinzipiell Recht. Leider hilft mir das aber für meine 
Anwendung nicht weiter, da ich die Struktur anschließend serialisieren 
und an eine andere Anwendung verschicken will. Bei der würde nun aber 
nicht

01 00 00 00   00 48 00 61 00 6C 00 6C 00 6F   02 00 00 00
     1      |  'H'   'a'   'l'   'l'   'o'  |      2

ankommen, sondern

01 00 00 00   XX XX XX XX   02 00 00 00
     1      | Zeiger auf  |      2
              die Stelle
              wo L"Hallo"
              im Code
              steht

Danke trotzdem und
Viele Grüße
Andreas

von Imon (Gast)


Lesenswert?

Andreas schrieb:
> Du hast zwar prinzipiell Recht. Leider hilft mir das aber für meine
> Anwendung nicht weiter, da ich die Struktur anschließend serialisieren
> und an eine andere Anwendung verschicken will.

das kommt drauf an wie du das Serialisieren erledigen willst, wenn du 
dafür eine Funktion schreibst kann diese das Berücksichtigen und an der 
Stelle des wchar_t String denn Inhalt der Adresse statt des 
Adresspointer hinein schreiben.

Ansonsten musst du dir doch damit leben das ganze in form von {'H', 'A' 
,'L,'L','O' } zu initialiesieren, oder aber erst zur laufzeit mit einer 
art
memcpy. Alternativ kannst du wie auch schon vorgeschlagen ein Code 
generator schreiben. bzw ein Parser um das Komfortabel zum  machen.

Fakt ist du hast ein Problem das sich alleine mit denn C Standard nicht 
lösen lässt, also musst du ein Kompromiss finden, die möglichkeiten 
haben wir dir gezeigt nun liegt es an dir. wäre intressant zu erfahren 
für was du dich entscheiden hast.

von Andreas (Gast)


Lesenswert?

Imon schrieb:
> wäre intressant zu erfahren
> für was du dich entscheiden hast.

Hallo nochmal,

ich habe mich entschieden die Schreibweise {'H','a','l,'l','o'} zu 
verwenden. Es gefällt mir zwar nicht besonders aber andere Alternativen 
(Codegererator oder Parser schreiben) kommen nicht in Frage, da das mit 
Kanonen auf Spatzen geschossen wäre.
Die Nachricht erst beim Serialisieren zusammenbauen, möchte ich auch 
nicht, da das Ganze zur Laufzeit so effizient wie möglich sein soll (das 
Zielsystem ist ein Mikrocontroller) und die fertigen Nachrichten (es 
gibt sehr viele davon) im Flash stehen sollen, so dass sie nur noch 
gelesen und rausgeschickt werden müssen.

Danke nochmal an alle
Andreas

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.