Die Art der arr
ist double[X][Y]
- das heißt, verdoppelt sich eine Reihe von X-Arrays von Y - wo X
und Y
auf initializers abhängen. Dies ist nicht das gleiche wie Zeigertyp. Gemäß den C-Konvertierungsregeln kann ein Array jedoch in einen Zeiger auf sein Element zerfallen. In Ihrem Fall ist der Typ, der aus einem solchen Zerfall resultiert, doppelt (*) [Y] - ein Zeiger auf eine Anordnung von Y-Doppelpunkten. Beachten Sie, dass dies ein Zeiger auf Array ist, kein Array von Zeigern, so wird es nicht weiter zerfallen. An diesem Punkt erhalten Sie einen Typenkonflikt, da Ihre Funktion double**
erwartet.
Der richtige Weg, dies zu behandeln, ist, das Array als eindimensional zu behandeln und Breite entlang zu führen. Also:
void func(double* arr, int w) {
// arr[2][3]
arr[2*w + 3] = ...;
}
double x[6][8] = { ... };
func(&x[0][0], 8);
In C++ insbesondere, wenn Sie immer statisch Arrays von bekannten (aber verschiedenen) Arten zugeordnet haben, können Sie in der Lage sein, Vorlagen zu verwenden und Referenzen wie folgt aus:
template <int W, int H>
inline void func(const double (&arr)[W][H]) {
arr[2][3] = ...;
}
double x[6][8] = { ... };
func(x); // W and H are deduced automatically
Dies funktioniert jedoch nicht, wenn Sie nur einen Zeiger haben (zB wenn das Array new
-allocated ist und seine Größe zur Laufzeit berechnet wird).Für den allgemeinsten Fall sollten Sie stattdessen C++ - Container verwenden. Mit nur Standard-Bibliothek, verwendet man in der Regel Vektor von Vektoren:
#include <vector>
void func(std::vector<std::vector<double> > arr) {
arr[2][3] = ...;
}
std::vector<std::vector<double> > x(6, std::vector<double>(8));
x[0][0] = ...;
...
func(x);
Wenn Sie Boost-verwenden können, muss es eine sehr schöne Multiarray-Bibliothek in ihm:
void func(boost::multi_array<double, 2> arr) { // 2 means "2-dimensional"
arr[2][3] = ...;
}
boost::multi_array<double, 2> x(boost::extents[6][8]);
x[0][0] = ...;
...
func(x);
[EDIT] Sie sagen, dass Sie können die Definition Ihrer Funktion nicht ändern. Wenn dies der Fall ist, handelt es sich tatsächlich um eine Funktion, die ihr Argument als ein Array von Zeigern behandelt. Sie sollten daher Ihre Datenstruktur entsprechend zuordnen. Zum Beispiel:
double x1[8] = { 1, 2, ... };
double x2[8] = { 3, 4, ... };
...
double* x[6] = { x1, x2, ... };
func(x);
also wie übertrage ich das Array zu meinem func? Ich bin verwirrt. Ich möchte es an func weitergeben, ohne seine Erklärung zu ändern. – zack