C tiefgestellte Wert ist weder array nor pointer nor vector bei der Zuweisung eines array-Elements mit dem Wert
Sorry für die Fragen, die bereits beantwortet Frage, ich bin ein Neuling auf C und nicht verstehen, die Lösungen.
Hier ist meine Funktion
int rotateArr(int *arr) {
int D[4][4];
int i = 0, n =0;
for(i; i < M; i ++ ){
for(n; n < N; n++){
D[i][n] = arr[n][M - i + 1];
}
}
return D;
}
Wirft es einen Fehler
main.c|23|Fehler: tiefgestellte Wert ist weder array noch
pointer nor vector|
on line
D[i][n] = arr[n][M - i + 1];
Was ist falsch? Ich bin nur der Wert von einem array-element einem anderen array-element.
Arr bestanden erklärt wird
int S[4][4] = { { 1, 4, 10, 3 }, { 0, 6, 3, 8 }, { 7, 10 ,8, 5 }, { 9, 5, 11, 2} };
- Vielleicht haben Sie gedacht, zu schreiben
int rotateArr(int **arr)
? - so wie es scheint!
Du musst angemeldet sein, um einen Kommentar abzugeben.
C können Sie den subskript-operator
[]
auf arrays und Zeiger. Wenn Sie diesen operator auf einen Zeiger, der entstehende Typ ist der Typ, auf den der Zeiger zeigt. Zum Beispiel, wenn Sie sich bewerben[]
zuint*
werden, wäre das Ergebnis einint
.Genau das ist, was Los ist: Sie sind vorbei
int*
, das entspricht einem Vektor von Integer-zahlen. Mit Tiefgestellt es auf einmal macht esint
, so dass Sie anwenden können, das zweite subskript zu.Scheint es aus dem code, dass
arr
sollte ein 2-D array. Wenn es umgesetzt wird, wie eine "gezackte" array (also ein array von Zeigern), dann ist der parameter-Typ sollteint **
.Zudem scheint es, dass Sie versuchen, um return ein lokales array. Um dies zu tun, legal ist, müssen Sie zuweisen, das array dynamisch, und gibt einen Zeiger. Aber ein besserer Ansatz wäre die Deklaration einer speziellen
struct
für Ihre 4x4-matrix, und es verwenden, um wickeln Sie Ihre array fester Größe, wie das ist:Diese druckt die folgenden:
Außer, wenn es ist der operand der
sizeof
oder unäre&
Betreiber, oder ein string-literal verwendet wird, zu initialisieren ein array in einer Erklärung, die einen Ausdruck vom Typ "N-element array vonT
" umgewandelt ("zerfällt") in einen Ausdruck vom Typ "Zeiger aufT
", und der Wert des Ausdrucks ist Adresse des ersten Elements des Arrays.Wenn die Deklaration des Arrays übergeben werden
dann, wenn Sie schreiben
den Ausdruck
S
Typ "4-element-array von 4-element-array vonint
"; seitS
ist nicht der operand dersizeof
oder unäre&
Betreiber, wird es konvertiert werden, ein Ausdruck vom Typ "Zeiger auf 4-element-array vonint
", oderint (*)[4]
, und diese Zeiger Wert ist, was wirklich übergeben bekommt, umrotateArr
. Damit Sie Ihre Funktion Prototyp muss eine der folgenden sein:oder
oder sogar
In den Kontext einer Funktion parameter-Liste von Deklarationen der form
T a[N]
undT a[]
interpretiert werden alsT *a
; alle drei erklärena
als Zeiger aufT
.Sind Sie wahrscheinlich Fragen, warum ich änderte den Rückgabetyp von
int
zuT
. Wie geschrieben, du versuchst auf einen Rückgabewert des Typs "4-element-array von 4-element-array vonint
"; leider können Sie nicht tun. C-Funktionen nicht Rückgabe-array-Typen, noch können Sie zuweisen, array-Typen. Anders ausgedrückt, Sie können nicht schreiben, so etwas wie:Funktionen zurückgeben kann Zeiger auf arrays, aber das ist nicht das, was Sie hier wollen.
D
wird aufhören zu existieren, sobald die Funktion gibt, so dass alle Zeiger kehren Sie ungültig.Wenn Sie möchten, weisen Sie die Ergebnisse des gedrehten Arrays in ein anderes array, dann müssen Sie passieren die Ziel-array als parameter an die Funktion:
Und rufen Sie es als
Sind Sie nicht, indem Sie Ihre 2D-array korrekt. Dies sollte für Sie arbeiten
oder
oder
Anstelle der Rückgabe der array-pass das Ziel-array als argument. Siehe Johannes Bode Antwort.
int **
undint [][N]
sind nicht gleichwertig.(int **)S
,int **
ist nicht in der Lage zu repräsentierenint[4][4]
, und(int *arr[])
muss(int (*arr)[4])
Das problem ist, dass
arr
ist nicht (erklärt) ein 2D-array, und Sie behandeln es, als wäre es 2D.Müssen Sie "int* arr" so "arr[n]" ist ein int, richtig? Dann ist dein "[M - 1 + 1]" etwas ist, versucht, dass int als array/- Zeiger/Vektor.
das zweite subskript-operator ist hier ungültig.
Übergeben wird ein int * Zeiger auf Funktion, die ein 1-d array. Also nur ein subskript-operator kann es verwendet werden.
Lösung : Sie können den pass int ** Zeiger in funciton