Char arrays über pointer übergeben



  • Hallo, ich habe folgende Klasse

    class CElement
    {
    friend class CList;

    private:
    CElement *p_Next;
    CElement *p_Previous;
    char firstName[100];
    char lastName[100];
    int age;

    public:
    CElement();
    CElement(char *m_firstName, char *m_lastName, int m_age);
    };

    und folgenden Konstrktor:
    CElement::CElement(char *m_firstName, char *m_lastName, int m_age)
    {
    p_Next = p_Previous = NULL;
    firstName = m_firstName;
    lastName = m_lastName;
    age = m_age;
    }

    Leider lässt sich das ganze nicht kompilieren

    d:\Daten\Visual Studio Projects\DoppeltVerketteteListe\DoppeltVerketteteListe\ElementCode.cpp(25): error C2440: '=' : cannot convert from 'char *' to 'char [100]'
    There are no conversions to array types, although there are conversions to references or pointers to arrays
    Habe es auch schon mit "(char *m_firstName[100], char *m_lastName[100], int m_age)" versucht. Was mache ich hier falsch?

    Auch ist mir nicht ganz klar, was an folgender Anweisung auszusetzen ist:
    firstName = lastName = "\0"; oder = "";
    firstName und lastName sind char arrays[100]

    Danke für feedback



  • 1. Code-Tags verwenden
    2. Kein spezifisches Problem der Konsole

    Verschoben nach C++

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • christian.sax schrieb:

    firstName = m_firstName;
    	lastName = m_lastName;
    

    Das geht so nicht. Um c-strings zu kopieren benötigst du z.B. die Funktion strcpy(char* to, const char* from);

    In deinem Fall:

    strcpy(firstName, m_firstName);
    strcpy(lastName, m_lastName);
    

    Caipi



  • Hmm,
    denke, das liegt daran, dass du die Größe des Arrays mit

    char firstName[100]; 
    char lastName[100];
    

    fest auf 100 Elemente festgelegt hast. Als Parameter wird aber nur ein char-Zeiger übergeben, der ja nicht zu einem Array mit 100 Elementen gehören muss.
    Versuch doch mal stattdessen

    char *firstName;
    char *lastName;
    

    Die Speicherverwaltung muss dann natürlich dynamisch erfolgen (mit new und delete).

    Gruß,
    Morph



  • Caipi schrieb:

    christian.sax schrieb:

    firstName = m_firstName;
    	lastName = m_lastName;
    

    Das geht so nicht. Um c-strings zu kopieren benötigst du z.B. die Funktion strcpy(char* to const char* from);
    Caipi

    Oh, ja das natürlich sowieso.



  • Erstmal, wenn MFC-Stil dann richtig. Die Variablen der Klasse kriegen das m_ vorangestellt.

    firstName = lastName = "\0"; oder = "";

    Keine Ahnung, bei mir gehts wenns pointer sind.

    Für das was du vorhast ist strcpy da.

    edit: Ich bin zu langsam 🙂



  • @Caipi
    Aber wenn ich doch ein char Array habe und folgendes mache:

    char firstName[100] = "Hallo Welt";
    cout << firstname
    

    dann wird ja das ganze array angezeigt, also "Hallo Welt" und da die Zuweisung ja auch komplett statt finden kann, dachte ich die sollte so möglich sein.

    Wenn ich also keine vorhandenen klassen verwenden möchte bleibt mir also nichts übrig als das kopieren folgendermassen zu realisieren:

    for(int i=0;i>100;i++)
    {
    firstName[i] = m_firstName[i];
    }
    

    müsste dann so funktionieren oder?



  • christian.sax schrieb:

    for(int i=0;i>100;i++)
    {
    firstName[i] = m_firstName[i];
    }
    

    müsste dann so funktionieren oder?

    würde ich nicht versuchen. könnte ja sein dass m_firstName keine 100 zeichen lang ist und dann greifst du auf speicher zu der dir nicht gehört.
    strcpy oder strncpy ist die einzige lösung. besser ist natürlich du verwendest std::string dan funktioniert auch die zuweisung;
    Kurt



  • christian.sax schrieb:

    Aber wenn ich doch ein char Array habe und folgendes mache:

    char firstName[100] = "Hallo Welt";
    cout << firstname
    

    das ist keine zuweisung sondern du initialisierst eine konstante.
    Kurt



  • @ZuK
    Ok, gutes Argument... daher folgender Schleife

    for(int i=0;(i<100) && (m_firstName[i]!="\0");i++)
    

    das coole daran ist, dass der Borland Compiler das anstandslos erledigt.. nicht so visual studio der mekert:

    d:\Daten\Visual Studio Projects\DoppeltVerketteteListe\DoppeltVerketteteListe\ElementCode.cpp(25): error C2446: '!=' : no conversion from 'const char *' to 'int'
    This conversion requires a reinterpret_cast, a C-style cast or function-style cast

    Wo liegt denn hier das Problem? ich vergleiche doch gar nicht mit einem int!!??



  • "\0" ist auch falsch sollte '\0' sein.
    BTW was hast du gegen strncpy ?
    Kurt
    edit: wenn du es selbst machen willst dann fehlt dir '\0' im dest-string wenn der src-string länger als 100 zeichen ist.



  • das ist keine zuweisung sondern du initialisierst eine konstante.
    Kurt

    Ähmmm, ja, ich initialisiere eine konstante, welche ich anschliessend dem firstName[100] zuweise... von rechts nach links..



  • sorry, tipp fehler 😉
    ich habe nix gegen strcpy 😉 , nur möchte ich das ganze ohne vorhandenen möglichkeiten machen können. Zumal ich leider an den Prüfungen auch keine String operationen verwenden darf 😞



  • christian.sax schrieb:

    das ist keine zuweisung sondern du initialisierst eine konstante.
    Kurt

    Ähmmm, ja, ich initialisiere eine konstante, welche ich anschliessend dem firstName[100] zuweise... von rechts nach links..

    nee für den compiler heist das reserviere ein char array der länge 100 und initialisiere mit einer konstanten. keine zuweisung.
    Kurt



  • christian.sax schrieb:
    Zitat:
    das ist keine zuweisung sondern du initialisierst eine konstante.
    Kurt

    Ähmmm, ja, ich initialisiere eine konstante, welche ich anschliessend dem firstName[100] zuweise... von rechts nach links..

    nee für den compiler heist das reserviere ein char array der länge 100 und initialisiere mit einer konstanten. keine zuweisung.
    Kurt

    ok, dann wird das wohl schon so sein...
    Habe hier aber doch noch ein Problem:

    firstName = lastName = "Hallo Welt";
    

    funzt nicht,

    '=' : cannot convert from 'const char [11]' to 'char [100]'

    😕 char sind echt lästig...



  • christian.sax schrieb:

    Habe hier aber doch noch ein Problem:

    firstName = lastName = "Hallo Welt";
    

    funzt nicht,

    '=' : cannot convert from 'const char [11]' to 'char [100]'

    😕 char sind echt lästig...

    ok jetzt ist es keine initialisierung mehr sondern eine unzulässige zuweisung.
    Kurt



  • ok jetzt ist es keine initialisierung mehr sondern eine unzulässige zuweisung.
    Kurt

    Und wie müsste die Anweisung korrekt lauten?

    firstName = "Hallo Welt";
    

    funz nämlich auch nicht... gleicher Fehler.. in VS



  • char lastName[100];  // eine declaration
    char firstName[100] = "Hallo Welt"; // initialisierung
    strcpy(lastName, firstName); // zuweisung geht nicht also kopieren.
    

    natürlich kannst du auch beide variablen initialisieren

    char lastName[100] = "Hallo Welt";
    char firstName[100] = "Hallo Welt";
    

    Kurt



  • class CElement
    {
    	friend class CList;
    
    	private:
    	CElement *p_Next;
    	CElement *p_Previous;
    	char firstName[100];
    	char lastName[100];
    	int age;
    
    	public:
    	CElement();
    	CElement(char *m_firstName, char *m_lastName, int m_age);
    };
    

    initialisieren möchte ich das array aber erst im Kontruktor

    CElement::CElement()
    {
    	p_Next = p_Previous = NULL;
    	firstName = "Hallo Welt";
    	age = 0;
    }
    

    und das funzt so nicht müsste also wieder mit strcpy arbeiten oder


Anmelden zum Antworten