Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C++CLI / VB .Net / .Net-Framework » Rekursiver Auftruf

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.03.2009, 11:14 Uhr
ausgtown



Hallöchen ich habe hier ein kleines Problem... ich möchte im folgenden Quelltext eine Funktion für Rückwärtsausgabe haben. Das soll durch den Rekursiven Aufruf der Methode passieren. Ich blick hier irgendwie nicht durch kann mir jemand helfen bitte?



Code:

/* #################################################
Rekursive Ausgabe
################################################# */

#include "stdafx.h"

using namespace System;

ref class listenelement {
    String ^daten;
    listenelement ^next;
public:
    void datenSetzen(String ^datenneu);
    void einfuegen(String ^datenneu);
    void ausgeben();
    void ausgebenRueck();
};

//die Zeichenkette in das Element schreiben
void listenelement::datenSetzen(String ^datenneu) {
    daten=datenneu;
}
    
//neues Element am Ende der Liste einfügen
void listenelement::einfuegen(String ^datenneu) {
    //hat next den Wert nullptr?
    //dann ein neues Element einfügen
    if (next == nullptr) {
        next = gcnew listenelement;
        next->daten=datenneu;
        //nullptr wird automatisch zugewiesen!
    }
    //sonst die Methode für next noch einmal aufrufen
    else
        next->einfuegen(datenneu);
    //nur zur Veranschaulichung
    Console::WriteLine("Daten {0} wurden eingefügt.",datenneu);
}

//Alle Elemente der Liste ausgeben
void listenelement::ausgeben() {
    //den ersten Eintrag ausgeben
    Console::WriteLine("{0}",daten);
    //wenn das Ende nicht erreicht ist, die Methode für next erneut aufrufen
    if (next != nullptr)
        next->ausgeben();
}
void listenelement::ausgebenRueck(String ^datenneu){
    Console::WriteLine("{0}",datenneu);
    if(next == nullptr)
        next-> ausgebenRueck();
}

int main(array<System::String ^> ^args)
{
    //Handle auf den Anfang der Liste
    listenelement ^liste;

    //das erste Element per Hand erzeugen
    liste = gcnew listenelement;
    //Zeichenkette in das erste Element schreiben
    liste->datenSetzen("Element 0");

    //in einer Schleife mehrere Elemente einfügen
    for (Int32 schleife=1;schleife<3;schleife++)
        liste->einfuegen("Element "+schleife);

    //die Liste ausgeben
    liste->ausgeben();

    //die Liste Rückwärs ausgeben
    liste->ausgebenRueck();

    return 0;
}



Vielen Dank
Claudsch

Dieser Post wurde am 29.03.2009 um 11:19 Uhr von ausgtown editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.03.2009, 11:18 Uhr
Oliver
S2-Pixelgeneral


Wo ist denn das genaue Problem?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.03.2009, 11:21 Uhr
ausgtown



Hallo und Dank für die schnelle Rückmeldung,

ich bekomme folgende Fehlermeldung:

1>------ Erstellen gestartet: Projekt: Rekursive Ausgabe, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Rekursive Ausgabe.cpp
1>.\Rekursive Ausgabe.cpp(48) : error C2511: 'void listenelement::ausgebenRueck(System::String ^)': Überladene Memberfunktion nicht in 'listenelement' gefunden
1> .\Rekursive Ausgabe.cpp(9): Siehe Deklaration von 'listenelement'
1>Das Buildprotokoll wurde unter "file://dRekursive Ausgabe\Rekursive Ausgabe\Debug\BuildLog.htm" gespeichert.
1>Rekursive Ausgabe - 1 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

Dieser Post wurde am 29.03.2009 um 11:26 Uhr von ausgtown editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.03.2009, 11:26 Uhr
Tommix



Hallo,
eigentlich steht es da. In der Klassendeklaration:

C++:
void ausgebenRueck();


fehlt der String^-Parameter.
Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.03.2009, 11:37 Uhr
ausgtown



Hi... das hab ich korrigiert und stolpere prompt in die nächsten Fehlermeldungen

1>Kompilieren...
1>Rekursive Ausgabe.cpp
1>.\Rekursive Ausgabe.cpp(48) : error C2511: 'void listenelement::ausgebenRueck(void)': Überladene Memberfunktion nicht in 'listenelement' gefunden
1> .\Rekursive Ausgabe.cpp(9): Siehe Deklaration von 'listenelement'
1>.\Rekursive Ausgabe.cpp(72) : error C2660: 'listenelement::ausgebenRueck': Funktion akzeptiert keine 0 Argumente

