char-Array initialisieren



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-142743.html

    Hallo, liebe Lehrer 🙂

    So, habs inzwischen dank Eurer Hilfe geschafft, den Text ins Hauptfenster zu holen ( frühere Frage, siehe Link).
    Nun habe ich ein anderes Problem: Hinter dem Text im Hauptfenster gibt es einen Haufen kryptischer Zeichen, die wohl daher kommen, daß das Array des TextPuffers nicht initialisiert ist.

    Folgendes habe ich gemacht:

    //...
    HINSTANCE hInst;
    char TextPuffer[256];
    int CALLBACK TextProc (HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    //...
    

    Später dann versuche ich, das Array zu initialisieren:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    
    {
       int z;
       for (z=0; z<sizeof(TextPuffer); z++)
          char TextPuffer[z] = " ";//Fehler: Constant expression required
     //...
    

    Nach meiner Kenntnis ist das in C so üblich. Aber wie man sieht, reichen meine Kenntnisse noch nicht weit... 😃

    Dabei gibt mir der Compiler einen Fehler aus (habe ich hinter die Zeile geschrieben).

    So ganz verstehe ich es nicht. Das Array ist ja schon global deklariert. Ich will nur mit dem Zähler z die einzelnen Elemente ansprechen und ein Leerzeichen hineinschreiben.

    Vermutlich gibt es noch professionellere Arten, ein char-Array zu initialisieren. Ich will schließlich nicht 255 Leerzeichen in den Quellcode hämmern. 👎
    Wer hat einen Vorschlag??



  • for (z=0; z<sizeof(TextPuffer); z++)
          TextPuffer[z] = 32;
    

    so vieleicht? Ist aber eigentlich ein ANSI C Topic.



  • Elektronix schrieb:

    char TextPuffer[z] = " ";//Fehler: Constant expression required
    

    was hast du für nen komischen compiler?
    " " ist doch eine 'constant expression'
    hätte eher erwartet 'cannot convert char* to char' oder sowas.
    aber so wie's einsteiger geschrieben hat sollte es funzen, ausser das man das array sicher nicht bei jedem eintritt in WndProc löschen muss.



  • Das "Constant expression" bezieht sich nicht auf das String Literal, sondern auf z.



  • warum nicht gleich an start so initialisieren? ist doch viel einfacher

    char TextPuffer[256]="";
    

    MfG RadiatioN



  • Hab ich versucht, hat leider nichts genützt.

    Wer hat noch andere Vorschläge??



  • Nochmal zu deinem obigen Code:

    1. Du hast zwei unabhängige Variablen mit dem Namen "TextBuffer" deklariert - die erste ist global und hat 256 Elemente, die zweite ist lokal bezüglich der for()-Schleife und hat variable Länge (das ist nicht in jeder Version des C++-Standards erlaubt).

    2. Einzelne Zeichenliterale werden nicht in "..." eingeschlossen, sondern in '...'.

    Damit wäre es richtig:

    for (z=0; z<sizeof(TextPuffer); z++)
      TextPuffer[z] = ' ';
    //@1: kein "char" vor dem Namen
    //@2: richtiger Datentyp für die Zuweisung
    


  • in welchem teil deiner anwendung steht die variable? vllt wird die vom compiler in das bss segment geschoben (die nicht initialisierten variablen). oder welchen compiler nutzt du?

    andere möglichkeiten:

    char TextPuffer[256]=0;
    
    ZeroMemory(TextPuffer, 256);
    

    Aber möglicherweise brauchst da noch ein type-cast, hab es jetzt ich getestet.

    [edit] CStoll hat natürlich recht, hab das mit den gloabalen/lokalen variablen überlesen. meine lösung würde dennoch funktionieren 🙂
    normal kann man dann per :: auf die globalen anstatt auf die lokalen variablen zugreifen, nur mal so nebenbei 😉

    MfG RadiatioN



  • Gibst du das immer noch mit TextOut aus, wie in dem anderen Thread?

    Dann liegt es daran, dass du sizeof benutzt, und nicht strlen.



  • Ah, eine Menge gute Tips. Vielen Dank dafür, ich werde es mal ausprobieren. 👍 💡 Wenn es geklappt hat, melde ich mich wieder.



  • Es hat geklappt! Vielen Dank für die Hilfe! 👍


Log in to reply