Bäume



  • ähhhhh, da hast wohl recht...

    schön langsam wirds schwierig mich noch glaubhaft hinauszureden :p



  • ähh, weiß jemand wo das Problem liegt, wenn die cin anweisung nichts mehr reinliest trotz flush??

    for(;;)
    	{
    
    		decay = new Knoten;
    
    		//Einlesen der Daten
    		cout << endl << endl << "Name: " << flush;
    		cin >> name;
    
    		if(strcmpi(name, "exit") == 0)
    			break;
    
    		cout << "Telefonnummer: " << flush;
    		cin >> number;
    
    		strcpy(decay->name, name);
    		decay->number = number;
    		decay->pl = NULL;
    		decay->pr = NULL;
    
    		now = root;
    
    		if (now == NULL)
    			root = decay;
    
    		else
    			*now = newnode(*now, *decay);
    
    	}
    


  • ähh, weiß jemand wo das Problem liegt, wenn die cin anweisung nichts mehr reinliest trotz flush??

    Wenn cin einmal einen fehler hat hilft nur mehr cin.clear().
    flush hilft bei cin überhaupt nichts.
    Kurt

    EDIT: zeig mal wo du Probleme hast kann in dem geposteten code nichts erkennen.
    BTW cin und cout sind synchronisiert

    cout << endl << endl << "Name: " << flush;
            cin >> name;
    

    das flush ist unnütig.



  • hab das Problem, dass sich beim 2. mal einlesen der Telefonnummer sich die Nummer einfach nicht ändert.
    Denk ich hab nichts grob falsch...

    Zudem ist es so, dass beim 2. Knoten durch das

    decay = new Knoten
    

    der 2. Knoten wieder überschrieben wird.
    Ich denke, dass hat irgendwie mit dem UP zu tun(Übergabe)

    Hier also nochmal der ganze Code:

    # include <iostream>
    using namespace std;
    
    //GLOBALE VARIABLEN//
    class Knoten *root;
    
    class Knoten		//Klasse erstellen mit öffentlichem Zugriff, da default private ist
    {
    public:
    
    	char name[50];
    	int number;
    
    	class Knoten *pr;
    	class Knoten *pl;
    };
    
    //////////PROTOTYPEN//////////
    
    Knoten newnode (Knoten, Knoten);
    
    int main()
    {
    
    char name[50];
    int number=0;
    
    class Knoten *now;
    class Knoten *decay;
    
    	for(;;)
    	{
    
    		decay = new Knoten;
    
    		//Einlesen der Daten
    
    		cout << endl << endl << "Name: ";
    		cin >> name;
    		cin.clear();
    
    		if(strcmpi(name, "exit") == 0)
    			break;
    
    	        cout << "Telefonnummer: ";
    		cin >> number;
                    cin.clear();
    
    		strcpy(decay->name, name);
    		decay->number = number;
    		decay->pl = NULL;
    		decay->pr = NULL;
    
    		now = root;
    
    		if (now == NULL)
    			root = decay;
    
    		else
    			*now = newnode(*now, *decay);
    
    	}
    
    return 0;	//Rückgabewert ans Betriebssystem
    
    }
    
    Knoten newnode(class Knoten now, class Knoten decay)
    {
    
    	if(strcmpi(decay.name, now.name)<=0)
    		{
    			if(now.pl == NULL)
    				now.pl = &decay;
    
    			else
    				newnode(*now.pl, decay);
    		}
    
    	if(strcmpi(decay.name, now.name)>0)
    		{
    			if(now.pr == NULL)
    				now.pr = &decay;
    
    			else
    				newnode(*now.pl, decay);
    		}
    
    	return now;
    	//*root = now;
    }
    


  • Nehme an du versuchst einen namen mit leerzeichen einzugeben.
    cin >> name; hört auf wenn ein leerzeichen gelesen wird
    ein darauffolgendes
    cin >> number; cin geht dann auf störung.
    verwende getline zum einlesen des namens

    cin.getline( name, 50 );
    

    Kurt
    BTW du solltest zum speichern einer telefonnummer sowieso einen string verwenden ( bedenke führende 0 )



  • nochmal ^^

    hab ihn nun endlich zum gehen gebracht.
    war scheinbar wirklich das cin Schuld

    hab nun ein UP zur Ausgabe des Baumes
    doch beim Ausführen erscheint folgender Link-Fehler:

    error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl printall(class Knoten)" (?printall@@YAXVKnoten@@@Z)

    Sobald ich im Main den Funktionsaufruf weggebe, meckert nichts mehr



  • Das deutet darauf hin dass du printall() zwar declariert hast aber vergessen hast es auch zu implementieren.
    Kurt



  • Wieso überhaupt Zuweisungen ala:

    Knoten* foo;
    foo = new Knoten;
    foo->bla = 5;
    

    Wollten wir das ganze nicht aufm Stack haben? Was hat diese Variante für Vorteile gegenüber dieser:

    Knoten foo;
    foo.bla = 5;
    


  • *push*



  • El Padre schrieb:

    Wollten wir das ganze nicht aufm Stack haben?

    Ich würde nicht den kompletten Baum auf'm Stack haben wollen, weil der ist deutlich begrenzter als der Heap. Versuch doch mal ein int-Array mit 1 000 000 000 Elementen ganz normal auf'm Stack anzulegen, und dann noch einmal mit new (gib's auch wieder frei 😉 ). Die erste Version, also die den Stack benutzt, wird wahrscheinlich abstürzen. Die 2 hingegen funktioniert, sofern du genug freien Hauptspeicher hast. Reicht das als Begründung?

    MfG

    GPC



  • Ja, eigentlich schon, nur bin ich etwas verwirrt.
    Die erste verwendet doch den Heap, und die zweite den Stack, oder von welchen Versionen redest du?



  • El Padre schrieb:

    Ja, eigentlich schon, nur bin ich etwas verwirrt.
    Die erste verwendet doch den Heap, und die zweite den Stack, oder von welchen Versionen redest du?

    Also um es an meinem Beispiel zu zeigen:

    int main() {
      int arr[1000000000];  //Auf Stack angelegt -> Crash
      return 0;
    }
    
    int main() {
      //Auf Heap allokieren -> Geht bei entsprechend RAM
      int *arr = new int[1000000000];  
      delete [] arr;
      return 0;
    }
    

    EDIT:
    Ein Heap ist ja auch nur ein Array, ob wir es jetzt statisch oder dynamisch anlegen ist eine andere Geschichte.


Anmelden zum Antworten