Pass By Reference Mehrdimensionale Arrays Mit Unbekannter Größe
How to pass by reference mehrdimensionale Arrays mit unbekannter Größe, die in C oder C++?
EDIT:
Beispielsweise in der main-Funktion habe ich noch:
int main(){
int x, y;
int arr[x][y];
//pass_by_ref(/* passing just arr[][] by reference */);
}
und die Funktion:
void pass_by_ref(/* proper parameter for arr[][] */){
//int size_x_Arr = ???
//int size_y_arr = ???
}
Wie die Umsetzung der auskommentierte Zeile?
- Treffen Sie Ihre Wahl - in C++ können Sie
std::vector&
oder andere ähnliche Arten, in C müssen Sie die Größe als zusätzliche parameter oder als element, wenn Sie einen ganzzahligen Typ). - Tatsächlich, Sie können nur übergeben Sie ein array per Referenz mit unbekannter Größe! (OK, es gibt einen trick mit einem struct, aber lasst uns nicht dorthin). Was haben Sie versucht?
- In C ist es unmöglich, da C keine Verweise. In C++ ist, ist es unmöglich, weil es keine Unterstützung für array mit variabler Länge.
- möglich, Duplikat der Wie kann ich passiere ein mehrdimensionales array an eine Funktion?
- In C, kurz, Sie nicht. Sie müssen ein Konstrukt, das bestimmt die Dimensionierung auf eine Nutzung-Zeit. Wie Sie gleen, die Größe, die info ist bis zu Ihnen.
- Wie kann Sie genau definieren Ihre "mehrdimensionale Arrays mit unbekannter Größe" ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach ausgedrückt, kann man nicht. In C, können Sie nicht als Verweis übergeben, da C keine Verweise. In C++ können Sie T-pass-arrays mit unbekannter Größe, da C++ nicht unterstützt variable-length arrays.
Alternative Lösungen: in C99 übergeben Sie einen Zeiger auf die variable-Länge-array; in C++, übergeben Sie einen Verweis auf
std::vector<std::vector<T>>
.Demonstration für C99:
Demonstration für C++03:
strtol(argv[1], NULL, 10);
?boost::array
in C++void foo(int n, int k, int (*arr)[n][k])
und bekamerror: use of parameter 'n' outside function body
-std=c99
? (Auch Schmierblutungen ein Fehler im code, sollten Sie nicht machen, unaccept meine Antwort sofort.)H2CO3-Lösung wird für die Arbeit C99 oder eine C2011-compiler, unterstützt VLAs. Für C89 oder eine C2011-compiler, der nicht Unterstützung VLAs, oder (Gott bewahre) einen K&R-C-compiler, hätten Sie etwas anderes zu tun.
Vorausgesetzt, dass Sie vorbei sind eine zusammenhängend reservierten Arrays, übergeben Sie einen Zeiger auf die erste element (
&a[0][0]
) zusammen mit der dimension Größen, und dann behandeln Sie es wie ein 1-D array, das mapping von Indizes wie so:Dieser Arbeit wird für arrays auf dem Stapel reserviert:
und für dynamisch zugewiesenen arrays in der form:
da beide zusammenhängend zugeteilt Zeilen. Dies wird nicht Arbeit (oder zumindest, nicht garantiert, um zu arbeiten) für dynamisch zugewiesenen arrays in der form:
da ist es nicht garantiert, dass alle Zeilen zugewiesen werden, zusammenhängend zu einander.
Dies ist eine Art Kommentar auf die gute Antwort von @John Bode
Aber diese Variante:
Nach Gebrauch :
für
T
wirdint
rufen Siefoo
genau als für die array -int ap[M][N];
da Sie garantiert, dass alle Zeilen zugeordnet sind, zusammenhängend zu einander.
Diese Zuordnung ist ein Wurf effizienter.
John Bode ' s Erklärung ist sehr gut, aber es gibt einen kleinen Fehler:
es sollte
statt
Wenn Sie wirklich wollen, Verweise, dann ist es nur in C++.
En Beispiel eines zweidimensionalen int-array per Referenz übergeben
Aber der Verweis hat keinen Vorteil, so verwenden Sie einfach :
Ich würde empfehlen, dass Sie verwenden einen Behälter zu halten array.
int **
ist ein Zeiger auf Zeiger auf int, es ist nicht ein 2-dimensionales array.main
- Funktion, mit derchar** argv
Funktion, die ein array von char-array.malloc()
und pass in den Größen, und was auch immer. Aber (double) Zeiger sind noch nicht (zwei-dimenisional) - arrays.