C++/C: Felder by value übergeben

A

Alex

.
Moin!

Folgendes C/C++ Problemchen:

Ich möchte ein double-Feld an eine Funktion übergeben - als Kopie bzw "by value". Mit

double* funktion(double* dFeld)

übergebe ich ja per Referenz - alles, was ich in der Funktion mit dem Feld anstelle, verändert das Feld. Gibt es irgendeine Möglichkeit, eine Kopie eines Feldes zu übergeben, ohne das Feld und dessen Größe in eine Struktur zu packen?

Ich dachte, ich frage das mal hier...

Danke für Eure Antworten!
 
Natürlich kannst Du in der Funktion mit einer Kopie eines Feldes arbeiten. Du musst die Kopie jedoch selbst erzeugen. Also den Zeiger aufs erste Element übergeben und nach dem Funktionsaufruf erstmal ein weiteres Feld initalisieren und alle Elemente kopieren (dafür am Besten eine eigene Funktion schreiben bzw. einbinden, ist übersichtlicher und spart Arbeit ;-)). Die Daten müssen logischerweise hinterher auch noch äquivalent wohin geeschrieben werden, wenn sie im weiteren Programmablauf noch genutzt werden sollen...

Ein Vorteil von C gegenüber anderen Hochsprachen ist halt, daß einem wenig vorgeschrieben wird, wie man etwas zu machen hat und ein Nachteil ist zwangsläufig, daß man sich selbst um alles mögliche kümmern muß.
 
Irgendwo wirste doch das Feld initalisieren, was übergeben werden soll. Die Feldgrößen werden dann bei der Initalisierung über Platzhalter festgelegt, die Du vorher per #define vergibst. Wenn Du es vernünftig programmierst braucht es genau soviel Rechenzeit als wäre es standartmässig bei C eingebaut und wenn Du das Kopieren in einer weiteren Funktion erledigst wird es auch nicht übermässig unübersichtlich. Ich versteh grad nicht wo das Problem ist :?:
 
Alisa 1387 schrieb:
Irgendwo wirste doch das Feld initalisieren, was übergeben werden soll.

Hm, ja.

Da geht's um ein Programm, das Numerik treibt. Da brauche ich zum Beispiel Funktionen, die mir Vektoren um mathematischen Sinn addieren.

Zum Beispiel macht diese Funktion hier
Code:
double *vecSum(double* vec1, double* vec2, int iDim)
{
	for(int i=0; i<iDim; i++)
		vec1[i] += vec2[i];
	return vec1;
}

vec1 kaputt. Und das ist doof. Und ich dachte, es muss doch irgendeine "schöne" Löung geben - ohne die Felder zu kopieren und ohne sie in ein struct zu verpacken.

Also wo genau ist das Problem?

Das Problem ist einfach nur, dass ich eine "schöne" Lösung wollte ;-)
 
Die übliche C Lösung wäre es den 3. (Ergebnis) Vektor einfach als Zeiger mit zu übergeben - der 'gehört' dann dem Aufrufer[1] und der Aufrufer kann sich auch entscheiden wie er das gerne gemacht hätte. Kommt ganz ohne Umkopieren aus.

Code:
void vecSum(double* sum, double* vec1, double* vec2, int iDim)
{
   while(iDim--)
      *sum++ = *vec1++ + *vec2++;
}

Wobei sowas in C++ wirklich viel schöner geht - da kann man die Operatoren überladen und das unelegante mitschleifen von iDim entfällt auch.


[1] eine Funktion sollte sinnvollerweise keinen Speicher anfordern & zurückgeben (in diesem Fall den für das Ergebnisfeld). Wenn eine Funktion eine Struktur zurückgibt legt der Aufrufer den Speicher an (macht der Compiler). Das kann man deshalb so nicht selber schreiben.
Wenn eine Funktion Speicher zurückgibt muß sich der Aufrufer drum kümmern, das der wieder freigegeben wird. Nichts, was man sich einhandeln möchte wenn es irgendwie anders geht.
 
Fetz schrieb:
Wobei sowas in C++ wirklich viel schöner geht - da kann man die Operatoren überladen und das unelegante mitschleifen von iDim entfällt auch.

iDim werde ich los, wenn ich den "vector" aus der Standard-Bibliothek benutzte? Operator-Überladung ist klar, will ich aber vermeiden, das ist noch länger als der ganze Rest ;-)
 
Alex schrieb:
Alisa 1387 schrieb:
Irgendwo wirste doch das Feld initalisieren, was übergeben werden soll.

Hm, ja.

Da geht's um ein Programm, das Numerik treibt. Da brauche ich zum Beispiel Funktionen, die mir Vektoren um mathematischen Sinn addieren.

Zum Beispiel macht diese Funktion hier
Code:
double *vecSum(double* vec1, double* vec2, int iDim)
{
	for(int i=0; i<iDim; i++)
		vec1[i] += vec2[i];
	return vec1;
}

vec1 kaputt. Und das ist doof. Und ich dachte, es muss doch irgendeine "schöne" Löung geben - ohne die Felder zu kopieren und ohne sie in ein struct zu verpacken.

Also wo genau ist das Problem?

Das Problem ist einfach nur, dass ich eine "schöne" Lösung wollte ;-)

Du könntest ein eigendes Feld vec3[] für das Ergebnis verwenden und der Funktion die Adresse des ersten Elementes übergeben. Und in der Funktion das Ergebis dann an die Speicherstelle vec3 schreiben.
 
Hm wofür braucht ihr das Überladen der Operatoren?
Bin immer für neues Wissen offen!
 
Der + Operator ist in C nur für einzelne, einfache Variablen definiert. In C++ kann man Operatoren für "Sonderfälle" definieren, und + somit direkt zum Addieren der diversen Feldelemente verwenden, was im allgemeinen eleganter erscheint als die Schleife.
 


Neueste Beiträge

News

Zurück
Oben