In C-Arrays sind Bürger zweiter Klasse. Um sie herumzuführen, müsstest du eine Struktur einpacken.
I.e.:
struct t_array42int{int o[4][2];} getValid(int *blank){
int row = blank[0];
int col = blank[1];
static struct t_array42int valid_container;
int (*valid)[2] = valid_container.o;
valid[0][0] = row;
valid[0][1] = col-1;
valid[1][0] = row;
valid[1][1] = col+1;
valid[2][0] = row-1;
valid[2][1] = col;
valid[3][0] = row+1;
valid[3][1] = col;
return valid_container;
}
Dann können Sie Ihre Funktion Rückgabewert speichern wie:
struct t_array42int tmp = getValid(something);
Of-Kurs gibt es Möglichkeiten, diesen Prozess der „Verpackung“ zu vereinfachen, aber die sind oft nicht Standard oder auch verschleiert.
Der Nachteil der Verwendung von Strukturen besteht darin, dass Strukturtypen nicht nach ihrem Elementlayout, sondern (normalerweise) nach ihren Namen verglichen werden. So etwas wie das:
struct { int o[2]; } a;
struct { int o[2]; } b;
a = b; //Error
ist illegal.
sollten Sie schreiben:
struct t_array2int { int o[2]; } a;
struct t_array2int b;
a = b; //OK
statt.
Sie auch einen Zeiger auf das Array zurückkehren könnte statt, weil es Lagerung ist statisch (dh es wird nicht von der Funktion zu existieren aufhören, nach der Rückkehr):
int (*getValid(int *blank))[2]{
int row = blank[0];
int col = blank[1];
static int valid[4][2];
valid[0][0] = row;
valid[0][1] = col-1;
valid[1][0] = row;
valid[1][1] = col+1;
valid[2][0] = row-1;
valid[2][1] = col;
valid[3][0] = row+1;
valid[3][1] = col;
return valid;
}
Der Funktionsprototyp:
int (*getValid(int *blank))[2]
bedeutet, dass wenn Sie Ihre Funktion getValid
mit einem einzigen Argumente von int *
Typ nennen - getValid(something)
und dereferenzieren, *getValid(something)
Sie einen Array erhalten werden, die nicht wiezugegriffen werden könnenund so haben maximal 2 Elemente des Typs int
.
Einfaches Beispiel des obigen Beispiels wird:
int (*tmp)[2] = getValid(something);
Und ich schlage vor, auch Ihre Array-Parameter mit ihrer realen Art zu schreiben (die nie ein Array sein können - der Compiler nur Sie in dem Denken täuscht, dass Arrays können nach Wert übergeben werden). Beispiel: void f(int a[N])
ist auf void f(int *a)
eingestellt. Und int *
ist nicht dasselbe wie int [N]
.
Für einen Neuling empfehle ich Sie daran zu erinnern, dass Arrays nicht die gleichen wie Zeiger sind, aber als solche sehr schlecht behandelt werden. Außerdem empfehle ich Ihnen, niemals Funktionen mit Array-Parametern zu schreiben. Und wenn Sie Arrays auf andere Weise verwenden möchten, dann erhalten Sie den Zeiger auf ihr erstes Element, um stattdessen Strukturen zu verwenden - viel sicherer.
Die Hauptsache mit Array-Parameter ist, dass:
void f(int a[2])
{
sizeof(a) == sizeof(int *); //evaluates to 1
sizeof(a) != sizeof(int [2]); //evaluates to 1
}
Return ein Zeiger auf eine 1D-Array – Olaf