Char-Array aus dem Präprozessor kopieren



  • Hallo Leute,

    ich habe eine Frage zum Kopieren eines Char-Arrays aus dem Präprozessor:

    im Präprozessor definiere z.B. ich folgendes:

    #define Zeile01 "ABCDEFGHIJKLMNOPQRST"
    
    #define Zeile11 "01234567890123456789"
    
    #define Zeile21 "ASDFGHJKLQWERTZUIOPN"
    ...
    

    dann mochte darauf zugreifen:

    void MenueBeschreiben(int a) {  //a = 0..2...
    
    char ZeileX1[21];
    
    switch (A) {
    
    	case(0): {
    	ZeileX1 = Zeile01; //1
    	}
    	break;
    
    	case(1): {
    	ZeileX1 = Zeile11; //2
    	}
    	break;
    
    	case(2): {
    	ZeileX1 = Zeile21; //3
    	}
    	break;
    
    ....
    

    Beim Compillieren wird für die Zeilen, die ich mit //1 bis //3 markiert habe, folgendes angezeigt:

    type mismatch in assignment

    Aber die sind doch vom gleichen Typ. Dabei soll doch der Inhalt eines Char-Arrays in einen anderen geschrieben werden.

    Kann mir Jemand sagen, was ich falsch mache und wie es richtig geht?

    Danke im Voraus

    Peter



  • Hallo,

    P1 schrieb:

    Aber die sind doch vom gleichen Typ

    Nein, sind sie nicht. ZeileX1 ist ein konstanter Zeiger auf Zeichen, den kannst du nicht einfach umbiegen.

    P1 schrieb:

    [...] wie es richtig geht?

    z.B. mit strncpy()...

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    Nein, sind sie nicht. ZeileX1 ist ein konstanter Zeiger auf Zeichen, den kannst du nicht einfach umbiegen.

    ZeileX1 ist kein konstanter Zeiger, sondern ein Array. Man kann Arrays keine Werte (weder Arrays noch Zeiger) zuweisen.



  • machs einfach mit 'nem pointer. so etwa:

    char *ZeileX1;
    ...
    switch (A) 
    {
        case 0: 
        ZeileX1 = Zeile01; // 1
        break;
    ...
    // usw.
    

    🙂



  • Hallo,

    supertux schrieb:

    Probe-Nutzer schrieb:

    Nein, sind sie nicht. ZeileX1 ist ein konstanter Zeiger auf Zeichen, den kannst du nicht einfach umbiegen.

    ZeileX1 ist kein konstanter Zeiger, sondern ein Array. Man kann Arrays keine Werte (weder Arrays noch Zeiger) zuweisen.

    Das stimmt natürlich, ich neige gelegentlich zur Über-Vereinfachung, wie es auch hier:

    http://c-faq.com/aryptr/constptr.html

    genannt wird 😃

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    Das stimmt natürlich, ich neige gelegentlich zur Über-Vereinfachung, wie es auch hier:

    Vereinfachung hin oder her, ein Array "Zeiger" zu nennen ist einfach falsch. Dadurch entsteht auch diese Verwirrung um beide (wegen genau solche Beiträge).



  • supertux schrieb:

    Probe-Nutzer schrieb:

    Das stimmt natürlich, ich neige gelegentlich zur Über-Vereinfachung, wie es auch hier:

    Vereinfachung hin oder her, ein Array "Zeiger" zu nennen ist einfach falsch.

    Muss ich das:

    Probe-Nutzer schrieb:

    Das stimmt natürlich

    für dich noch extra fett schreiben und betonen? 😉 Anders ausgedrückt: Ich habe zugegeben, dass das Geschriebene falsch war (das Gedachte war besser, siehe unten):

    supertux schrieb:

    Dadurch entsteht auch diese Verwirrung um beide (wegen genau solche Beiträge).

    Nein, zumindest nicht nur deswegen. Die Verwirrung entsteht, weil bei Nutzung eines Array-Typs in Ausdrücken dieser, bis auf wenige Ausnahmen, in den "entsprechenden" Zeiger-Typ "zerfällt". Da der Versuch der Zuweisung hier keine der Ausnahmen ist, wurde hier versucht, einem Zeiger-Typ, der nicht modifizierbar ist, etwas zuzuweisen, was auch ein "type mismatch"(andere Compiler melden hier in etwa "expression must be a modifiable lvalue") ist. Das war das, was ich gedacht habe, denn so bringt man sich auch den "Zerfall" in einen Zeigertyp in Erinnerung, und man muss sich bewusst sein, dass das nicht funktionieren kann, weil der "entstandene" Zeiger zusätzlich nicht änderbar ist (in diesem Sinne also konstant).

    Aber ich betone noch einmal: Ein Array ist kein Zeiger.

    MfG,

    Probe-Nutzer



  • ^^das wort 'zerfall' fand ich in dem zusammenhang schon immer lustig.
    🙂


Log in to reply