[Linker Fataler Fehler] Fatal: Zugriffsverletzung. Link beendet.



  • Hi

    ich habe folgenden Code geschrieben. Er ist zwar nicht besonders schön, da er z.B. globale Variablen nutzt, aber er soll nur zu Testzwecken dienen:

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    #include <iostream>
    #include <string>
    #include <vector>
    
    //---------------------------------------------------------------------------
    
    struct Paar {
    	std::string wort;
    	int n;
    };
    
    std::vector<Paar> paare;
    
    void werte(const std::string& str);
    void ausgeben();
    void warten();
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
    
    	std::cout << "Zum Beenden geben sie \'quit\' ein!" << std::endl;
    	std::string in;
    
    	do
    	{
    		std::cin >> in;
            werte(in);
    	} while(in != "quit");
    
    	ausgeben();
    
    	warten();
    
    	return 0;
    }
    
    void werte(const std::string& str)
    {
    	bool b = false;
    
    	std::vector<Paar>::iterator it;
    
    	for(it = paare.begin(); it < paare.end(); it++)
    	{
    		if(it->wort == str)
    		{
            	it->n++;
    			b = true;
    			break;
            }
    
    	}
    
    	if(!b)
    	{
        	Paar p = {str, 1};
    		paare.push_back(p);
    	}
    }
    
    void ausgeben()
    {
    	std::cout << "\nAusgabe der Liste: \n" << std::endl; 
    
    	std::vector<Paar>::iterator it;
    	for(it = paare.begin(); it < paare.end(); it++)
    	{
        	std::cout << it->wort << "\t=\t" << it->n << std::endl;
        }
    }
    
    void warten()
    {
    	std::cin.clear();
    	std::cin.sync();
    	std::cin.get();
    }
    //---------------------------------------------------------------------------
    

    Wenn ich das Programm kompiliere, bekomme ich folgenden Fehler:

    [Linker Fataler Fehler] Fatal: Zugriffsverletzung. Link beendet.

    Ich benutze Turbo C++ Explorer 2006 (BTW: Habe das Passwort für meinen alten Borland Account wieder gefunden).
    Was kann der Fehler sein? Mit Visual C++ 2010 Express funktioniert der Code einwandfrei.

    Ich hoffe, dass ihr mir helfen könnt.
    Ich freue mich auf eure Antworten.

    LG
    Cooter


  • Mod

    Hallo

    da scheint die bpr (deine Projektdatei) defekt zu sein

    Mfg
    Klaus



  • Eigentlich kann das nicht sein.

    Ich habe Turbo C++ erstmal neu installiert.
    Neues Projekt.
    Quelltext á la Guttenberg eingefügt und kompiliert.

    es kommt wieder die selbe Fehlermeldung.


  • Mod

    Ich habe Turbo C++ erstmal neu installiert.

    soweit ok

    Neues Projekt.

    welche Art Projekt

    Quelltext á la Guttenberg eingefügt und kompiliert.

    Wo eingefuegt
    moeglicherweise etwas ueberschrieben ?

    Mfg
    Klaus



  • Ist eine einfache Konsolenanwendung.
    Habe das Projekt über den Wizard erzeugt - Ohne Multithreading und VCL.

    Das Problem scheint irgendwie mit den Vectoren zusammenzuhängen.

    Ich habe mal ein bisschen im Quelltext "rumkommentiert". Dabei habe ich herrausgefunden, dass er Probleme mit den Iterators und dem push_back hat. So, wie der Quelltext jetzt ist, lässt er sich kompilieren. Also wenn die Iterators durch normale ints ersertzt werden und das push_back nicht genutzt wird.

    Ansonsten ist der Error weiterhin:

    [Linker Fataler Fehler] Fatal: Zugriffsverletzung. Link beendet.

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    #include <iostream>
    #include <string>
    #include <vector>
    
    //---------------------------------------------------------------------------
    
    struct Paar {
    	std::string wort;
    	int n;
    };
    
    std::vector<Paar> paare;
    
    void werte(const std::string& str);
    void ausgeben();
    void warten();
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
    
    	std::cout << "Zum Beenden geben sie \'quit\' ein!" << std::endl;
    	std::string in;
    
    	do
    	{
    		std::cin >> in;
    //		werte(in);
    	} while(in != "quit");
    
    	//ausgeben();
    
    	warten();
    
    	return 0;
    }
    
    void werte(const std::string& str)
    {
    	bool b = false;
    
    //	std::vector<Paar>::iterator it;
    //
    //	for(it = paare.begin(); it < paare.end(); it++)
    //	{
    //		if(it->wort == str)
    //		{
    //			it->n++;
    //			b = true;
    //			break;
    //        }
    //
    //	}
    
    	for(int i = 0; i < paare.size(); i++)
    	{
    		if(paare[i].wort == str)
    		{
    			paare[i].n++;
    			b = true;
    			break;
            }
        }
    
    	if(!b)
    	{
        	Paar p = {str, 1};
    		//paare.push_back(p);
    	}
    }
    
    void ausgeben()
    {
    	std::cout << "\nAusgabe der Liste: \n" << std::endl;
    
    //	std::vector<Paar>::iterator it;
    //	for(it = paare.begin(); it < paare.end(); it++)
    //	{
    //		std::cout << it->wort << "\t=\t" << it->n << std::endl;
    //	}
    }
    
    void warten()
    {
    	std::cin.clear();
    	std::cin.sync();
    	std::cin.get();
    }
    //---------------------------------------------------------------------------
    

    PS: Ich habe nichts überschrieben. Ich habe einfach nur den Quelltext aus der Datei kopiert und in eine neue Datei in meinem neuen Projekt eingefügt.



  • Ach ... was auch nich wichtig ist. Im Release-Mod kann ich Kompilieren. Leider ist das Ergebnis nicht das gewünschte!
    Das Programm startet, zählt aber nur die Häufigkeit des ersten eingegebenen Wortes.

    Eingabe:

    Hallo
    Hallo
    e
    Test
    Test
    e
    e
    quit

    Ausgabe:

    Hallo 2
    e 1638147
    Test 1638146
    quit 1638145

    Auffällig ist hier, dass e am häufigsten vorkommt und den höchsten Zahlenwert hat. Die anderen weichen genau um die Differenz der Eingabehäufigkeiten ab.



  • Ohne irgendetwas an den Einstellungen verändert zu habe, konnte ich folgenden Code kompilieren!

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    #include <iostream>		//OK
    #include <vector>		//OK
    #include <string>		//OK
    
    //---------------------------------------------------------------------------
    
    void wait();			//OK
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
    	std::cout << "IOStream works!" << std::endl;	//OK											
    
    	std::vector<std::string> arrString;				//OK
    	std::string str = "String works also!";			//OK
    
    	arrString.push_back("Vector works too!");		//OK
    	arrString.push_back("Just");					//OK
    	arrString.push_back("a");						//OK
    	arrString.push_back("few");						//OK
    	arrString.push_back("Strings");					//OK
    
    	std::vector<std::string>::iterator it;			//OK
    
    	std::cout << "\n";								//OK
    
    	for(it = arrString.begin(); it != arrString.end(); it++)		//OK
    	{
    		std::cout << *it << std::endl;				//OK			
    	}
    
    	std::cout << "\nCool - I can use also iterators!" << std::endl;		//OK
    
    	wait();
    	return 0;
    }
    
    void wait()
    {
    	std::cin.clear();	//OK
    	std::cin.sync();	//OK
    	std::cin.get();		//OK
    }
    //---------------------------------------------------------------------------
    


  • und hier kommt die nächste Merkwürdigkeit:

    Ich habe folgenden Code:

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    #include <iostream>
    #include <string>
    #include <vector>
    
    //---------------------------------------------------------------------------
    
    struct Pair
    {
    	std::string word;
    	int count;
    };
    
    std::vector<Pair> pairs;
    
    void wait();
    void insert(const std::string& str);
    void print();
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
    	std::string inStr = " ";
    
    	while(inStr != "quit") {
            std::cin >> inStr;
    	}
    
    	wait();
    	return 0;
    }
    
    void wait()
    {
    	std::cin.clear();
    	std::cin.sync();
    	std::cin.get();
    }
    
    void insert(const std::string& str)
    {
    	bool b = false;
    
    	std::vector<Pair>::iterator it;
    	if(str != "quit")
    	{
    		for(it = pairs.begin(); it != pairs.end(); it++)
    		{
    			if(it->word == str) {
    				it->count++;
    				b = true;
    				break;
                }
    		}
    
    		if(!b)
    		{
    			Pair p = {str, 1};
    			pairs.push_back(p);
            }
    	}
    }
    
    void print()
    {
    //	std::cout << "Count of each word:";
    //
    //	std::vector<Pair>::iterator it;
    //	for(it = pairs.begin(); it != pairs.end(); it++)
    //	{
    //		std::cout << " ";
    //	}
    }
    
    //---------------------------------------------------------------------------
    

    Sobald ich die Funktion print definieren will, kommt der Linker-Error,
    ich muss nur void print() {} schreiben und schon spinnt der Linker.
    Meldung mal wieder:

    [Linker Fataler Fehler] Fatal: Zugriffsverletzung. Link beendet.

    Eine VCL Anwendung kann ich aber problemlos kompilieren.



  • Aktiviere mal Multithreading. Ich weiß nicht, wie ausführlich die Konfiguration ohne Multithreading getestet worden ist.

    Ansonsten läßt sich das Problem möglicherweise umgehen, indem du den Linker durch eine neuere Version ersetzt, die du von einem aktuelleren C++Builder-Release (2007, 2009, 2010, XE) ausleihen könntest.

    Wenn das Problem trotz aller Maßnahmen weiterbesteht, wäre ich für ein komplettes Projekt, mit dem das Problem reproduzierbar ist, dankbar.



  • Jetzt tritt der Fehler nicht mehr auf, aber der Turbo Incremental Linker funktioniert nicht mehr.



  • Cooter schrieb:

    Jetzt

    Was hast du nun geändert?

    Cooter schrieb:

    aber der Turbo Incremental Linker funktioniert nicht mehr.

    Das heißt konkret?

    Edit: Typographie



  • Ich habe eine neues Projekt mit Multithreading erstellt und nur den Quellcode kopiert.
    Mehr habe ich nicht gemacht 😉

    Kann es denn sein, dass hier im Forum nur ich das Problem so lange habe?



  • Wenn Du Turbo C++ 2006 Explorer nutzt wirst Du öfters mal auf solche Probleme stoßen, speziell die Templateverarbeitung ist dort einfach *kaputt*. Ich hatte sowas auch schon öfter (Linkerfehler in Verbindung mit Templates), mit einem halben Tag rumprobieren kann man es dann aber meist hinbekommen.



  • Und was hast du dagegen gemacht?

    Ist ja blöd, wenn die Templates nicht funktionieren. Dann installiere ich mir besser wieder Delphi anstatt C++ 😛 Ne Quatsch - aber ehrlich gesagt ist das doch sehr bescheiden, dass gerade das nicht funktioniert, was C++ eigentlich attraktiv macht.



  • Nichts. Wie Du ja schon rausgefunden hast, kann man die meisten Probleme dieser Art lösen, indem man den Code etwas umstellt. Man muss aber in jedem Fall penibel darauf achten, dass man sich keine Syntaxfehler in den Code baut, denn manchmal kompiliert der Template-Code sogar mit Syntaxfehlern (funktioniert dann aber nicht).


Anmelden zum Antworten