aktueller Quelltext:


Code:

/* #################################################
Rekursive Ausgabe
################################################# */

#include "stdafx.h"

using namespace System;

ref class listenelement {
    String ^daten;
    listenelement ^next;
public:
    void datenSetzen(String ^datenneu);
    void einfuegen(String ^datenneu);
    void ausgeben();
    void ausgebenRueck(String ^datenneu);
};

//die Zeichenkette in das Element schreiben
void listenelement::datenSetzen(String ^datenneu) {
    daten=datenneu;
}
    
//neues Element am Ende der Liste einfügen
void listenelement::einfuegen(String ^datenneu) {
    //hat next den Wert nullptr?
    //dann ein neues Element einfügen
    if (next == nullptr) {
        next = gcnew listenelement;
        next->daten=datenneu;
        //nullptr wird automatisch zugewiesen!
    }
    //sonst die Methode für next noch einmal aufrufen
    else
        next->einfuegen(datenneu);
    //nur zur Veranschaulichung
    Console::WriteLine("Daten {0} wurden eingefügt.",datenneu);
}

//Alle Elemente der Liste ausgeben
void listenelement::ausgeben() {
    //den ersten Eintrag ausgeben
    Console::WriteLine("{0}",daten);
    //wenn das Ende nicht erreicht ist, die Methode für next erneut aufrufen
    if (next != nullptr)
        next->ausgeben();
}
void listenelement::ausgebenRueck(){
    Console::WriteLine("{0}",datenneu);
    if(next == nullptr)
        next-> ausgebenRueck();
}

