Forum: PC-Programmierung Werte eines Arrays an Funktion übergeben in C++


von Dussel (Gast)


Lesenswert?

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
Objekt Objekt1({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,…)?

von Peter II (Gast)


Lesenswert?

warum nicht VARGS arbeiten?

Objekt::Objekt(int i, ... );

dann kannst du Objekt Objekt1(0,0,1);

schreiben.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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
1
Objekt::Objekt(int x, int y, int z );
...

von Dussel (Gast)


Lesenswert?

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
1
void Funktion(unsigned short int,unsigned short int,unsigned short int,unsigned short int,unsigned short int,unsigned short int);
sieht nicht so toll aus. Und das sind nur sechs Werte.

von CPP (Gast)


Lesenswert?

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.

von Dussel (Gast)


Lesenswert?

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?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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...

von Rainbow_Dash (Gast)


Lesenswert?


von CPP (Gast)


Lesenswert?

@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.

von Dussel (Gast)


Lesenswert?

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.

von CPP (Gast)


Lesenswert?

Weniger C++ like als C like.
1
#include <iostream>
2
3
void foo( int *, size_t );
4
5
int main()
6
{
7
  int val1[] = { 1, 2, 3, 4, 5, 6 }; 
8
  
9
  foo( val1, (sizeof(val1) / sizeof(int)) - 1 );
10
  
11
  return 0;
12
}
13
14
void foo( int *p, size_t size )
15
{
16
  int x = p[0];
17
  int y = p[2];
18
  int z = p[size];
19
  
20
  std::cout << "Arraysize = " << size 
21
        << ", x = " << x
22
            << ", y = " << y
23
            << ", z = " << z
24
            << std::endl;
25
}

von Dr. Sommer (Gast)


Lesenswert?

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
void foo (std::array<int, 3> arr) {
5
  // Modern
6
  for (auto x : arr) {
7
    std::cout << x << ", ";
8
  }
9
  // Klassisch
10
  for (std::size_t i = 0; i < arr.size (); i++) {
11
    std::cout << arr[i] << ", ";
12
  }
13
  std::cout << std::endl;
14
}
15
16
int main () {
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.

von Dussel (Gast)


Lesenswert?

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.

von Rainbow_Dash (Gast)


Lesenswert?

Meinen Beitrag hast du offenbar übersehen? Da stand das nämlich auch 
schon drin...

von Dr. Sommer (Gast)


Lesenswert?

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...

von Dussel (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.