Array als Rückgabewert ?

Nasenbaer

Mitglied
Hi,
ist es möglich ein Array von einer Funktion zurückgeben zu lassen bzw einen Zeiger darauf?
Ich habe nämlich folgendes Problem:
In einer Klasse habe ich ein 2D Array ( int[10][20] ) private deklariert. Um Lese-/Schreibzugriff darauf zu bekommen hab ich eine Funktion geschrieben.
Dann habe ich eine Variable im eigentlichem Programmcode angelegt (int *Test[10][20] ) und wollte die Werte des Arrays mittels der Funktion zurückliefern. (Funktion hatte den Rückgabewert int* und es funtzte nicht :( )
Wie muss ich das richtig machen ?

Mfg Nasenbaer
 
Obwohl ich sehr stark vermute, dass du damit vorhast eine Design-Regeln zu brechen:

Der Rückgabewert müsste "int* [][20]" oder so ähnlich sein... hmm, weiß auch nicht mehr genau, probier das aus, und sag mir falls es nicht funktioniert dann probier ich mal damit rum.
 
Einfacher wärs aber, das Array gleich public zu setzten.

Direkter Zugriff auf private-Elemente via Pointer ist irgendwie sinnfrei :)
 
Stimmt auch wieder...

Ich werde das in diesem Projekt glaub ich auch so machen aber das Problem hatte ich auch früher schonmal. Es sollten halt 10 Werte auf einmal zurückgeben werden. Musste dann auch wieder nen Workaround nehmen und zwar jeden Wert einmal extra berechnen und die Funktion in ne For-Schleife stecken.

@Xeragon

Nein läuft leider nicht :(
Und welche Design-Regeln breche ich denn?

Mfg Nasenbaer
 
Zugriff auf private Elemente (indirekt halt); Hinausgabe von internen Pointern; Verletzung der Kapselung; ...

Naja, wenn's für ein kleines Übungsprojekt ist... bei gößeren Projekten solltest du sowas allerdings vermeiden.

Eine halbwegs schöne Möglichkeit wäre z.b. operator() zu überladen:

int& operator(int x, int y)
{
return m_internesArray[x][y];
}

Dann kannst du mit einem Objekt deiner Klasse folgendes machen:

Objekt(x, y) = 15;

Allerdings ist das überladen von operator() nur sinnvoll wenn's auch logisch wäre... falls nicht tut's ne einfache member-funktion ebenfalls :).
 
Gutes Design sieht vor, private-Werte nur über Zugriffsmethoden zu verändern.

Eine lauffähige, prozderale Rückgabe eines Arrays schaut so aus:
PHP:
/*Rückgabe eines Arrays, wieviele Dimensionen ist dabei egal
bzw. es sollten die Dimensionen in Form einer struct übergeben werden*/

#include <iostream>


using namespace std;


int* function(int a)
{
	int *b = new int[10];
	for(int i=0;i<10;i++)
	{
		b[i]=a*i;
	}
	return b;
}

int main()
{
	int* x=NULL;
	x=function(3);

	for(int i=0;i<10;i++)
	{
		cout<<x[i]<<endl;
	}

	return 0;
}

Das Ganze ist halt tendenziell fehleranfällig...
 
OK, mit folgendem Code gehts: (Ich möchte dir allerdings wirklich raten eine Funktion "int& get(int x, int y)" (od. operator()) stattdessen zu verwenden)

Code:
class arr
{
private:
	int intern[10][20];

public:
	 void get(int (*&retVal)[10][20])
	 {
		retVal = &intern;
	 }
};


int main()
{
	arr x;

	int (*test)[10][20] = 0;
	x.get(test);
	
	return 0;
}

Ich verwende dabei eine Referenz auf den Pointer anstatt einen Pointer auf den Pointer, damit wenigstens der Aufruf nicht zu einem syntaktischen Durcheinander wird :).
 
@Daishi: Mal ganz abgesehen davon, dass du in dem Code ien Memory-Leak hast (und zwar ein ziehmlich blödes, da der Client der Funktion das ganze löschen müsste), wäre es besser gleich eine Klasse zu implementieren, die sich (fast) wie ein mehrdimensionales Array verhält, oder auf STL-Container zurückzugreifen.
 
Achso du meintest di Herausgabe eines klasseninternen Pointers. Jo das hatte ich einfach übersehen..
Ich werde das 2. Codebeispiel von dir, Xeragon, nehmen da ich immer auf alle Werte des Arrays zugreifen muss. Jedesmal ein Funktion dafür anschmeißen wäre wohl nicht optimal.

@Daishi
Trotzdem danke für die Mühe aber Xeragons Bsp. passt an dieser etwas besser hinein.


Und falls es euch interessiert es wird ein Tetris-Clone. Ja, es wurde bereits tausende mal geklont aber um einen Einstieg in die Spieleürogrammierung zu finden ist allemal gut da wohl jeder die Regeln kennt ;)

Mfg Nasenbaer
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück