Union als rückgabewert



  • Hi,

    ich habe da mal eine Frage zu union.

    Ich habe eine definiert

    union IniRead
        {
            char *cTemp;
            bool bTemp;
            int iTemp;
        }uIniRead;
    

    Diese will ich als rückgabewert haben denn meine Funktion

    uIniRead __fastcall Translation::GetGlobalString(AnsiString Name, IniOption typ)
    {
        uIniRead uTemp;
    
        TIniFile *ini = new TIniFile(GetAppDir() + LangDir + "language.ini");
    
        switch(typ)
        {
            case ReadString:
                uTemp.cTemp = (char*)ini->ReadString("Translation", Name, "StringNotFound");
                break;
    
            case ReadInteger:
            case ReadBool;
                uTemp.iTemp = ini->ReadInteger("Translation", Name, -1);
                break;
        }
        delete ini;
    
        return uTemp;
    }
    

    Soll eben entweder einen String, bool oder integer zurückgeben.

    Ich bekomme allerdings die Fehler :

    [C++ Error] TRANSLATIONCLASS.H(56): E2303 Type name expected
    [C++ Error] TRANSLATIONCLASS.H(56): E2139 Declaration missing ;
    [C++ Warning] rev.h(3): W8058 Cannot create pre-compiled header: initialized data in header
    [C++ Error] translationclass.cpp(220): E2238 Multiple declaration for 'uIniRead'
    [C++ Error] defines.h(76): E2344 Earlier declaration of 'uIniRead'
    [C++ Error] translationclass.cpp(220): E2141 Declaration syntax error

    in der Klassendefinition
    Die ersten 2. Ich denke die letzten 3 sind folge Fehler denn ohne diese Funktion hats geklappt zu compilieren.

    ...
        uIniRead __fastcall GetGlobalString(AnsiString Name, IniOption);
    ...
    


  • Hallo,

    Deine Union heißt IniRead nicht uIniRead. Das ist schon eine Instanz auf IniRead. Lass das uIniRead bei der Deklaration deiner Union einfach weg.

    Ciao



  • Fox-Alpha schrieb:

    [cpp]
    case ReadString:
    uTemp.cTemp = (char)ini->ReadString("Translation", Name, "StringNotFound");*
    break;
    [/cpp]

    args... du weisst, dass ReadString einen AnsiString zurueckliefert, den du dann nach char* castest, beim verlassen der funktion wird der AnsiString freigegeben und dein cTemp zeigt in einen nicht definierten speicherbereich, was frueher oder spaeter zu einer zugriffsverletzung fuehrt!

    reserviere mit new[] speicher fuer den string und kopiere ihn in cTemp hinein! daran denken ihn auch wieder frei zu geben!


Anmelden zum Antworten