float *
podría apuntar al primer elemento de una matriz de flotantes, y debería reinterpretarse_castable a ese tipo de matriz. Y el resultado de ese lanzamiento podría apuntar al primer elemento de un float [][]
y, por lo tanto, debería reinterpretarse_castable a ese tipo, y así sucesivamente. Usted debe ser capaz de componer dichos moldes y apenas lo hacen directamente
float (&arr)[2][2] = *reinterpret_cast<float (*)[2][2]>(matrixReturnAsArray);
Un argumento de tipo float **
no es lo mismo y no se debe utilizar de esta manera.
Para evitar un comportamiento indefinido, el puntero debe proceder de una matriz multidimensional real, y si se usa directamente el float*
, no podrá acceder a más de la primera fila de la matriz multidimensional.
void foo(float *f) {
f[3] = 10.;
float (&arr)[2][2] = *reinterpret_cast<float (*)[2][2]>(f);
arr[1][1] = 10.;
}
void main() {
float a[2][2];
foo(&a[0][0]); // f[3] = 10.; is undefined behavior, arr[1][1] = 10. is well defined
float b[4];
foo(&b[0]); // f[3] = 10.; is well-defined behavior, arr[1][1] = 10. is undefined
}
Dada float arr[2][2];
nada garantiza que &arr[0][1] + 1
es lo mismo que &arr[1][0]
, por lo que yo he podido determinar. Por lo tanto, aunque puede usar una matriz dimensional única como matriz multidimensional al hacer f[i*width + j]
, no puede tratar una matriz multidimensional como una matriz dimensional única.
Es mejor utilizar la seguridad de tipo de tiempo de compilación de C++ en lugar de simplemente confiar en que no se pase el error por error o que se realice la reinterpretación_cast incorrecta. Para obtener seguridad de tipos usando primas-arrays se debe utilizar referencias al tipo de matriz prima que desee:
void foo(float (&f)[2][2]) {}
void foo(float (&f)[3][3]) {}
Si desea pasar matrices de valor que no se puede utilizar matrices primas y en su lugar debe usar algo como std :: arreglo:
void foo(std::array<std::array<float,2>,2> f) {}
void foo(std::array<std::array<float,3>,3> f) {}
Creo que estás tratando de resolver el problema incorrecto (es decir, "¿cómo moldear?" es * rara vez * el problema correcto). Escribí una solución simple al problema de "cómo usar matrices multidimensionales fácilmente". una vez: http://ideone.com/gytw7 –
No hay forma de que un 'float *' apunte a un * todo * multidimensional (salvo que el casting realmente terrible no debería estarlo y me sorprendería si un compilador lo dejara tú). Un 'float *' apunta a un flotante, que puede ser el primer valor en una matriz de flotación de una sola dimensión. Pero no apunta a ninguna sub-matriz, como lo necesitaría para una matriz multidimensional. 2x2 y 3x3 son ambos 2D, por lo que ambos podrían ser 'float **'. Realmente, sin embargo, sería mucho mejor crear (o encontrar) y usar una clase 'Matrix' dedicada. – KRyan
Ok, podría cambiar mi argumento de entrada para flotar **.¿Pero estás diciendo que en el caso de float aMDarray [3] [3], no se garantiza que el almacenamiento de elementos sea continuo? – NoahR