www.mikrocontroller.net

Forum: PC-Programmierung Präprozessorproblem Stringumwandlung


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: StinkyWinky (Gast)
Datum:

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

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Präpräprozessor schreiben, der nach der Bearbeitung den Compiler 
startet.

Autor: A. K. (prx)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <stdio.h>
#include <wchar.h>

int main (int argc, char *argv[])
{
        wchar_t bla[] ={ L"Hallo" } ; 
        int i = 0;

        for ( i = 0;i < 6; i++)
        {
                printf("%lc \n",bla[i]);
        }
        return 0;
}

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Imon,

wenn ich eine Variable vorinitialisieren möchte, geht das schon. Ich 
will aber einen Strukt vorinitialisieren. In entwa so:
#define STR L"Hallo"

typedef struct STest
{
  unsigned int iNumber1;
  unsigned short sBuffer[sizeof(STR)/sizeof(STR[0])-1];
  unsigned int iNumber2;
}STest;

struct STest stest =
{
  1,
  {'H','a','l','l','o'},
  2,
};

int _tmain(int argc, _TCHAR* argv[])
{
  return 0;
}

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

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas schrieb:
> Hallo Imon,
>
> wenn ich eine Variable vorinitialisieren möchte, geht das schon. Ich
> will aber einen Strukt vorinitialisieren. In entwa so:
>
>
> #define STR L"Hallo"
> 
> typedef struct STest
> {
>   unsigned int iNumber1;
>   unsigned short sBuffer[sizeof(STR)/sizeof(STR[0])-1];
    ^^^^^                  ^^^^^^^^^^^^^
    der type ist wchar_t denn solltest du auch nutzen ausserdem
    brauchst du hier ein Pointer um das so zu intitialiesieren wie du es   vorhast
    
    wchar_t *sBuffer;
    

>   unsigned int iNumber2;
> }STest;
> 
> struct STest stest =
> {
>   1,
>   {'H','a','l','l','o'},
    ^^^^^^^^^^
    hier dann einfach STR, schreiben.
>   2,
> };
> 
> 
>
> Nur dass ich eben nicht {'H','a','l','l','o'} angeben will sondern der
> Präprozessor den Inhalt von STR automatisch eintragen soll.
>

#include <stdio.h>
#include <wchar.h>

#define STR L"Hallo"

typedef struct STest
{
        unsigned int iNumber1;
        wchar_t *sBuffer;
        unsigned int iNumber2;
}Stest ;



int main (void)
{
        Stest bla ={
                1,
                STR ,
                2,
        };

        int i = 0;

        for ( i = 0;i < 6; i++)
        {
                printf("%lc \n",bla.sBuffer[i]);
        }
        return 0;
}


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.