Int-Array und Int-Variable an funktion übergeben
-
Hi Leute,
ich verzweifel hier gerade an diesem Problem. Ich lasse ein Array mit new generieren und möchte dieses dann an zwei andere Funktionen übergeben.
Hier meine Codeteile:
int GenerateArray () { int anzahl = 0; cout << "Wieviele Zahlen? "; cin >> anzahl; int* zahlen = new int[anzahl+1]; return zahlen; }void funktion1 (int zahlen) { int temp = 0; GenerateArray(); // Hier soll das Array und die vom user angegebene anzahl zur Verfügung stehen. }Würde mich über jede Hilfe oder Tipp sehr freuen!
Viele Grüße
-
Du musst den Zeiger, dem der Speicher zugewiesen werden soll, in funktion1 deklarieren und GenerateArray übergeben.
Hast du dir schon Gedanken gemacht, wie am Ende der Speicher wieder freigegeben werden soll?
-
Den Zeiger brauchst du hier nicht mal...
-
Übrigens müsste der Rückgabewert int* und nicht int sein, bei dem was du vorhast.
-
Mufasa schrieb:
Ich lasse ein Array mit new generieren und möchte dieses dann an zwei andere Funktionen übergeben.
Gegenfrage: Muss es wirklich ein Array sein? (z.B. weil in Schulaufgabe gefordert?)
Sonst würde ich auch auf Zeiger verzichten (Trennung von new/delete bzw. new[]/delete[] über mehrere Methoden ist unschön), und lieber auf die Standardbibliothek zurückgreifen (z.B. auf einen std::vector).
[Ganz davon abgesehen das ich Benutzereingaben immer von der Logik trenne - erlaubt eher die Wiederverwertung (Sprich: Die Anfrage der Anzahl würde ich von der Erstellung trennen)].
std::vector<int> GenerateVector() { int anzahl = 0; std::cout << "Wieviele Zahlen? "; std::cin >> anzahl; return std::vector(anzahl, 0); // Mit <anzahl> Elementen (initialisiert mit 0) } int main() { std::vector<int> zahlen = GenerateVector(); //... }
-
Danke für die Tipps!!! Das mit dem Übergeben funktioniert jetzt soweit. Hatte nicht daran gedacht, dass es Zeiger sind...
Also das mit std::vector kenne ich jetzt ehrlich gesagt gar nicht.... wäre das auch damit machbar die Aufgabe? Das es ein Array sein soll ist nicht vorgegeben, war nur für mich so am besten zu machen....
Wo Ihr auf jeden Fall Recht habt..... ich hab gar nicht an das delete gedacht.... hmmm.... soll ich das dann am Ende in der main machen? Auch wenn das unschön ist? Oder gibt es andere Möglichkeiten?
Außerdem noch ein Punkt... ach ich poste jetzt einfach mal das komplette, dann ist das einfacher zu erklären:
#include <iostream> #include <time.h> #include <windows.h> using namespace std; int* RandomNumbers (int anzahl) { /* Zufallszahlen generieren und ausgeben */ int* zahlen = new int[anzahl+1]; srand ( static_cast<unsigned int>(time(NULL)) ); cout << "Die Zufallszahle sind:\n"; //zahlen[0] = 0; // zahlen[0] = temp! zahlen[0] = anzahl; for (int i = 1; i < anzahl+1; i++) { zahlen[i] = (rand() % (anzahl * 3)) + 1; cout << "\t" << zahlen[i] << "\n"; Sleep(200); } return zahlen; } void BubbleSort (int* zahlen) { int temp = 0; /* int zahlenLength = ((int) (((double)sizeof(zahlen)) / ((double)sizeof(int)))); cout << zahlenLength << endl; for (int i = 1; i < zahlenLength; i++) { cout << zahlen[i] << endl; Sleep(500); } cout << endl << endl << endl; */ /* Zufallszahlen sortieren */ cout << "\nSortiert:\n"; /* for (int i = 1; i < sizeof(zahlen); i++) { for (int j = 1; j < sizeof(zahlen); j++) { if (zahlen[i] < zahlen[j]) { zahlen[0] = zahlen[i]; zahlen[i] = zahlen[j]; zahlen[j] = zahlen[0]; zahlen[0] = 0; } } } */ for (int i = 1; i <= zahlen[0]; i++) { for (int j = 1; j <= zahlen[0]; j++) { if (zahlen[i] < zahlen[j]) { temp = zahlen[i]; zahlen[i] = zahlen[j]; zahlen[j] = temp; temp = 0; } } } /* Zufallszahlen sortiert ausgeben */ for (int i = 1; i <= zahlen[0]; i++) { cout << zahlen[i] << endl; Sleep(500); } /* for (int i = sizeof(zahlen+1); i > 0; i--) { cout << "\t" << zahlen[i] << "\n"; Sleep(500); } */ } void SelectionSort (int* zahlen) { } int main () { int anzahl = 0; cout << "Wieviele Zahlen moechten Sie generieren und sortieren? "; cin >> anzahl; int* zahlen = RandomNumbers(anzahl); BubbleSort(zahlen); // BubbleSort ausführen //SelectionSort(zahlen) // SelectionSort ausführen return 0; }Also an sich funktioniert es jetzt. Wie Ihr aber an den Kommentaren seht ist das jetzt anders gelöst als ich es eigentlich vor hatte.... ich wollte eigentlich bei der Sortierung das erste Element des arrays (Index 0) als temp-Speicher benutzen und die array-Länge als Abbruchbedingung für die for-Schleifen benutzen. Weil das aber jetzt ein dyn. Array ist, ist es schwieriger.... deswegen hab ich eine extra temp-Variable. Was ich aber nicht wollte weil ich die dann in beiden Sortierfunktionen deklarieren müsste... und irgendwie benutze ich lieber so wenig Variablen wie möglich.
Irgendein Vorschlag hierzu?
-
Mufasa schrieb:
Also das mit std::vector kenne ich jetzt ehrlich gesagt gar nicht... wäre das auch damit machbar die Aufgabe?
Ob es für die Aufgabe machbar ist kommt darauf an, wer die Aufgabe gestellt hat. Lehrer sind häufig lernresistent (Zumindest scheinen sie ihr Wissen nicht zu aktualisieren), und std::vector ist "erst" seit 1998 Teil des C++ Standards (Noch genauer: Teil der C++ Standard Bibliothek die zum C++ Standard gehört).
Mufasa schrieb:
ich hab gar nicht an das delete gedacht... hmmm... soll ich das dann am Ende in der main machen? Auch wenn das unschön ist? Oder gibt es andere Möglichkeiten?
Wo du es machst ist fast egal (Wobei es am sinnvollsten ist, Reservieren und Freigaben an einem Ort zu machen), bei Zeigern bist du nun einmal selbst verantwortlich. Bessere Alternativen sind std::vector, Smartpointer (std::tr1::shared_ptr und Co, Teil vom TR1, einem Nachtrag zum C++ Standard von 2003) oder andere Mechanismen die sich um die Speicherverwaltung kümmern.
Davon abgesehen würde ich (wenn es nicht Teil der Aufgabe ist), auch die Sortierung über vorhandene Funktionen erledigen ;p (std::sort oder ähnliches).
Mufasa schrieb:
Weil das aber jetzt ein dyn. Array ist, ist es schwieriger.... deswegen hab ich eine extra temp-Variable...
Ich bin mal wieder böse (und lasse es einfach mal unkommentiert, da es wohl an der Aufgabenstellung vorbei gehen würde - kannst es ja mal ausprobieren [Keine Garantie, da ungetestet]):
#include <algorithm> #include <iostream> #include <vector> int main() { std::vector<int> zahlen; zahlen.push_back(4); zahlen.push_back(1); zahlen.push_back(8); zahlen.push_back(5); std::copy(zahlen.begin(), zahlen.end(), std::ostream_iterator<int>(std::cout, "\n")); std::sort(zahlen.begin(), zahlen.end()); std::copy(zahlen.begin(), zahlen.end(), std::ostream_iterator<int>(std::cout, "\n")); }