int main(array<System::String ^> ^args)
{
    //Handle auf den Anfang der Liste
    listenelement ^liste;

    //das erste Element per Hand erzeugen
    liste = gcnew listenelement;
    //Zeichenkette in das erste Element schreiben
    liste->datenSetzen("Element 0");

    //in einer Schleife mehrere Elemente einfügen
    for (Int32 schleife=1;schleife<3;schleife++)
        liste->einfuegen("Element "+schleife);

    //die Liste ausgeben
    liste->ausgeben();

    //die Liste Rückwärs ausgeben
    liste->ausgebenRueck();

    return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.03.2009, 12:30 Uhr
0xdeadbeef
Gott
(Operator)


Die Lösung ist genau umgedreht. Im ersten Stück Code schreibst du

C++:
    void ausgebenRueck();


...aber später

C++:
void listenelement::ausgebenRueck(String ^datenneu){


Aufgerufen wird das ganze überall ohne Parameter, dementsprechend musst du nicht in der Deklaration einen Parameter einfügen, sondern ihn bei der Definition entfernen, also

C++:
void listenelement::ausgebenRueck(){



Außerdem handelt es sich hier um C++/CLI-Code, dementsprechend verschiebe ich das ganze mal ins .net-Forum.

-->
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.03.2009, 12:40 Uhr
ausgtown



äääh danke erstma.. aber das verstehe ich nicht.....

das habe ich doch...

C++:
void listenelement::ausgebenRueck(){





Code:

/* #################################################
Rekursive Ausgabe
################################################# */

#include "stdafx.h"

using namespace System;

ref class listenelement {
    String ^daten;
    listenelement ^next;
public:
    void datenSetzen(String ^datenneu);
    void einfuegen(String ^datenneu);
    void ausgeben();
    void ausgebenRueck();
};

//die Zeichenkette in das Element schreiben
void listenelement::datenSetzen(String ^datenneu) {
    daten=datenneu;
}
    
//neues Element am Ende der Liste einfügen
void listenelement::einfuegen(String ^datenneu) {
    //hat next den Wert nullptr?
    //dann ein neues Element einfügen
    if (next == nullptr) {
        next = gcnew listenelement;
        next->daten=datenneu;
        //nullptr wird automatisch zugewiesen!
    }
    //sonst die Methode für next noch einmal aufrufen
    else
        next->einfuegen(datenneu);
    //nur zur Veranschaulichung
    Console::WriteLine("Daten {0} wurden eingefügt.",datenneu);
}

//Alle Elemente der Liste ausgeben
void listenelement::ausgeben() {
    //den ersten Eintrag ausgeben
    Console::WriteLine("{0}",daten);
    //wenn das Ende nicht erreicht ist, die Methode für next erneut aufrufen
    if (next != nullptr)
        next->ausgeben();
}
void listenelement::ausgebenRueck(){
    Console::WriteLine("{0}",datenneu);
    if(next == nullptr)
        next-> ausgebenRueck();
}

int main(array<System::String ^> ^args)
{
    //Handle auf den Anfang der Liste
    listenelement ^liste;

    //das erste Element per Hand erzeugen
    liste = gcnew listenelement;
    //Zeichenkette in das erste Element schreiben
    liste->datenSetzen("Element 0");

    //in einer Schleife mehrere Elemente einfügen
    for (Int32 schleife=1;schleife<3;schleife++)
        liste->einfuegen("Element "+schleife);

    //die Liste ausgeben
    liste->ausgeben();

    //die Liste Rückwärs ausgeben
    liste->ausgebenRueck();

    return 0;
}




nun versteht ich gar nix mehr.....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.03.2009, 14:12 Uhr
0xdeadbeef
Gott
(Operator)


Inzwischen ja, aber am Anfang war das das Problem. Mit der letzten Version stimmen die Signaturen und Aufrufe auch überein, also sollten die selben Fehler nicht mehr auftreten.

In der zweiten Version war das Problem genau umgekehrt, dass du

C++:
void ausgebenRueck(String ^datenneu);


und

C++:
void listenelement::ausgebenRueck(){


hattest, die ebenfalls nicht zusammenpassten. Übrigens erschweren unkommentierte Änderungen am Code in Forenbeiträgen die Diskussion insofern, als dass die Leute im Zweifel davon ausgehen, dass sich nur der besprochene Teil geändert hat. Solche Dinge gehen dabei verloren und erzeugen eine Menge Konfusion - aber das nur am Rande.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.03.2009, 16:50 Uhr
ausgtown



Ok danke für den Hinweis. Du hast recht jetzt tritt nur noch eine Meldung auf:

cpp(50) : error C2065: 'datenneu': nichtdeklarierter Bezeichner

klar weil ich das ganze nun nirgendwo mehr angelegt habe.... aber wo soll ich es machen wenn nich da wo es vorher war?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
29.03.2009, 17:07 Uhr
ausgtown



ähm vergiß es ich habs :-D

nun fehlt nur noch die Rückwärtsausgabe, weil die macht es irgendwie nicht :-( sprich der Rekursive Aufruf


Code:

#include "stdafx.h"

using namespace System;

ref class listenelement {
    String ^daten;
    listenelement ^next;
    String ^datenneu;
public:
    void datenSetzen(String ^datenneu);
    void einfuegen(String ^datenneu);
    void ausgeben();
    void ausgebenRueck();
};

//die Zeichenkette in das Element schreiben
void listenelement::datenSetzen(String ^datenneu) {
    daten=datenneu;
}
    
//neues Element am Ende der Liste einfügen
void listenelement::einfuegen(String ^datenneu) {
    //hat next den Wert nullptr?
    //dann ein neues Element einfügen
    if (next == nullptr) {
        next = gcnew listenelement;
        next->daten=datenneu;
        //nullptr wird automatisch zugewiesen!
    }
    //sonst die Methode für next noch einmal aufrufen
    else
        next->einfuegen(datenneu);
    //nur zur Veranschaulichung
    Console::WriteLine("Daten {0} wurden eingefügt.",datenneu);
}

//Alle Elemente der Liste ausgeben
void listenelement::ausgeben() {
    //den ersten Eintrag ausgeben
    Console::WriteLine("{0}",daten);
    //wenn das Ende nicht erreicht ist, die Methode für next erneut aufrufen
    if (next != nullptr)
        next->ausgeben();
}
void listenelement::ausgebenRueck(){
    Console::WriteLine("{0}",datenneu);
    if(next == nullptr)
        next-> ausgebenRueck();
}

int main(array<System::String ^> ^args)
{
    //Handle auf den Anfang der Liste
    listenelement ^liste;

    //das erste Element per Hand erzeugen
    liste = gcnew listenelement;
    //Zeichenkette in das erste Element schreiben
    liste->datenSetzen("Element 0");

    //in einer Schleife mehrere Elemente einfügen
    for (Int32 schleife=1;schleife<3;schleife++)
        liste->einfuegen("Element "+schleife);

    //die Liste ausgeben
    Console::WriteLine("Die Liste vorwärts:\n");
    liste->ausgeben();
    Console::WriteLine("Die Liste rückwärts:\n");
    //die Liste Rückwärs ausgeben
    liste->ausgebenRueck();

    return 0;
}


Dieser Post wurde am 29.03.2009 um 17:14 Uhr von ausgtown editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C++CLI / VB .Net / .Net-Framework ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: