Moin,
ist es in C++ möglich, einer Funktion, die einer Array als
Übergabeparameter hat, bei Aufruf die Werte direkt zu übergeben?
Zum Beispiel soll die Position eines Objekts im Raum im Konstruktor
festgelegt werden. Der Konstruktor sieht dann so aus
1
Objekt::Objekt(int[3]);
Gibt es die Möglichkeit, den Konstruktor jetzt in der Art aufzurufen
1
ObjektObjekt1({0,0,1});
um die Werte ohne explizite Erzeugung eines neuen Arrays zu übergeben?
Klammern mit runden, eckigen und geschweiften habe ich probiert, das
Casten auf einen Zeiger und das Casten auf ein Array. Geht alles nicht.
Gibt Compilerfehler oder Zugriffsfehler.
Gibt es andere Datentypen mit denen das geht (vector, list,…)?
Dussel schrieb:> Zum Beispiel soll die Position eines Objekts im Raum> im Konstruktor festgelegt werden
Und wieso gibt es dann ein Array? Erstelle dir einen Typ "Position",
verpass ihm einen Konstruktor mit drei ints und dann kannst du z.B.
einfach sowas schreiben:
1
Position(0,0,1)
und brauchst nicht mit Arrays rumhünern.
Peter II schrieb:> warum nicht VARGS arbeiten?
Warum nicht gleich
Läubi .. schrieb:> Und wieso gibt es dann ein Array? Erstelle dir einen Typ "Position",> verpass ihm einen Konstruktor mit drei ints und dann kannst du z.B.> einfach sowas schreiben:Position(0,0,1)und brauchst nicht mit Arrays> rumhünern.
Das mit dem Typ ist eine gute Idee. In dem Beispiel kann man das so
machen.
Aber was ist, wenn es mehr Werte werden? Gibt es da eine Möglichkeit,
das so zu machen, wie gefragt? Ein
In C++ solltest Du davon absehen, das C-Array als Übergabeparameter zu
benutzen. Wenn du dich daran hältst nur einfach Datentype und Objekte
als Übergabeparameter zu verwenden, dann kommst du erst gar nicht dazu
über solche Probleme nachzudenken.
Als C-Array Ersatz bringt C++ schon einige Container mit. Such dir einen
Passenden heraus und verwende diesen.
http://en.cppreference.com/w/cpp/container
In jedem guten C++ Buch wird auf die Nutzung dieser Container
eingegangen. Sich ein bisschen mit OOD zu beschäftigen ist bestimmt auch
nicht verkehrt.
Ausser evtl. in den dunklen Tiefen einer Klasse, gibt es keinen Grund
ein C-Array in C++ zu verwenden.
CPP schrieb:> Als C-Array Ersatz bringt C++ schon einige Container mit. Such dir einen> Passenden heraus und verwende diesen.
Gut, das beantwortet
> Gibt es andere Datentypen mit denen das geht (vector, list,…)?
zum Teil. Die Frage war aber nicht, wie man am Besten mehrere Wert
übergibt, sondern ob es möglich ist, beim Funktionsaufruf mehrere Werte
an ein 'Objekt' (Array, List, Vektor,…) zu übergeben. Geht das mit den
genannten Typen?
Dussel schrieb:> sieht nicht so toll aus
Hä? C++ ist doch kein Schönheitwettbewerb...
Auch hier gilt: Zusammengehöriges in Objekten kapseln. Warum das mit
einem Array (was ja eh immer nur einen Typ haben kann) "schöner"
aussehen soll verschließt sich mir vollständig.
Dussel schrieb:> sondern ob es möglich ist, beim Funktionsaufruf mehrere Werte an ein> 'Objekt' (Array, List, Vektor,…) zu übergeben
Du hast doch jetzt wenigstens drei Möglichkeiten genannt bekommen...
@Dussel
Da Du ja ja nicht von deinem Weg abweichen möchtest, wäre zur Körnung
des schlechten Programmierstils noch zu nennen:
"Die Folge von drei Punkten innerhalb runder Klammern wird Ellipse
genannt, was so viel wie Auslassung bedeutet. Nichtangabe eine Datentyps
durch … bedeutet >>beliebige Anzahl beliebiger Datentypen<<"
Allerdings für catch(…) kann es nützlich sein.
Läubi .. schrieb:> Hä? C++ ist doch kein Schönheitwettbewerb...> Auch hier gilt: Zusammengehöriges in Objekten kapseln. Warum das mit> einem Array (was ja eh immer nur einen Typ haben kann) "schöner"> aussehen soll verschließt sich mir vollständig.
Mit Schönheit meinte ich nicht Aussehen, sondern Übersichtlichkeit. In
dem Beispiel waren es sechs Parameter. Was ist, wenn ich zum Beispiel
Filterkoeffizienten übergeben will? Bei nur jeweils zehn Koeffizienten
(an und bn), wären das fünf Zeilen Parameterliste.
Peter II schrieb:> warum nicht VARGS arbeiten?>> Objekt::Objekt(int i, ... );>> dann kannst du Objekt Objekt1(0,0,1);>> schreiben.CPP schrieb:> "Die Folge von drei Punkten innerhalb runder Klammern wird Ellipse> genannt, was so viel wie Auslassung bedeutet. Nichtangabe eine Datentyps> durch … bedeutet >>beliebige Anzahl beliebiger Datentypen<<"
Das geht ja wirklich. Das wusste ich noch nicht. Ich dachte, das sei nur
im Beitrag eine Abkürzung gewesen. Du sagst aber ja, dass das schlechter
Stil ist.
Läubi .. schrieb:> Und wieso gibt es dann ein Array? Erstelle dir einen Typ "Position",> verpass ihm einen Konstruktor mit drei ints und dann kannst du z.B.> einfach sowas schreiben:
Dann habe ich das Problem nur in einen anderen Konstruktor verlagert. In
dem muss ich dann aber auch mit einzelnen Variablen arbeiten.
Danke für die Hilfe bisher. Ich muss zugeben, dass ich anscheinend auf
dem Schlauch stehe, wie man so sagt, aber kann mir vielleicht bitte
jemand eine Beispielfunktion schreiben.
Die Werte sollen im Funktionsaufruf als Zahlen (nicht als Variablen)
stehen und in der Funktion variabel adressierbar sein, über einen Index,
Iterator,…
Vielleicht habe ich auch zu viel mit Matlab gearbeitet. Da geht das
ziemlich einfach.
Bevor jetzt ein Verdacht aufkommt: Das ist keine Hausaufgabe. Ich wollte
gestern was programmieren und da ist mir aufgefallen, dass ich das (wie
man sieht) nicht hinkriege.
C++ hat von C leider das Array to Pointer decaying geerbt, d.h. man kann
keine Arrays übergeben, sondern nur Pointer. Seit C++11 gibt es aber den
kopierbaren std::array Wrapper:
1
#include<array>
2
#include<iostream>
3
4
voidfoo(std::array<int,3>arr){
5
// Modern
6
for(autox:arr){
7
std::cout<<x<<", ";
8
}
9
// Klassisch
10
for(std::size_ti=0;i<arr.size();i++){
11
std::cout<<arr[i]<<", ";
12
}
13
std::cout<<std::endl;
14
}
15
16
intmain(){
17
foo({1,2,3});
18
}
Die Länge muss natürlich fix sein, wenn sie dynamisch sein soll nimmt
man zB. einen std::vector. Achtung: Die direkte Übergabe eines
std::array impliziert eine vollständige Kopie; daher nur für kleine
Arrays verwenden. Das std::array ist übrigens exakt so effizient wie ein
C-Array, kann aber eben kopiert werden.
CPP schrieb:> int val1[] = { 1, 2, 3, 4, 5, 6 };
Genau das will ich vermeiden. Darum geht es ja.
Dr. Sommer schrieb:> std::array<int, 3> arr> foo ({1, 2, 3});
Sowas habe ich gesucht. Vielen Dank.
Natürlich auch Dank an die anderen, die geantwortet haben.
Rainbow_Dash schrieb:> Meinen Beitrag hast du offenbar übersehen? Da stand das nämlich auch> schon drin...
Nur initializer_lists, aber kein std::array. Okay technisch gesehen wird
die initializer_list bei der std::array Übergabe implizit verwendet...
Rainbow_Dash schrieb:> Meinen Beitrag hast du offenbar übersehen? Da stand das nämlich auch> schon drin...
Ja stimmt, entschuldigung. Ich habe mir das durchgelesen und das dann
bei der Antwort auf die anderen Beiträge vergessen.