How to cast simple pointer to a multidimensional-array of fixed size?
I have a function that takes a pointer to a floating point array. Based on other conditions, I know that pointer is actually pointing to a 2x2 OR 3x3 matrix. (in fact the memory was initially allocated as such, e.g. float M[2][2] ) The important thing is I want to make this determination in the function body, not as the function argument.
void calcMatrix( int face, float * matrixReturnAsArray )
{
// Here, I would much rather work in natural matrix notation
if( is2x2 )
{
// ### cast matrixReturnAsArray to somethingAsMatrix[2][2]
somethingAsMatrix[0][1] = 2.002;
// etc..
}
else if(is3x3)
{ //etc...
}
}
I am aware that I could use templates and other techniques to better address this problem. My question is really about how to make such a cast at the ### comment. Working in C++.
float (*somethingAsMatrix)[2] = (float (*)[2]) matrixReturnAsArray;
float *
는 플로트 배열의 첫 번째 요소를 가리킬 수 있으며, 해당 배열 유형에 맞게 재해석_캐스팅 가능해야 합니다.그리고 그 출연진의 결과는 A의 첫번째 요소를 가리킬 수 있습니다.float [][]
그래서 그 타입으로 재해석_캐스팅이 가능해야 합니다.당신은 그러한 캐스팅을 구성할 수 있어야 하고 직접적으로 해야 합니다.
float (&arr)[2][2] = *reinterpret_cast<float (*)[2][2]>(matrixReturnAsArray);
유형의 인수float **
는 동일하지 않으므로 이와 같이 사용해서는 안 됩니다.
정의되지 않은 동작을 방지하려면 포인터가 실제 다차원 배열에서 시작되어야 합니다.float*
는 직접 사용되며 다차원 행렬의 첫 번째 행 이상에는 액세스할 수 없습니다.
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
}
정해진float arr[2][2];
라는 보장은 없습니다.&arr[0][1] + 1
와 같음&arr[1][0]
, 내가 판단할 수 있는 한 말입니다.따라서 단일 차원 배열을 다중 차원 배열로 사용할 수는 있지만,f[i*width + j]
다중 차원 배열을 단일 차원 배열처럼 취급할 수 없습니다.
It's better to use C++'s compile-time type-safety instead of just relying on not accidentally passing the wrong thing or performing the wrong reinterpret_cast. To get type-safety using raw-arrays you should use references to the raw array type you want:
void foo(float (&f)[2][2]) {}
void foo(float (&f)[3][3]) {}
If you want to pass arrays by value you can't use raw arrays and should instead use something like std::array:
void foo(std::array<std::array<float,2>,2> f) {}
void foo(std::array<std::array<float,3>,3> f) {}
This sort of casting is always cleaner, and easier to deal with, with a judicious use of typedef:
typedef float Matrix_t[2][2];
Matrix_t* someThingAsMatrix = (Matrix_t*) matrixReturnAsArray;
If this is C++ and not C, though, you should create a matrix class. (Or better yet, look for an open source one.)
내 말이 맞다면:
type deffloat Matrix_t[2][2];
Matrix_t & matrix = *(Matrix_t *) 행렬 배열로 반환;
아니면
float (&matrix2)[2][2] = *(float (*)[2])matrixReturnAsArray;
C에는 포인터를 사용하는 방법만 있습니다.
매트릭스_t *일부ThingAsMatrix = (Matrix_t *) 행렬 배열로 반환;
다음을 통해 액세스할 수 있습니다.
(*SomeThingAsMatrix)[1][0] = ...
언급URL : https://stackoverflow.com/questions/11869056/how-to-cast-simple-pointer-to-a-multidimensional-array-of-fixed-size
'programing' 카테고리의 다른 글
ajax 요청 후 Chrome window.open(크롬 창)이 팝업처럼 작동합니다. (0) | 2023.11.06 |
---|---|
열거형에 콩 주입 (0) | 2023.11.01 |
자바스크립트 HTML5 캔버스를 이용하여 N개의 포인트를 통해 매끄러운 곡선을 그리는 방법? (0) | 2023.11.01 |
mysql (mariadb) 튜닝 및 성능 테스터 (0) | 2023.11.01 |
PHP에서 연산자 오버로드가 가능합니까? (0) | 2023.11.01 |