Probleme mit Char !!Help!!



  • Hallo,

    CString ist variabel in der länge.

    probire es doch so.

    struct DriveInfo{
        int drivecout;
        int type;
        char Drive[8];
    }drive[30];
    ...
    ...
        CString str;
        DWORD   dwDrives = GetLogicalDrives();   
        char    curDrive[8] = "A:\\"; 
        int        cnt = 0;    
        for(int i=0; i<26; i++) { 
            if(dwDrives) {
                curDrive[0] = i + 'A'; 
                if(GetDriveType(curDrive) == DRIVE_REMOVABLE) { 
                    drive[cnt].type = 2;
                    drive[cnt].Drive[8] = curDrive[8];
                    str.Format("%s",curDrive);
                    m_ListBox.AddString(str);
                    cnt++;
                }
            }
        }
        return cnt;
    

    MFG TaccoGo



  • Hallo,

    ich würde gerne CString verwenden, aber entweder kennen die Leute in den Foren das nicht (???), oder die MS-Funktionen erwarten immer Char.

    Ich habe es jetzt so probiert:

    struct DriveInfo{
    	int drivecout;
    	int type;
    	CString Drive[8];
    }drive[30];
    
    <FUNKTION ANFANG>	
        CString CurDriveString;
        DWORD   dwDrives = GetLogicalDrives();   
        char    CurDrive[8] = "A:\\"; 
    	int		cnt = 0;	
        for(int i=0; i<26; i++) { 
            if(dwDrives) {
                CurDrive[0] = i + 'A'; 
                if(GetDriveType(CurDrive) == DRIVE_REMOVABLE) { 
    				CurDriveString.Format("%s",CurDrive); 
    				drive[cnt].type = 2;
    				drive[cnt].Drive = CurDriveString;
    				cnt++;
                }
            }
        }
    	return cnt;
    <FUNKTION ENDE>
    

    dies erzeugt diese Fehler:
    error C2106: '=' : Linker Operand muss ein L-Wert sein
    error C2440: '=' : 'class CString' kann nicht in 'class CString [8]' konvertiert werden
    Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden

    Mein Problem ist, dass ich es nicht direkt ausgeben kann, ich muss es ausserhalb der Funktion ausgeben, da ich zuvor noch diverse Dinge verarbeiten muss.

    Gibt es eine Möglichkeit diese 2 Punkte zu realisieren?
    - char -> CString ?
    - CString -> char ?

    mfg
    trequ



  • Die Punkte sind schon realisiert.

    CString [8] sind 8 Zeichenketten. Mach mal das [8] weg, das sollte helfen.



  • Habe ich oben schon gezegt.

    char -> CString

    CurDriveString.Format("%s",charvariable);
    

    CString -> char

    char buf[80];
    wsprintf(buf,"%s",CurDriveString);
    

    MFG TaccoGo



  • Ähm hallo ?! Dass das noch niemand gemerkt hat??
    C Strings - also char-arrays - werden per strcpy kopiert!!

    drive[cnt].Drive[8] = curDrive[8];
    

    Das ist schlicht und ergreifend falsch!



  • der datentyp CString hat den =operator überladen und mit .Format() bekomt man auch char[] rein.

    aber oben im code ist es falsch da hat er char[]=char[].

    MFG TaccoGo



  • Ich weiss, dass CString den überladen hat, aber wie du ja selbst festgestellt hast, verwendet er keine CStrings, sondern C-Strings ... Ich empfehle dem Threadersteller übrigens ein Grundlagenbuch ...
    Wenn ich

    drive[cnt].Drive[8] = curDrive[8];
    

    sehe, frage ich mich, ob er weiß, was er da tut ... Und ob es beabsichtigt ist ...

    @estartu_de:
    Ich weiss nicht, ob ich deinen Beitrag richtig verstanden habe, aber

    char ch1[5] = "ABCD";
    

    ist äquivalent zu

    char ch2[5] = "ABCD\0";
    

    Die terminierende Null wird automatisch angefügt.



  • @dEUs: Okay, trotzdem passen nur 4 Zeichen rein. 😃

    Und die \0 habe ich gelernt, soll man hinschreiben, damit man weiß, dass da besetzt ist. Eigenart des Lehrers. 😉



  • *g* Wenn's hilft fence-post-errors zu vermeiden, wieso nicht? Besser die 0 von Hand getippt, als 5 Zeichen reingequetscht und kein Platz mehr für die 0.



  • Hallo,

    danke für euere Antworten.

    Wenn ich

    drive[cnt].Drive[8] = curDrive[8];
    

    sehe, frage ich mich, ob er weiß, was er da tut ... Und ob es beabsichtigt ist ...

    Ich weiß (leider) überhaupt nichts mehr...
    Ich steige von Perl auf C++ um und blicke noch nicht so ganz durch.
    In meinen Augen gibt es von C++ 200 verschiedene Versionen (Ansi-C, MFC, COM, API, .NET) welche alle anders sind.
    Dadurch gibt es im Web auch zu jedem Problem 1000 Lösungen, von denen nur 5% bei mir funktionieren.
    Ausserdem hatte ich das gef***e mit den ganzen Datentypen in Perl irgendwie nicht.

    Aber Trotzdem: Problem gelöst, kaum macht man im struct die [8] weg, schon gehts. 😋
    (Kommt mir jetzt auch logisch vor, ich hatte da ein Array aus 8 CStrings?)

    mfg
    trequ


Anmelden zum Antworten