Seite 1 von 2
2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 2:38 pm
von Orioner
Ich packe es gerade nicht, ein 2-dimensionales char-Array an eine Funktion zu übergeben und dann den Inhalt auszugeben. Wie muss die Funktion deklariert und aufgerufen werden? Am besten würde mir ein kleines Beispiel helfen. Ich habe gerade schon x Varianten durch, mit eckigen Klammern, ohne eckigen Klammern, mit Angabe einer Dimension, mit Angaber beider Dimensionen, auch ohne Dimension. Mit &-Operator und ohne. Nichts funktioniert.
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 3:16 pm
von mfro
Orioner hat geschrieben: ↑Mi Aug 26, 2020 2:38 pm
Ich packe es gerade nicht, ein 2-dimensionales char-Array an eine Funktion zu übergeben und dann den Inhalt auszugeben. Wie muss die Funktion deklariert und aufgerufen werden? Am besten würde mir ein kleines Beispiel helfen. Ich habe gerade schon x Varianten durch, mit eckigen Klammern, ohne eckigen Klammern, mit Angabe einer Dimension, mit Angaber beider Dimensionen, auch ohne Dimension. Mit &-Operator und ohne. Nichts funktioniert.
C kennt keine Wertübergabe von Arrays. Auch wenn's so aussieht:
Code: Alles auswählen
void tstarr(int arr[][4])
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
printf("arr[%d, %d] = %d\n", i, j, arr[i][j]);
}
Was hier übergeben wird, ist tatsächlich die Startadresse des Arrays, nicht der Inhalt. Bei mehrdimensionalen Arrays kann man (wie hier gezeigt) lediglich die erste Array-Dimension offen lassen (man kann sie aber auch angeben)
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 4:43 pm
von Orioner
Danke schonmal für dein Beispiel. Ich weiß, dass Arrays immer per Reference und niemals per Value übergeben werden. Mein Problem ist die Syntax. Die korrekte Deklaration der Methode und ihre Verwendung sehe ich schon sehr gut an deinem Beispiel. Was ich noch brauche wären Beispiele für eine passende Vorwärtsdeklaration und für den Funktionsaufruf.
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 5:02 pm
von Xin
Du kannst ein [] auch immer als Pointer verstehen:
Das ganze geht also auch als void tstarr(int ** arr) durch.
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 5:10 pm
von Orioner
Und wie rufe ich die Funktion auf?
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 5:16 pm
von mfro
indem Du ihr das übergibst, was sie als Parameter erwartet: ein Array aus 4 Integer-Vektoren mit je 4 Elementen.
Wie würdest Du das machen?
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 5:30 pm
von Orioner
Ich habe mehrere Varianten probiert:
Code: Alles auswählen
int main() {
tstarr(arr);
}
int main() {
tstarr(arr[]);
}
int main() {
tstarr(arr[][]);
}
int main() {
tstarr(arr[0]);
}
int main() {
tstarr(arr[][0]);
}
Nichts hat funktioniert.
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 6:46 pm
von mfro
die erste ist die richtige. Wenn das nicht funktioniert, ist mit deinem Array was faul.
Zeig' deinen gesamten Code.
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Mi Aug 26, 2020 9:29 pm
von Orioner
Mit folgender Notation hat es letztendlich funktioniert. Das war eine schwere Geburt. Danke an die Helfer.
Code: Alles auswählen
//Vorwärtsdeklaration:
void test_a(char[][6]);
//Deklaration des Arrays:
char test3[][6] = { "Test3" }; // Mir scheint, dass hier gewschweifte Klammern notwendigt sind. Warum?
//Funktionsaufruf:
test_a(test3);
//Funktion und Benutzung:
void test_a(char test3[][6]) {
printf("%s\n", test3);
}
Re: 2-dimensionales Array an Funktion übergeben
Verfasst: Do Aug 27, 2020 8:29 am
von Xin
Orioner hat geschrieben: ↑Mi Aug 26, 2020 9:29 pm
Mit folgender Notation hat es letztendlich funktioniert. Das war eine schwere Geburt. Danke an die Helfer.
Code: Alles auswählen
//Vorwärtsdeklaration:
void test_a(char[][6]);
//Deklaration des Arrays:
char test3[][6] = { "Test3" }; // Mir scheint, dass hier gewschweifte Klammern notwendigt sind. Warum?
//Funktionsaufruf:
test_a(test3);
//Funktion und Benutzung:
void test_a(char test3[][6]) {
printf("%s\n", test3);
}
Ähh... das funktioniert, aber es ist trotzdem falsch. Oder wenigstens nicht korrekt. ^^
%s gibt Strings aus, also den Zeiger auf den ersten Buchstaben eines Textes: (char const *). Genau das passiert in Deinem Code, wei Dein Array passend aufgebaut ist.
Übergeben müsstest Du aber test3[0].
Code: Alles auswählen
//Deklaration des Arrays:
char global[][6] = { "Test3" };
//Funktionsaufruf:
test_a(global);
//Funktion und Benutzung:
void test_a(char local[][6]) {
printf("%s\n", local[0]);
}
Die geschweiften Klammern sind erforderlich, weil Du ein Array von Strings anlegst, welches du mit einem Array füllen müsst: Also geschweifte Klammern. In Deinem Array ist nur ein String drin.
Dein Array ist übrigens ein Array unbekannter Größe mit 6 chars. Längere Strings, wie beispielsweise "Hello World" passen da nicht rein.