Fehlermeldung bei Compilierung



  • Hallo,
    erhalte folgenden Fehler bei Compilierung des folgenden Quelltextes:

    [C++ Fehler] Sprachauswahl.cpp(14): E2451 Undefiniertes Symbol 'String'
    [C++ Fehler] Sprachauswahl.cpp(71): E2268 Aufruf der undefinierten Funktion 'searchLang'

    void split(String& text, String& separators, vector<String>& words)
    {
    	int n = text.length();
    	int start, stop;
    
    	start = text.find_first_not_of(separators);
    	while ((start >= 0) && (start < n))
    	{
    		stop = text.find_first_of(separators, start);
    		if ((stop < 0) || (stop > n)) stop = n;
    		words.push_back(text.substr(start, stop - start));
    		start = text.find_first_not_of(separators, stop+1);
    	}
    }
    //-----------------------------------------------------------------------------
    void searchLang(String *returnXMLNode,String *returnLangNode)
    {
    	try
      		{
            	_di_IXMLDocument XML = LoadXMLDocument("language.xml");
            	_di_IXMLNodeList NodeList = XML->DocumentElement->ChildNodes;
               	_di_IXMLNode TestNode = NodeList->Nodes[0];
        		int count = TestNode->ChildNodes->Count;
    
        		for (int j=0; j<count; j++)
            	{
                	returnXMLNode[j]= (String)TestNode->ChildNodes->Nodes[j]->NodeName;
                	returnLangNode[j]= (String)TestNode->ChildNodes->Nodes[j]->NodeValue;
            	}
    
            }
    
        catch (...)
    		{
            try
    				{
                            throw Exception("Language-file not found!");
                    }
    
                catch (Exception &exception)
    				{
    					Application->ShowException(&exception);
    				}
    		}
    }
    
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
    	: TForm(Owner)
    {
    	CB_Lang->Clear();
    	int LangValueLength;
        String LangShortValue[40];
        String LangLongValue[40];
    	searchLang(LangShortValue, LangLongValue);
     	LangValueLength = LangLongValue->Length();
    
        for (int i = 0; i < LangValueLength ; i++ )
        {
        	CB_Lang->Items->Add(LangShortValue[i]+ " " + LangLongValue[i]);
        }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::CB_LangSelect(TObject *Sender)
    {
    	String Language;
        Language = CB_Lang->Text;
    // Hier folgt aufruf der Methode Split mit übergabe von dem String Language und Seperator
    }
    

    Kann mir da jemand weiterhelfen? Habe bestimmt in der Eile etwas übersehen.



  • Die Fehlermeldung bezieht sich auf Zeile 1 des Quelltextes!



  • Hallo

    Ja hast du, und zwar anzugeben
    - an wlechen Stellen genau die Meldung angezeigt werden.
    - Die Aufteilung des Codes auf die Dateien

    Deshalb kann ich nur raten

    Undefiniertes Symbol 'String'

    bedeutet das du wohl bei der Datei mit der Deklaration der split-Funktion den Include #include <VCL.h> vergessen

    Aufruf der undefinierten Funktion 'searchLang'

    Du hast in der Form-Datei den Include auf die Datei mit der Deklaration mit der split-Funktion vergessen.

    bis bald
    akari



  • Habe den Fehler schon gefunden. War etwas Anderes.
    Trotzdem danke.



  • Da 'find_first_not_of' ist kein Element von 'AnsiString' ist, suche ich nun eine möglichkeit meine AnsiStringvariable so zu konvertieren, dass ich mit 'find_first_not_of' arbeiten kann. Wie geht das am besten?



  • Hausmarke schrieb:

    Da 'find_first_not_of' ist kein Element von 'AnsiString' ist, suche ich nun eine möglichkeit meine AnsiStringvariable so zu konvertieren, dass ich mit 'find_first_not_of' arbeiten kann. Wie geht das am besten?

    AnsiString to std::string --> Google, FAQ, Borland Hilfe...



  • Hallo

    find_first_not_of ist eine Methode von std::string, nicht von AnsiString.
    Da du das nicht weißt nehm ich an du hast die Funktion split irgendwo herauskopiert und den String-Typ durch AnsiString ersetzt. Das geht so nicht, du must zumindestens intern mit std::string arbeiten.

    #include <string>
    ...
    void split(const String& text, const String& separators, vector<String>& words)
    {
        std::string buffer = text.c_str(); // Umwandlugn auf den richtigen Datentyp
        int n = buffer.length();
        int start, stop;
    
        start = buffer.find_first_not_of(separators.c_str());
        while ((start >= 0) && (start < n))
        {
            stop = buffer.find_first_of(separators.c_str(), start);
            if ((stop < 0) || (stop > n)) stop = n;
            words.push_back(AnsiString(buffer.substr(start, stop - start).c_str()));
            start = buffer.find_first_not_of(separators.c_str(), stop+1);
        }
    }
    

    bis bald
    akari



  • Sorry,
    aber danke.
    Habe mir das als Vorlage genommen gehabt. Habe nicht soviel mit den Methoden von st::string gearbeitet. Danke dir.



  • Warum machst du die Parameter der Funktion nicht auch gleich zu std::string? Dann brauchst du nicht mehr zu konvertieren (in der Funktion).



  • Hallo

    ich vermute das damit auch die Texte von VCL-Controls (und damit AnsiStrings) übersetzt werden soll, und dann wäre eine interne Konvertierung sinnvoller.
    Wenn dem nicht so sein sollte, ist natürlich eine native Unrterstützung von std::string als Paramter besser. Sprich die Funktion im Originalzustand belassen.

    bis bald
    akari


Anmelden zum Antworten