float *
może wskazywać na pierwszy element tablicy zmiennych, i powinien być reinterpret_castable do tego typu tablicy. Wynik tego odlewu może wskazywać na pierwszy element z float [][]
, a więc powinien być reinterpret_castable do tego typu, i tak dalej. Powinieneś być w stanie tworzyć takie odlewy i tylko bezpośrednio zrobić
float (&arr)[2][2] = *reinterpret_cast<float (*)[2][2]>(matrixReturnAsArray);
Argument typu float **
nie jest taka sama i nie powinny być używane w ten sposób.
Aby uniknąć niezdefiniowanych zachowań, wskaźnik musi pochodzić z rzeczywistej tablicy wielowymiarowej, a jeśli użyty zostanie kod float*
, nie można uzyskać dostępu do więcej niż pierwszego wiersza wielowymiarowej macierzy.
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
}
Biorąc float arr[2][2];
nic nie gwarantuje, że &arr[0][1] + 1
jest taka sama jak &arr[1][0]
, o ile udało mi się ustalić. Więc chociaż można użyć tablicy jednowymiarowej jako wielowymiarowej tablicy, wykonując f[i*width + j]
, nie można traktować wielowymiarowej tablicy, takiej jak jednowymiarowa tablica.
Lepiej używać C++ podczas kompilacji, zamiast polegać tylko na niezamierzonym przekazaniu niewłaściwej rzeczy lub wykonaniu niewłaściwej reinterpret_cast. Aby uzyskać typu bezpieczeństwo korzystania RAW tablic należy użyć odwołania do surowej typu array chcesz:
void foo(float (&f)[2][2]) {}
void foo(float (&f)[3][3]) {}
Jeśli chcesz przechodzić przez tablice wartości nie można używać surowych tablic i powinny zamiast użyć coś jak std :: array:
void foo(std::array<std::array<float,2>,2> f) {}
void foo(std::array<std::array<float,3>,3> f) {}
Myślę, że próbujesz rozwiązać niewłaściwy problem (np. "jak rzutować?" jest * rzadko * właściwym problemem). Napisałem proste rozwiązanie problemu "jak używać tablic wielowymiarowych w prosty sposób?" once: http://ideone.com/gytw7 –
Nie ma sposobu, żeby "float *" wskazywał na wielowymiarowy * cokolwiek * (z wyjątkiem naprawdę okropnego rzucania, którego nie powinieneś robić) i byłbym zaskoczony, gdyby kompilator ty). Wartość 'float * 'wskazuje na zmienną, która może być pierwszą wartością w jednowymiarowej macierzy zmiennoprzecinkowej. Ale nie wskazuje żadnej pod-tablicy, jak byś potrzebował do wielowymiarowej tablicy. 2x2 i 3x3 są zarówno 2D, więc oba mogą być 'float **'. Naprawdę, znacznie lepiej byłoby stworzyć (lub znaleźć) i użyć dedykowanej klasy 'Matrix'. – KRyan
Ok, mógłbym zmienić mój argument wejściowy na float **.Ale czy mówisz, że w przypadku pływaka aMDarray [3] [3], przechowywanie pierwiastków nie gwarantuje ciągłości? – NoahR