Ein Array aus einer Funktion zurückgeben!
-
Hallo,
ich möchte aus einer Funktion mein Feld zurückgeben. Ich hab das folgendermaße gemacht:
int Lotto::getZahlen(void)
{
//Zufallszahlen generieren
time_t T_Time; //Systemzeit generieren! Ist zu jeden neuen Instanz anders
int Zufall_Feld_Zahlen[6];
int Zufalls_Zahl; //srand(time(&T_Time));
for(int i=0; i<6; i++)
{
Zufalls_Zahl=0;
Zufalls_Zahl=(rand()%49)+1; //Zufallszahl von 1-49 generieren
Zufall_Feld_Zahlen[i]=Zufalls_Zahl;
}return Zufall_Feld_Zahlen[];
}ich möchte Zufallszahlen in dem Feld generieren und dann mit return an dieser FKT zurückschicken!
void __fastcall TPRLotto::Button2Click(TObject *Sender)
{
int Rueck_Feld_Zahlen[6];Rueck_Feld_Zahlen[6]=L1->getZahlen(); //Feld_Zahlen wird Set Zahlen übergeben damit
// das Feld in der Klasse gespeichert
for(int i=0; i<6; i++)
{
Ausgabe1->Items->Add(IntToStr(Rueck_Feld_Zahlen[i]));
}//Eröffnet die Lottoziehung mit Button1

Button1->Enabled=true;
Button2->Enabled=false;
}...
Ich bekomme aber komische Zahlen ausgeben. Kann evt einer mir helfen?
Ich bin inmoment viel mit Java beschäftigt und habe denn gespür für C++ verloren.
Ich müsste ein Kopie zurückgeben und dann in ein neues Feld der ausgangsfunktion zu speichern oder?
-
std::vector oder std::list
-
so einfach geht das nicht,
1. hab ich den code jetzt nicht angeschaut ( weil keine CODETAGS! )
2. array zurückgeben geht nicht
Du musst das Array als Parameter ( als Referenz ) übergeben.
-
Erstens: time() kann auch mit einem NULL-Zeiger aufgerufen werden
Und srand() solltest du nur einmal am Anfang deines Programmes aufrufen.
Zweitens: Wenn du einer Variable einen konkreten Wert zuweisen willst, kannst du die Initialisierung mit "=0" weglassen
Drittens: Deine Funktion wurde so deklariert, daß sie einen einzelnen interger zurückgeben soll. Arrays kann man nur als Pointer oder in einen Struct (z.B. STL-Container) verpackt übergeben:
//Variante 1: Pointer auf static int* getZahlen() { static int Zahlen[6]; //fülle das Array mit Zufallszahlen return Zahlen; } //Aufruf int meineZahlen[6]; int*ZahlPtr=getZahlen(); for(int i=0;i<6;++i) meineZahlen[i]=ZahlPtr[i]; //Variante 2: Container (in dem einfachen Beispiel vermutlich unnötiger Overhead): vector<int> getZahlen() { vector<int> Zahlen(6); //fülle den Vektor mit Zufallzahlen return Zahlen; } //Aufruf vector<int> meineZahlen=getZahlen();
-
tipp schrieb:
std::vector oder std::list
das sowieso, dass er vector nehmen soll, aber er ist ja am anfang beim lernen, da soll er ruhig die nachteile von arrays erstmal kennenlernen

-
Danke für die schnelle antwort...
mit Container kenn ich mich noch nicht aus. Aber jetzt hab ich das mit den Zeiger verstanden. Ist aber kompliziert. Bei java gibt es ja keine Zeiger

Naja gibt hier und da wieder vorteile. Ich selber mag lieber mehr C++.
Kann mir jemand mal das mit dem"Static" erleutern?Und wie binde ich das mit dem code tag hier ein? [code]? [cpp]?
-
JuanPabloIssa schrieb:
Danke für die schnelle antwort...
mit Container kenn ich mich noch nicht aus. Aber jetzt hab ich das mit den Zeiger verstanden. Ist aber kompliziert. Bei java gibt es ja keine Zeiger

Du bist hier auch nicht bei Java - bei C(++) verwendet man Pointer

Kann mir jemand mal das mit dem"Static" erleutern?
Klar, "static" bedeutet, daß die Variable nach Ende der Funktion erhlaten bleibt (damit kannst du den zurückgegebenen Pointer noch weiterverwenden) - allerdings überschreibt die Funktion beim nächsten Aufruf das Array wieder, also solltest du die Werte vorher woanders sichern (in meinem Beispiel passiert das in der for()-Schleife).
Und wie binde ich das mit dem code tag hier ein? [code]? [ cpp]?
Ich nehme normalerweise cpp-Tags, da werden die Quelltexte auch farbig dargestellt.
PS: zwei Varianten gibt es noch:
//Variante 3: Pointer auf Heap int* getZahlen() { int* Zahlen=new int[6]; //fülle das Array mit Zufallszahlen return Zahlen; } //Aufruf int* meineZahlen=getZahlen(); //Arbeiten mit meineZahlen delete[]meineZahlen; //Variante 4: Übergabe als Parameter void getZahlen(int Zahlen[6]) { //fülle das übergebene Array } //Aufruf int meineZahlen[6]; getZahlen(meineZahlen);
-
Kannst du bitte für vector mal zeigen wie man dann auf die einzelnen Elemente zugreift? Also dessen "Index"?
-
Genauso wie bei einem Array (vector<> hat dafür extra den []-Operator überladen):
//Fortsetzung von Aufruf Variante 2: vector<int> meineZahlen=getZahlen(); for(int i=0;i<6;++i) cout<<i+1<<". Zahl ist "<<meineZahlen[i]<<".\n"
-
was passiert beim vector wenn man ausserhalb des indexes zugreift?
normales array macht ja oft unverersehbare sachen, von garnichts bis hin sogar eines system reboots
-
Das ist genauso unvorhergesehen
(aber du hast beim Vektor noch die Metohde at() - die macht in dem Fall etwas kontrolliertes und wirft eine out_of_range Exception)
-
das selbe...
-
hallo...nochmal muss ich euch nerven. Aber ich krieg das nicht hin. Ich möchte die Länge des Arrays ermitteln.
In java gab es die Methode objekt.lengh in C++ sizeof oder bei char einfach auf /0 abfragen. Aber wie mach ich das auf array von INT s?
danke
-
Gar nicht - das mußt du dir beim Anlegen des Arrays gesondert merken (oder du bleibst beim vector, der kennt seine Größe und kann sie mit size() auch verraten).