STL-Container an Funktion uebergeben
-
Ich habe ein STL-Set, dass auf eine bestimmte Eigenschaft hin ueberprueft werden soll. Ich wuerde daher gerne das set an eine Funktion uebergeben(mit ein paar weiteren Parametern), so dass mir die Funktion dann einen bool zurueckgibt. Hinweis: das set soll in der Funktion veraendert werden. Die Elemente des sets sind uebrigens unsigned long's.
Ich habe zu Beginn das set als CBV uebergeben, Resultat: das in der main-Funktion gefuellte set ist in der Funktion leer.
Wie stelle ich jetzt sicher, dass ich in der Funktion das gefuellte set habe? Fehlt mir etwa der Kopierkontruktor?! Als Referenz moechte ich das set nicht uebergeben, da es ggf. in der Funktion veraendert wird.
-
Eigentlich müßte call by value funktionieren...
kannst Du den fraglichen Code (oder ein gekürztes Beispiel) posten?
-
so sollte es gehen:
bool foo_func(std::set<unsigned long>& set_obj, ...) { // bearbeiten des objekts return set_obj.empty(); } int main() { std::set<unsigned long> container; if(foo_func(container,...) ) std::cout << "True" << std::endl; else std::cout << "False" << std::endl; return 0; }
-
Brausepaul schrieb:
Als Referenz moechte ich das set nicht uebergeben, da es ggf. in der Funktion veraendert wird.
-
Jester schrieb:
Brausepaul schrieb:
Als Referenz moechte ich das set nicht uebergeben, da es ggf. in der Funktion veraendert wird.
Oh, hab ich überlesen.
-
[b]Aufrufende Funktion:[/b] set<ElementIndex> neighbourList; set<ElementIndex>::iterator iter = neighbourList.begin(); ... // set wird mittels for-Schleife gefuellt, Testausgabe gibt Inhalt korrekt wieder bool isOnEdge = nodesAreEdge(firstNode, secondNode, *iter, neighbourList); ...
[b]bool nodesAreEdge(NodeIndex nodeOne, NodeIndex nodeTwo, ElementIndex elementCandidate, set<ElementIndex> neighbourList)[/b] neighbourList.erase(elementCandidate); set<ElementIndex>::iterator pointer = neighbourList.begin(); int size = neighbourList.size(); cout << size << endl; // hier lautet die Ausgabe "null" ...
Anmerkung:
es gilt
typedef unsigned long ElementIndex
typedef unsigned long NodeIndexReicht das an Quelltext? Ich bin selbst ganz verdattert, das CBV nicht geht, wie ich es erwartet haette.
-
Hast Du mal ein Minimalbeispiel gebaut?
also ein set anlegen, ein paar ints rein, die dann übergeben in die Funktion und dort Ausgabe machen? Funktioniert das? Wenn nicht, dann poste doch mal den Code dazu.
-
Ich hab jetzt zu Hause mal ein Mini-Beispiel gebaut, mit DevC++ 4.9.9.0:
#include <iostream> #include <set> using namespace std; bool testFunktion(set<unsigned long> testSet); int main(int argc, char* argv[]) { set<unsigned long> originalSet; set<unsigned long>::iterator iter; originalSet.insert(6); originalSet.insert(13); originalSet.insert(45); originalSet.insert(2); iter = originalSet.begin(); cout << "Inhalt des Original-Sets:" << endl; while(iter != originalSet.end()) { cout << *iter << endl; iter++; } bool dummy = testFunktion(originalSet); system("PAUSE"); return 0; } bool testFunktion(set<unsigned long> testSet) { set<unsigned long>::iterator iter = testSet.begin(); int setSize = testSet.size(); cout << "Groesse des Sets: " << setSize << endl; while(iter != testSet.end()) { cout << *iter << endl; iter++; } return true; }
Ergebnis: es geht, wie ich es erwartet hätte, d. h. in der (test-)Funktion funktioniert die Ausgabe einwandfrei, sie stimmt mit der Ausgabe aus der main-Funktion überein. Gegenprobe mit meiner VS 6-Installation lief auch erfolgreich. Ich muss mir das morgen bei der Arbeit nochmal anschauen, irgendwo MUSS ja etwas im argen liegen. Für Denkanstöße bin ich nach wie vor dankbar.
-
Hm, das hatte ich vermutet... dann liegt der Fehler woanders.
Wünsch Dir viel Erfolg beim Eingrenzen.
-
Als Referenz moechte ich das set nicht uebergeben, da es ggf. in der Funktion veraendert wird.
Das verstehe ich ned ganz ....
Du meinst due willst das Set uebergeben, deine Funktion wird/darf/soll das Set veraendern, aber die Aenderung soll nicht auf die aufrufende funktion reflektiert werden (fuer die Aufrufende funktion soll das set constant bleiben)? richtig ?ok, noch paar anmerkungen, sind aber eher rein geschmacklicher natur
std::set<Mytyp> myset;
sieht zwar cool aus, beim schreiben bricht man sich die finger
fuer den simplen unsigned long machts ja auch nen typedef ....besser
typedef unsigned long Mytyp;
typedef std::set<Mytyp> MySetT;
das an zentraler stelle ...MySetT myset;
Deine funktion soll das set nicht veraendern ....
also zeig es auch dem nutzer an ... CBV bei komplexen strukturen erschrecken immer die performance bewussten programmierer, auch wenns berechtig ist ...mach lieber
void myfunc(const MySetT & rxSet)
{
MySetT tempset(rxSet);
}macht zwar (fast)das selbe, aber sieht eleganter aus ... (und laesst fuer den, der die Impl ned kennt, keinen grund zur Diskussion, ob eine kopie fuer den zweck deiner funktion performant ist oder nicht
)
deine iteration sieht etwas, naja ungewoehnlich aus:p
ich nehm immer
for(MySetT::iterator it = myset.begin(); it != myset.end(); ++it)
{
}
liest sich irgendwie besser ...Zum eigentlichen problem:
Dein befuellen des sets geschieht in ner extra funktion ? oder direkt in der aufrufenden funktion, da wo dein CBV ned klappt ?
Hast dir mal das count direkt vor dem funktionsuafruf, und glauch als erstes mal in der funktion selber angeschaut ... irgendwas kann da ned stimmen ....ich vermute dass dein set schon beim funktionsaufruf leer ist ... oder du hasst nen Bug in deiner STL-Impl gefunden
DU abreitest ned zufaellig mit MSVC++ und multithreading ?Ciao ...
-
RHBaum schrieb:
Das verstehe ich ned ganz ....
Du meinst due willst das Set uebergeben, deine Funktion wird/darf/soll das Set veraendern, aber die Aenderung soll nicht auf die aufrufende funktion reflektiert werden (fuer die Aufrufende funktion soll das set constant bleiben)? richtig ?Richtig
deine iteration sieht etwas, naja ungewoehnlich aus:p
ich nehm immer
for(MySetT::iterator it = myset.begin(); it != myset.end(); ++it)
{
}
liest sich irgendwie besser ...Stimmt
Zum eigentlichen problem:
Dein befuellen des sets geschieht in ner extra funktion ? oder direkt in der aufrufenden funktion, da wo dein CBV ned klappt ?
Hast dir mal das count direkt vor dem funktionsuafruf, und glauch als erstes mal in der funktion selber angeschaut ... irgendwas kann da ned stimmen ....ich vermute dass dein set schon beim funktionsaufruf leer ist ... oder du hasst nen Bug in deiner STL-Impl gefunden
DU abreitest ned zufaellig mit MSVC++ und multithreading ?
[/quote]Oeh, doch...was hab ich verpasst?