char übergeben



  • Ich habe folgendes ausprobiert:

    private:
    	char m_DeviceName[64];
    public
    	void setDeviceName(char* value){ m_DeviceName = value; }
    

    was mir den Fehler liefert

    1>e:\daten\dev\cpp\hibiscus\lightmodulator2dmat\lightmodulator2d\CameraSMX150.h(55) : error C2440: '=': 'char *' kann nicht in 'char [64]' konvertiert werden
    1> Es gibt keine Konvertierungen von Arraytypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Arrays gibt

    Nicht das ich den Fehler nicht verstehe, aber mir fällt gerade keine Lösung ein.
    Ich könnte natürlich mit CtTring arbeiten, aber ich muss später wieder einen char[64] übergeben. Ich wollte mir daher das umwandeln zwischendurch sparen.

    Matthias



  • Hallo,

    Nimm statt dessen std::string. Wenn du unbedingt const char* brauchst gibt es ja noch c_str();
    Wenn du unbedingt bei deinen char-Arrays bleiben willst nutze strcpy (oder besser strncpy).



  • Braunstein schrieb:

    Hallo,

    Nimm statt dessen std::string.

    Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?

    Braunstein schrieb:

    Wenn du unbedingt const char* brauchst gibt es ja noch c_str();

    Ist das eine funktion von string ?

    Braunstein schrieb:

    Wenn du unbedingt bei deinen char-Arrays bleiben willst nutze strcpy (oder besser strncpy).

    Schon klar das ich damit arrays kopieren kann, aber wie ich ein char in einer Funktion übergebe ist mir noch immer nicht klar.

    Matthias



  • pospiech schrieb:

    Braunstein schrieb:

    Hallo,

    Nimm statt dessen std::string.

    Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?

    Braunstein schrieb:

    Wenn du unbedingt const char* brauchst gibt es ja noch c_str();

    Ist das eine funktion von string ?

    Ja, die Klassen sind vergleichbar (und ja - c_str() ist eine Methode von std::string, die die Daten als char* ausgibt - CString hat dafür einen Konvertierungsoperator).

    Braunstein schrieb:

    Wenn du unbedingt bei deinen char-Arrays bleiben willst nutze strcpy (oder besser strncpy).

    Schon klar das ich damit arrays kopieren kann, aber wie ich ein char in einer Funktion übergebe ist mir noch immer nicht klar.

    Matthias

    Wenn du einzelne char's hast, kannst du die auch mit = zuweisen - aber du hast dort keinen einzelnen char, sondern ein char-Array.



  • pospiech schrieb:

    ...
    Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?...

    Vergleich selbst:

    pospiech schrieb:

    (korrigiert)...

    private:
            // wenn sich hier mal die zulässige Länge ändert, 
            // musst Du die 64 überall ändern
    	char m_DeviceName[64];
    public
    	void setDeviceName(char* value){ 
               // Sicherheitsabfrage nötig
               if(!value) ||
                 (strlen(value) >= 64)) throw runtime_error("passt nicht");
               // trotzdem kann value auf ungüligen Speicher zeigen und wir haben
               // keine Chance, das zuverlässig auszuschließen
               strncpy(m_DeviceName, value, 64)
            }
    

    vs:

    private:
            // beliebige Länge unterstützt
    	string m_DeviceName;
    public
    	void setDeviceName(string const& value) { 
                m_DeviceName = value;
            }
            // Sicherheitsabfrage nötig 
    
    // IMHO übersichtlicher:
    // 	void setDeviceName(string const& value) : m_DeviceName(value) {}
    

    Nachtrag: Ich verstand das so, dass hier "C-Strings" (char[] mit '\0' terminiert) verwendet werden sollen. Falls es sich bei CString um eine eigene Klasse handelt, kenne ich sie nicht und kann auch keinen Vergleich anführen.

    Gruß,

    Simon2.



  • Dein Problem ist auch garnicht die Übergabe an die Funktion, die funktioniert schon so, sondern dass du versucht den Zeiger einem Array zuzuweisen...
    Die normale Zuweisung m_Devicename = value würde nämlich, wenn der Compiler es denn zuließe, lediglich den Zeiger der auf dein reservierten Speicherbereich zeigt, auf den auf value zeigen lassen:

    int my_function()
    {
       char hello[] = "Hello World";
       myObject.setDeviceName(hello); //m_DeviceName würde jetzt auf hello zeigen
       return; //hier wird hello zerstört
    } 
    
    int main()
    {
       my_function();
       ... //Ab hier würden alle Zugriffe auf m_DeviceName zum Crash führen
    }
    

    Was du also wirklich willst, ist value zu kopieren:

    void setDeviceName(char* value)
     {
        strncpy(m_DeviceName, value, 64);
     }
    

    oder, vernünftig mit std::string

    ...
    std::string m_DeviceName;
    void setDeviceName(const std::string &value)
    {
       m_DeviceName = value;
    }
    ...
    

    Grüße,

    Martin



  • Simon2 schrieb:

    pospiech schrieb:

    ...
    Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?...

    // IMHO übersichtlicher:
    // 	void setDeviceName(string const& value) : m_DeviceName(value) {}
    

    Ja, das wäre das beste - aber leider funktionieren diese Initialisierungslisten nur bei Konstruktoren und nicht bei Setter-Methoden.

    Nachtrag: Ich verstand das so, dass hier "C-Strings" (char[] mit '\0' terminiert) verwendet werden sollen. Falls es sich bei CString um eine eigene Klasse handelt, kenne ich sie nicht und kann auch keinen Vergleich anführen.

    Bei "CString" fällt mir als erstes die String-Klasse der MFC ein - die ist ähnlich aufgebaut wie std::string.



  • CStoll schrieb:

    Simon2 schrieb:

    pospiech schrieb:

    ...
    Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?...

    // IMHO übersichtlicher:
    // 	void setDeviceName(string const& value) : m_DeviceName(value) {}
    

    Ja, das wäre das beste - aber leider funktionieren diese Initialisierungslisten nur bei Konstruktoren und nicht bei Setter-Methoden.....

    Hopps, hatte das "void" übersehen und gedacht, die Klasse hieße "setDeviceName" ("set" im Sinne von "Satz" und nicht "setze").

    Nunja, gut, dass Du das geklärt hast.

    Von "der MFC-Klasse CString" habe ich schonmal gehört, aber ich kenne sie halt nicht und assoziiere sie auch nicht als Erstes (kam erst beim 3. Mal Durchlesen auf die Idee).

    Gruß,

    Simon2.



  • ehm und ist sowieso dumm, da du dann wahrscheinlich die DLLs der MFC brauchst ... also lieber bei Standardklassentemplates bleiben 😉


Anmelden zum Antworten