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
Ich würde das mit einem externen Tool lösen, z.B. aus einer Excel-Tabelle generieren.
Einen Präpräprozessor schreiben, der nach der Bearbeitung den Compiler startet.
Gibt es schon. Mit dem M4 Präprozessor müsste es möglich sein: http://de.wikipedia.org/wiki/M4_(Programmiersprache)
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?
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 | }
|
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
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 | }
|
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.