Adresse von einem Element zuweisen



  • Hey Leute,

    auch wenn der Titel nicht der passendster ist (ich wusste nicht wie ich das sonst hinschreiben soll) ich habe eine Frage

    Hier die Classe: (das ist nur eine Übung!)

    //Die Klasse kiste
    ref class kiste {
    private:
    	Single breite;
    	Single hoehe;
    	Single laenge;
    	Single volumen;
    	void berechnen();
    	void suchBearbeiten(String ^suchen);
    	void ploeschen(String ^suchen);
    	kiste^ pSuchen(String ^suchen);
    	kiste^ next;
    public:
    	property String ^name;
    	kiste();
    	void eingabe();
    	void ausgabe();
    	Single einlesen();
    	kiste^ einfuegen(kiste ^ende);
    	void bearbeiten();
    	void loeschen();
            void suchen();
    };
    

    So lege ich neue Einträge an und erzeuge bei öfterem Aufrufen eine Liste

    //Die Methode einfuegen
    kiste^ kiste::einfuegen(kiste ^ende)
    {
    	if(name != nullptr)
    	{
    		next = gcnew kiste();
    		next->eingabe();
    		return next;
    	}
    	else {
    		eingabe();
    		return ende;
    	}
    }
    

    In dieser Methode wird die pSuchen-Methode aufgerufen:

    void kiste::suchen();
    {
    	String ^suchen;
            kiste ^fund;
    
    	Console::Write("Geben Sie die zu suchende Kiste ein: ");
    	suchen = Console::ReadLine();
    
    	fund = pSuchen(suchen);//aufruf & übergabe
    
    	if(fund != nullptr)
    		Console::WriteLine("Die Kiste \"{0}\" wurde gefunden!", fund->name);
    	else
    		Console::WriteLine("Die Kiste wurde nicht gefunden!");
    }
    

    Ich habe in der Methode ein Problem:

    void kiste::pSuchen(String ^suchen)
    {
    	if(name == suchen)
    		return .....; //hier würde ich gerne die Adresse von den aktuellen Element zurückgeben
    	else
    		next->pSuchen(suchen);
    }
    

    Wie komme ich an die Adresse des aktuellen Elements? oder muss ich noch ein Handle "last" vereinbaren und dann kann ich über "next->last" die aktuelle Adresse bekommen?

    Bitte um Antworten

    Gruß
    Rudolf



  • Schon wieder kisten!

    Also ich weiss nicht was hier abgeht, aber ich seh hier keinen Algorithmus der next->last beinhaltet.

    Bitte folge doch den Rat und kauf dir erstmal ein Buch (wirklich, irgendein Buch), und beschäftige dich damit, bis du älter und klüger geworden bist.



  • WeaponX2007 schrieb:

    Schon wieder kisten!

    Dann stehl dir vor das heißt Auto, wenn dich die Kisten stören. In einem Buch aus dem ich lerne gab es mal die Aufgabe so ein Programm zu erstellen "Lagerverwaltung" aber mit ISO C++ Arrays. Ich versuche freiwillig diese Aufgabe an allem neuen das ich lerne auch umzusetzten. (übungshalber!). z. B. CLR-Array und jetzt in der Objektorientierten Programmierung.

    WeaponX2007 schrieb:

    Also ich weiss nicht was hier abgeht, aber ich seh hier keinen Algorithmus der next->last beinhaltet.

    Über

    next = gcnew kiste;
    

    lege ich ein neues Objekt an und so wird die liste immer "länger" wenn ich jetzt noch in einer Handle die Adresse des vorherigen Objekts abspreichern würde dann könnte man über

    next->last
    

    die aktuelle Adresse bekommen

    WeaponX2007 schrieb:

    Bitte folge doch den Rat und kauf dir erstmal ein Buch (wirklich, irgendein Buch), und beschäftige dich damit, bis du älter und klüger geworden bist.

    Vielen Dank für den Rat aber ich bekomme ihn zum ersten mal zu hören. Da ich sonst immer in diesem Forum einer der "Antworter" bin.

    Naja älter hat wirklich nichts damit zu tun aber das klüger schon und besonders beim Programmieren geht "Probieren über Studieren" und da kommt es schon mal vor das man etwas nicht weiß bzw. nicht versteht. (aber das keine neue Argumente kommen: ich lese einpaar Bücher zu C++/CLI!)

    Außerdem habe ich nicht gepostet: "Löst einer für mich die Aufgabe", oder?
    Ich habe eine konkrete Frage mit einem Lösungsvorschlag gemacht!

    Um zu zeigen wie ich ein Objekt anlege habe ich noch die Methode "einfugen()" oben eingefügt!

    Ich hoffe das mir jemand hilft oder zumindest weiter Tipps gibt (außer kauf dir ein Buch!)



  • Hey Rudi G,

    der Vorschlag mit dem Buch kaufen von WeaponX2007 ist schon nicht verkehrt, nur ein vernünftiges Buch zu finden ist nicht ganz so einfach, ich selber schwöre auf das hier…

    http://www.thalia.de/shop/buch_startseite_thalia/suchartikel/ivor_horton_s_beginning_visual_c_2008/ivor_horton/ISBN0-470-22590-4/ID15013997.html?jumpId=468685

    Ist aber in Englisch…
    Was aber eh in vielen Fällen besser ist, auch wenn sich einige mit Englisch schwer tun.

    Mit der Adresse ist so eine Sache bei dem Garbage Collector, da der Speicher ständig durch den GC neu strukturiert wird.

    Wenn Du das Programm mal debuggst, wirst Du sehen, dass sich die Adresse ständig ändert, weil der GC durch das neu sortieren, leere Speicherblöcke vermeiden will.

    "Wenn ich richtig in der Schule aufgepasst habe und der Dozent mir das richtig erklärt hat, ist das so."
    Deswegen ist der direkte Zugriff auf einen Speicherbereich im GC nicht anzuraten.

    Ich würde Dir empfehlen, die Klasse durch einen Byte kistenID (Wenn Du mit 256 Kisten auskommst!) zu erweitern.

    Und über diese ID lässt Du die gewünschte Kiste mit...

    if (answer == 4) //Menüpunkt 4 wurde ausgewählt "Anzeigen der Daten einer vorhanden Kiste.".
    				{
    					Byte IDnummer; //Die Variable für die ID Nummer der Kiste von der die Daten angezeigt werden soll
    					Console::Clear();
    					Console::Write("\nGeben Sie bitte die Kistennummer ein: ");
    					IDnummer = Convert::ToByte(Console::ReadLine());
    
    					if (IDnummer == 0 || IDnummer> 100) //Ist der Wert 0 oder über 100 gibt es die Kiste nicht, wir haben ja nur 100 Felder
    					{
    						Console::Clear();
    						Console::WriteLine("\nDie eingegebene Kistennummer ist nicht gültig.");
    					}
    					else
    					{
    						if (kiste[IDnummer-1].kistenID == IDnummer) //Beide Werte müssen gleich sein, sonst ist die Kiste nicht vorhanden
    						{
    							datenEinerVorhandenKisten(IDnummer,kiste[IDnummer-1].breite,kiste[IDnummer-1].laenge,kiste[IDnummer-1].hoehe,kiste[IDnummer-1].volumen);
    						}
    						else
    						{
    							Console::Clear();
    							Console::WriteLine("\nEs existiert keine Kiste mit der Nummer {0}.",IDnummer);
    						}
    					}
    				}
    

    ...ausgeben.

    Und das zuweisen der ID würde ich so machen...

    kistenBestand neueKisteAufnehmen(Byte kistenNummer)//Neue Kiste aufnehmen
    {
    	kistenBestand aKiste;
    	Boolean EingabeOKnewBox = true; //Die Variable für die while-Schleife
    
    while(EingabeOKnewBox ==true)
    {
    	try
    	{
    			aKiste.kistenID = kistenNummer+1; //Die Kisten ID wird um 1 erhöht, sonst hätten wir eine Kiste 0
    
    			Console::Write("\nBitte geben Sie die Länge der Kiste ein: ");
    
    			aKiste.laenge = Convert::ToDouble(Console::ReadLine());
    
    			Console::Write("\nBitte geben Sie die Breite der Kiste ein: ");
    
    			aKiste.breite = Convert::ToDouble(Console::ReadLine());
    
    			Console::Write("\nBitte geben Sie die Höhe der Kiste ein: ");
    
    			aKiste.hoehe = Convert::ToDouble(Console::ReadLine());
    
    			aKiste.volumen = (aKiste.laenge * aKiste.breite * aKiste.hoehe);
    
    			Console::Clear();
    			Console::WriteLine("\nDie Eingabe wurde als {0}. Kiste erfolgreich gespeichert.\n",kistenNummer+1);//IDKistenzaehler
    
    			EingabeOKnewBox=false; //Die Variable für die while-Schleife auf 'false' setzen, weil die Eingabe Ok war.
    	}//try
    	catch (...)
    					{
    						Console::Clear();
    						Console::WriteLine("\nDie Eingabe ist nicht gültig. Bitte geben Sie die Daten für die {0}. Kiste ein.",kistenNummer+1);
    					}	
    }//while Schleife
    
    	return aKiste;
    
    }
    

    Da Du die Liste ja nicht Rückwärts ausgeben möchtest, ist die letzte Adresse unwichtig.
    Zumal ist die Letzte Adresse eh in der aktuellen Adresse hinterlegt.

    Also in

    „next = gcnew kiste;“

    Gruß, Doug_HH



  • Doug_HH schrieb:

    Hey Rudi G,

    der Vorschlag mit dem Buch kaufen von WeaponX2007 ist schon nicht verkehrt, nur ein vernünftiges Buch zu finden ist nicht ganz so einfach, ich selber schwöre auf das hier…

    http://www.thalia.de/shop/buch_startseite_thalia/suchartikel/ivor_horton_s_beginning_visual_c_2008/ivor_horton/ISBN0-470-22590-4/ID15013997.html?jumpId=468685

    Ist aber in Englisch…
    Was aber eh in vielen Fällen besser ist, auch wenn sich einige mit Englisch schwer tun.

    Vielen Dank für den Tipp. Auch wenn ich mich mit Englisch schwer tue werde ich es mir mal überlegen 🙂

    Doug_HH schrieb:

    Mit der Adresse ist so eine Sache bei dem Garbage Collector, da der Speicher ständig durch den GC neu strukturiert wird.

    Wenn Du das Programm mal debuggst, wirst Du sehen, dass sich die Adresse ständig ändert, weil der GC durch das neu sortieren, leere Speicherblöcke vermeiden will.

    "Wenn ich richtig in der Schule aufgepasst habe und der Dozent mir das richtig erklärt hat, ist das so."
    Deswegen ist der direkte Zugriff auf einen Speicherbereich im GC nicht anzuraten.

    Sorry ich habe Adresse geschrieben. Ich meinte das ich Handles einsetze und in Handles wird nicht die Adresse sonders der Wert Abgelegt und somit kann man das Sortieren bzw. die wechselnde Adresse "umgehen".

    Doug_HH schrieb:

    Ich würde Dir empfehlen, die Klasse durch einen Byte kistenID (Wenn Du mit 256 Kisten auskommst!) zu erweitern.

    Ich möchte das die neuen Einträge dynamisch zur Laufzeit erstellt werden sollen, auch wenn das hier nur ne Übung ist, möchte ich es "Realitätsnah" realisieren. Wer weiß wieviel "Datensätze" der jeweilige Anwender brauchen wird? (einem reichen 250 und dem anderen nicht ;))

    Deswegen sollen "beliebig" viele dynamisch -wenn die auch wirklich gebraucht werden- angelegt werden. Ich mache es in Form einer einfachen Liste.

    Doug_HH schrieb:

    Da Du die Liste ja nicht Rückwärts ausgeben möchtest, ist die letzte Adresse unwichtig.

    Auch wenn ich die Liste rückwärts ausgeben möchte würde bräuchte ich nicht die letzte Adresse (in einem extra Handle). Ich könnte zuerst bis zum letzten "Datensatz" durch die Rekursion (ruft sich immmer wieder selber auf!) der Methode gehen und dann die Datensätze ausgeben. (dann fängt es bei dem letzten Datensatz an und geht rückwärts!).

    Doug_HH schrieb:

    Zumal ist die Letzte Adresse eh in der aktuellen Adresse hinterlegt.

    Also in

    „next = gcnew kiste;“

    Gruß, Doug_HH

    Das stimmt auch. Ich könnte jetzt "next" zurückgeben dann hätte ich die Daten des nächsten Elements in der Liste aber ich möchte das aktuelle Element der Liste zurückgeben. Wie kann ich das machen?

    Ich hoffe ich konnte meine Frage etwas besser Formulieren bzw. mein Problem richtig darstellen.

    Wenn nicht werde ich mal das "next->last" so wie ich mir das vorstelle ausprobieren und dann hier posten damit ihr versteht was ich meine. (Ihr könntet auch sagen dann mach es doch einfach so aber ich möchte wiesen ob es eine andere/einfachere Lösung gibt!)


Anmelden zum Antworten