array-Werte in externer Funktion setzen
-
Hi,
oh Mann. Ich glaube ich sitze heute schon zu lange vor dem Rechner und sehe den Wald vor lauter Bäumen nicht mehr.
Ich habe mir ein Array gebautdouble Array[10][5];Nun steht dieser in einer Hauptfunktion, z.B. main().
Dann versuche ich diesen mit Werten in einer separaten Funktion mit Inhalten aus einer txt-Datei zu setzen, also etwa so:
int main () { double Array[10][5]; //[...] set_array(inputfile, Array); //[...] } void set_array(istream& str, double cont[10][5]) { //[...] while (!str.eof()) { string data = ""; str >> data; cont[row][col] = atof(data.c_str()); row++; //[...] } }Mein Problem ist jetzt, dass in der lokalen Funktion set_array nur ein 5*1 großes array enthalten ist.

Wie muss die korrekte Übergabe des ganzen Arrays aussehen, damit alle Werte in set_array gesetzt werden können?P.S. Ja ich möchte mit einem array arbeiten, nicht mit Vektoren

-
6H05T schrieb:
P.S. Ja ich möchte mit einem array arbeiten, nicht mit Vektoren

void set_array(istream& str, double (&cont)[10][5]){ /* ... */ }Soll ich auch noch für Dich durchladen?

SCNR...
-
Tja wie gesagt, der Wald vor lauter Bäumen ...
Danke
Ich mache jetzt lieber mal eine Pause ...
-
Da ich die Bäume momentan nicht sehe, würde mich mal interessieren, wo das Problem war, das Furble Wurble anscheinend gelöst hat und wo der Unterschied der beiden Parameterdeklarationen liegt.
-
wxSkip schrieb:
Da ich die Bäume momentan nicht sehe, würde mich mal interessieren, wo das Problem war, das Furble Wurble anscheinend gelöst hat und wo der Unterschied der beiden Parameterdeklarationen liegt.
Ein Roman:
Das Problem ist, dass ein Array als Parameter (by value) übergeben gleichermaßen "zerfällt" (eng. to decay) zu einem Pointer auf das erste Element im array.
Einmal in der Woche kommt jemand vorbei und meint den ganzen Schnickschnack mit "geilen STL-Containern"(tm) nicht zu brauchen und rauscht genau da rein: durch das übergebene Array lässt sich nicht iterieren, weil keine Größe da ist.
Das gibt immer lange Gesichter. Manche weinen auch.
C übergibt deswegen arrays mit zwei Parametern(Zeiger auf den Anfang und Größe), C++ als Iteratoren auf Anfang und Ende.Eine Alternative ist das Array per Referenz zu übergeben, dann kommt es zu keinem "Zerfall" und alles ist gut, jedenfalls alles, bis auf den resultierenden Source... So muss der Kollege 6HO5T z.B. jedesmal die Signatur von
set_arrayändern, wenn er die Dimensionen des Arrays ändert...:(Ein Ausweg sind templates. Z.B. beschreibt C++11 folgende Templates in <iterator>
template <class T, size_t N> T* begin(T (&array)[N]); template <class T, size_t N> T* end(T (&array)[N]);(die jeder sich auch selbst schreiben kann, C++11 hin oder her!)("Left as an exercise to the reader")
Hier mal der Unterschied im Typ vom Parameter
arr. Im gcc jedenfalls ist das sehr auffällig:#include <iostream> #include <typeinfo> void array_by_value(int arr[42]){ std::cout << typeid(arr).name() << '\n'; } void array_by_reference(int (&arr)[42]){ std::cout << typeid(arr).name() << '\n'; } int main(){ int arr[42] = { 0 }; array_by_value(arr); array_by_reference(arr); }Lecker Bierchen trinkend,
FW
-
Furble Wurble schrieb:
Ein Ausweg sind templates.
Bevor ich Mißverstanden werde: ich empfehle ausdrücklichst, die Übergabe von Iteratoren [first, last)!
-
@Furble Wurble: Das heißt also, er wollte die Arraygröße per sizeof() bestimmen und bekam natürlich das falsche Resultat?
-
Furble Wurble schrieb:
Bevor ich Mißverstanden werde: ich empfehle ausdrücklichst, die Übergabe von Iteratoren [first, last)!
Prinzipiell auch meine Empfehlung. In den angegebenem Code würde ich aber sogar die Verwendung der vector-Klasse vorziehen.
Furble Wurble schrieb:
Eine Alternative ist das Array per Referenz zu übergeben, dann kommt es zu keinem "Zerfall" und alles ist gut, jedenfalls alles, bis auf den resultierenden Source... So muss der Kollege 6HO5T z.B. jedesmal die Signatur von
set_arrayändern, wenn er die Dimensionen des Arrays ändert...:(Allerdings entsprechen die angegebenen Zeilen nur ganz entfernt meinem Programm und dabei eignet sich die Verwendung von arrays mit in der Eingabe gesetzten Größen als durchaus sinnvoll

-
6H05T schrieb:
Allerdings entsprechen die angegebenen Zeilen nur ganz entfernt meinem Programm
Was bedeutet, dass du uns zu deiner Problemschilderung Code geliefert hast, der nur ganz entfernt mit dem Problem zu tun hat. Weshalb du Lösungsvorschläge bekommst, die nur ganz entfernt mit der richtigen Lösung deines Problems zu tun haben können. Bewusste Irreführung wie du sie betreibst ist noch schlimmer als garkeinen Code zu liefern.
und dabei eignet sich die Verwendung von arrays mit in der Eingabe gesetzten Größen als durchaus sinnvoll

Das ist eine Behauptung, die dir niemand widerlegen kann (weil du uns den Code nicht gezeigt hast), die aber jeder bezweifeln kann, der ein wenig mehr Erfahrung mit solchen Dingen hat (weil die C-Arrays nur sehr sehr selten die bessere Alternative sind, wenn überhaupt).
Zusammengefasst: es lohnt nicht, hier noch groß zu diskutieren, weils alles nur Spekulation ist, solang du uns nicht den echten Code zeigst.
-
pumuckl schrieb:
6H05T schrieb:
Allerdings entsprechen die angegebenen Zeilen nur ganz entfernt meinem Programm
Was bedeutet, dass du uns zu deiner Problemschilderung Code geliefert hast, der nur ganz entfernt mit dem Problem zu tun hat. Weshalb du Lösungsvorschläge bekommst, die nur ganz entfernt mit der richtigen Lösung deines Problems zu tun haben können. Bewusste Irreführung wie du sie betreibst ist noch schlimmer als garkeinen Code zu liefern.
und dabei eignet sich die Verwendung von arrays mit in der Eingabe gesetzten Größen als durchaus sinnvoll

Das ist eine Behauptung, die dir niemand widerlegen kann (weil du uns den Code nicht gezeigt hast), die aber jeder bezweifeln kann, der ein wenig mehr Erfahrung mit solchen Dingen hat (weil die C-Arrays nur sehr sehr selten die bessere Alternative sind, wenn überhaupt).
Zusammengefasst: es lohnt nicht, hier noch groß zu diskutieren, weils alles nur Spekulation ist, solang du uns nicht den echten Code zeigst.
Keine Angst, ein bisschen etwas verstehe ich auch von Programmierung...
Mir ging es im Grunde nur darum, dass jemand diesen kleinen Fehler der nicht vorhandenen Klammern sieht. Ansonsten werde ich, auch wenn es vielleicht (durch welchen fortgeschrittenen Programmierer auch immer) 'besseren' Code gibt, diesen nicht ändern.
Damit ist mein Problem exakt gelöst
und es erübrigt sich wirklich jede weitere Diskussion ...Aber ich verstehe trotzdem was du meinst
