Fehler bei Start ohne Debugger, kein Fehler mit Debugger



  • Hi!
    I bin am verzweifeln!
    Ich habe ein Programm mit Visual C++ 2005 Express geschrieben, welches eine Datenbank von Personen erstellen soll.
    Dazu habe ich eine Art Menü geschrieben, wobei beim Menü 2 Arten von Punkten existieren:
    Die erste Möglichkeit ist nur ein Menüpunkt zum Auswählen.
    Die zweite Möglichkeit: Ein Menüpunkt, wobei rechts neben dem Menüpunkt Daten eingegeben werden.
    Doch hier liegt der Fehler:
    Starte ich das Programm ohne Debuggen (Strg+F5), so wird eine Fehlermeldung ausgegeben, wobei aber nicht der Fehler bechrieben wird.
    Starte ich das Programm mit Debuggen (F5) so wird keine Fehlermeldung ausgegeben.
    Das Menü ist wie folgt aufgebaut:

    //Menu.h
    
    struct menuItems
    {
    	char * ItemName;
    	bool ReadIn;
    	char * ReadData;
    };
    
    class menu
    {
    public:
    	menuItems * menuList;
    	int showMenu(void);
    	int ItemsCount;
    	bool createMenuItem(char* ItemName, bool ReadIn, char * ReadData, int Index);
    	char * MenuTitle;
    private:
    	void DrawMenu(void);
    	enum arrowMove{up, down};
    	void moveArrow(arrowMove way);
    };
    

    In der Funktion DrawMenu wird der Fehler bei
    cout << menuList[i].ReadData;
    verursacht:

    //Menu.cpp
    
    void menu::DrawMenu(void)
    {
    	system("cls");
    	setColor(clDarklila, clBlack);
    	cout << "\n\n\n\n\t\t\t\t" << MenuTitle << "\n\n";
    	setColor(clGray, clBlack);
    	for (int i=0; i<ItemsCount; i++)
    	{
    		if (i==selected)
    		{
    			cout << "\t\t\t ";
    			setColor(clGreen, clBlack);
    			cout << arrowFwd;
    			setColor(clGray, clBlack);
    			cout << " ";
    			setColor(clRed, clBlack);
    			cout << menuList[i].ItemName;
    			if (menuList[i].ReadIn)
    			{
    				setColor(clGray, clBlack);
    				cout << ": ";
    				setColor(clYellow, clBlue);
    				cout << menuList[i].ReadData;
    			}
    			setColor(clGray, clBlack);
    			cout << " ";
    			setColor(clGreen, clBlack);
    			cout << arrowBck << endl;
    		}
    		else
    		{
    			cout << "\t\t\t   "<< menuList[i].ItemName;
    			if (menuList[i].ReadIn)
    			{
    				setColor(clGray, clBlack);
    				cout << ": ";
    				setColor(clGreen, clBlue);
    				cout << menuList[i].ReadData;
    
    			}
    			cout << endl;
    		}
    		setColor(clGray, clBlack);
    	}
    }
    

    Das Menü wird wie folgt erstellt:

    //Main.cpp
    
    //aufruf:
    
    int main()
    {
    	int choice;
    	MainMenu.MenuTitle = "Hauptmenue";
    	MainMenu.createMenuItem("Test", false, "", 0);
    	MainMenu.createMenuItem("Test1", true, "Hallo", 1);
    	MainMenu.showMenu();
    }
    
    //Menu.cpp
    
    void menu::moveArrow(arrowMove way)
    {
    	if (way == up)
    	{
    		if (selected == 0)
    			selected = ItemsCount -1;
    		else
    			selected--;
    	}
    	if (way == down)
    	{
    		if (selected == ItemsCount-1)
    			selected = 0;
    		else
    			selected++;
    	}
    }
    
    int menu::showMenu(void)
    {
    	DrawMenu();
    	char taste;
    	do
    	{
    		do
    		{
    			taste=(int)_getch();
    		}
    		while ((taste != 80) && (taste != 72) && (taste != 13));
    		switch(taste)
    		{
    			case 80: moveArrow(down); break;
    			case 72: moveArrow(up); break;
    		}
    		DrawMenu();
    
    	}
    	while (taste!=13);
    	return selected;
    }
    
    bool menu::createMenuItem(char *ItemName, bool ReadIn, char *ReadData, int Index)
    {
    	if (ItemsCount < Index-1)
    	return false;
    	if (ItemsCount == Index)
    	{
    		menuItems* bufList = (menuItems*) malloc(sizeof(menuList));
    		for (int i=0; i<ItemsCount; i++)
    		{
    			bufList[i] = menuList[i];
    		}
    		menuList = (menuItems*) malloc(sizeof(menuList) + sizeof(menuItems));
    		for (int i=0; i<ItemsCount; i++)
    		{
    			menuList[i]=bufList[i];
    		}
    		ItemsCount++;
    	}
    	menuList[Index].ItemName = ItemName;
    	menuList[Index].ReadIn = ReadIn;
    	menuList[Index].ReadData = ReadData;
    	return true;
    }
    

    Wenn ich in der Funktion DrawMenu die Zeile
    cout << menuList[i].ReadData;
    mit
    cout << "test";
    ersetzte, wird kein Fehler ausgegeben.

    Kann mir jemand helfen?
    Danke

    Edit:
    Beim Kopmilieren kommt folgende Fehlermeldung:
    LINK : ...\Visual Studio 2005\Projects\NameDatabase\Debug\NameDatabase.exe not found or not built by the last incremental link; performing full link
    Embedding manifest...

    Guckst Du:

    ------ Build started: Project: NameDatabase, Configuration: Debug Win32 ------
    Linking...
    LINK : c:\Visual Studio 2005\Projects\NameDatabase\Debug\NameDatabase.exe not found or not built by the last incremental link; performing full link
    Embedding manifest...
    Build log was saved at "file://c:\Visual Studio 2005\Projects\NameDatabase\NameDatabase\Debug\BuildLog.htm"
    NameDatabase - 0 error(s), 0 warning(s)
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    


  • Und wir dürfen jetzt raten, wie die Fehlermeldung lautet?

    Ich sehe auf die Schnelle nur, daß die Menu-Klasse einen Ctor benötigen könnte, der seine Elemente vernünftig vorbelegt.

    (kleiner Tip: Ersetze mal die char*'s durch std::string und die menuItem* durch std::vector<menuItem> - ist um einiges sicherer in der Handhabung)



  • Ich habe jetzt zu Hause mit Visual Studio 2005 kompiliert.
    Da erscheint mit Strg+F5 folgende Fehlermeldung:

    ---------------------------
    NameDatabase.exe - Fehler in Anwendung
    ---------------------------
    Die Anweisung in "0x7c921639" verweist auf Speicher in "0x003b2dc5". Der Vorgang

    "read" konnte nicht auf dem Speicher durchgeführt werden.

    Klicken Sie auf "OK", um das Programm zu beenden.
    Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
    ---------------------------
    OK Abbrechen
    ---------------------------

    Ich werden jetzt mal das oben versuchen.
    Ich denke mir, dass in
    menuList[i].ReadData;
    irgendwie nicht richtig eingespeichert wird ?!

    Ich kann auch gerne den Code als ganzes mailen (oder weiß jemand eine Seite, wo man gratis Dateien online stellen kann).



  • So!
    Ich habe jetzt einmal ein paar char* mit std::string ersetzt. Jetzt funztz!
    Danke für den Hinweis.



  • PinkoPalino schrieb:

    ---------------------------
    NameDatabase.exe - Fehler in Anwendung
    ---------------------------
    Die Anweisung in "0x7c921639" verweist auf Speicher in "0x003b2dc5". Der Vorgang

    "read" konnte nicht auf dem Speicher durchgeführt werden.

    Klicken Sie auf "OK", um das Programm zu beenden.
    Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
    ---------------------------
    OK Abbrechen
    ---------------------------

    Klick einfach mal auf "Abbrechen" und schau nach, wo du landest 😉


Anmelden zum Antworten