Void Funktion mit ^String um return erweitern



  • Hallo zusammen,

    ih bin seit ca. 2 Monaten dabei C++/CLI zu lernen und stehe derzeit vor einer Wand um die ich nicht vorbeikomme 😞
    Hoffentlich könnt ihr mir weiterhelfen.

    Es geht um folgendes....ich habe eine Void Funktion die zwei ^String Werte übergeben bekommt. Ursprünglih habe ich mit tracking reference gearbeitet, so dass ich listenende auf hilfsHandle->next referenzieren konnte um das Ende einer einfach verketteten Liste zu markieren.

    Allerdings wurde mir nun gesagt, dass es auch einfacher gegangen wäre indem ich listenende über return zurückgegeben hätte....nur ich komm schlicht und einfach nicht drauf wie ich das machen soll. Totaler Blackout gerade 😞 Um einen Fingerzeig oder ähnlicheem wäre ich dankbar.

    Hier der Code:

    Void anhaengen (String ^datenneu, listenelement ^%listenende) {
    	//ein Hilfshandle zum Wandern in der Liste
    	listenelement ^hilfsHandle;
    
    	//Hilfshandle an das Ende der Liste setzen
    	hilfsHandle = listenende;
    
    	//ein neues Element anlegen
    	hilfsHandle->next = gcnew listenelement;
    
    	//Zeichenkette im neuen Element eintragen
    	hilfsHandle->daten=datenneu;
    
    	//hilfsHandle->next wird auf listenendde referenziert, wodurch ->next als letztes Element gekennzeichnet wird
    	//und beim erneueten durchgehen der Funktion als erstes aufgerufen wird
    	//Liste wird somit nicht mehr komplett durchgegangen um den letzten Wert zu finden
    
    	listenende=hilfsHandle->next;
    
    	//nullptr wird automatisch zugewiesen
    }
    


  • Meinst du sowas ?

    listenelement^ anhaengen(String^ datenneu, listenelement^ listenende)
    {
      if (listenende != nullptr)
      {
        listenende->next = gcnew listenelement;
        listenende->daten = datenneu;
    
        return listenende->next; 
      }
    
      return nullptr;
    }
    


  • Hi,

    das ist schon ein guter Ansatz....was ich aber dazu hätte sagen sollen ist, dass die Werte mit einer for schleife an die Funktion übergeben werden. Sprich, eine Liste soll aufgefüllt werden und der neue Datensatz immer am Ende der Liste angehängt werden.

    Bei der o.g. Funktion gibt mir das Programm immer nur das letzte Element aus.....zum einfacheren Verstehen werde ich mal das gesamt Listen anhängen:

    Im Prinzip möchte ich die Funktion "anhaengen" so verändern, dass sie ihre generelle funktionalität behält aber das ganze mit "return" ausgibt....ich komm nur nicht drauf wie 😞

    #include "stdafx.h"
    
    using namespace System;
    ref struct listenelement {
    	String ^daten;
    	listenelement ^next;
    	listenelement ^last;
    };
    
    //neues Element am Ende der Liste anhängen
    //mit Hilfe der tracking reference kann man den Wert des Handles listenende an einen anderen Handle übergeben
    //somit ist das Ende der Liste immer bekannt
    Void anhaengen (String ^datenneu, listenelement ^%listenende) {
    	//ein Hilfshandle zum Wandern in der Liste
    	listenelement ^hilfsHandle;
    
    	//Hilfshandle an das Ende der Liste setzen
    	hilfsHandle = listenende;
    
    	//ein neues Element anlegen
    	hilfsHandle->next = gcnew listenelement;
    
    	//Zeichenkette im neuen Element eintragen
    	hilfsHandle->daten=datenneu;
    
    	//hilfsHandle->next wird auf listenendde referenziert, wodurch ->next als letztes Element gekennzeichnet wird
    	//und beim erneueten durchgehen der Funktion als erstes aufgerufen wird
    	//Liste wird somit nicht mehr komplett durchgegangen um den letzten Wert zu finden
    
    	listenende=hilfsHandle->next;
    
    	//nullptr wird automatisch zugewiesen
    }
    
    //Alle Elemente in der Liste ausgeben
    Void ausgeben (listenelement ^listenanfang) {
    	//ein Hilfshandle zum Wandern in der Liste
    	listenelement ^hilfsHandle;
    
    	//hilfsHandle auf den Anfang der Liste setzen
    	hilfsHandle=listenanfang;
    
    	//erstes Element ausgeben
    	Console::WriteLine("{0}", hilfsHandle->daten);
    
    	//Solange das Ende der Liste nicht erreicht ist, hilfsHandle auf das nächste Element setzen und die Daten ausgeben
    	while (hilfsHandle->next != nullptr) {
    		hilfsHandle = hilfsHandle->next;
    	Console::WriteLine("{0}", hilfsHandle->daten);
    	}
    }
    
    int main(array<System::String ^> ^args)
    {
        //Handle auf den Anfang und das Ende der Liste setzen
    	listenelement ^listenanfang;
    	listenelement ^listenende;
    
    	//Das erste Element per Hand erzeugen und listenende den Wert von listenanfang zuweisen
    	listenanfang = gcnew listenelement;
    	listenende = listenanfang;
    
    	//Zeichenkette in das erste Element setzen; nullptr wird automatisch gesetzt
    	//dies kann nicht mehr funktionieren, da listenanfang nicht mehr übergeben wird
    	listenanfang->daten="Element 1";
    
    	//in einer Schleife mehrere Elemente einfügen
    	for (Int32 schleife = 1; schleife < 50; schleife++)
    		anhaengen("Element "+schleife, listenende);
    
    	//Liste ausgeben
    	ausgeben(listenanfang);
    
    	Console::Read();
        return 0;
    }
    


  • Wo ist das Problem ?

    Das hier gibt bei mir
    1
    2
    3
    4
    5
    aus:

    #include "stdafx.h"
    
    using namespace System;
    
    ref struct ListElem
    {
      String^ Data;
      ListElem^ Next;
    };
    
    ListElem^ Create(String^ data)
    {
      ListElem^ ret = gcnew ListElem;
      ret->Data = data;
    
      return ret;
    }
    
    int main(array<System::String ^> ^args)
    {
      ListElem^ start = nullptr;
      ListElem^ current = start;
    
      for(int i = 1; i <= 5; i++)
      {
        if ( current == nullptr )
        {
          start = current = Create(i.ToString());
        }
        else
        {
          current->Next = Create(i.ToString());
          current = current->Next;
        }
        current->Next = nullptr;
      }
    
      current = start;
    
      while( current != nullptr )
      {
        Console::WriteLine(current->Data);
        current = current->Next;
      }
    
      return 0;
    }
    


  • Oder umgeschrieben mit einer Einfügefunktion:

    using namespace System;
    
    ref struct ListElem
    {
      String^ Data;
      ListElem^ Next;
    };
    
    ListElem^ Create(String^ data)
    {
      ListElem^ ret = gcnew ListElem;
      ret->Data = data;
    
      return ret;
    }
    
    ListElem^ Append(ListElem^ list, String^ data)
    {
      if ( list == nullptr )
      {
        list = Create(data);
      }
      else
      {
        list->Next = Create(data);
        list = list->Next;
      }
      list->Next = nullptr;
    
      return list;
    }
    
    int main(array<System::String ^> ^args)
    {
      ListElem^ start = nullptr;
      ListElem^ current = start;
    
      for(int i = 1; i <= 5; i++)
      {
        current = Append(current, i.ToString());
    
        if ( start == nullptr )
        {
          start = current;
        }
      }
    
      current = start;
    
      while( current != nullptr )
      {
        Console::WriteLine(current->Data);
        current = current->Next;
      }
    
      return 0;
    }
    

Anmelden zum Antworten