최근 데이터 형식에 대한 Union 저장 지정자에 대해 배웠습니다. 특히 OpenGL/DirectX 변환 매트릭스 사용에 대한 내용입니다. 사용되지 않는 gluLookAt, gluOrtho 및 고정 함수 파이프 라인의 다양한 MatrixStack 함수가 있습니다. 환상적이었고 최근 Matrix에서 데이터에 액세스하는 여러 가지 방법을 허용하기 위해 내부 데이터가 결합 된 4x4 기본 변환 매트릭스 클래스를 만드는 데 많은 재미를 보았습니다. 내가/집계의 열을 기준으로 데이터에 액세스하는 방법을 만들 때 문제가 몇 가지 이상한"Column-Major"형식의 클래스/유니언 데이터 액세스 C++
float* Column(int index);
기능을하지 않고도이다. C++에서 데이터를 행 주요 형식으로 저장한다는 것을 알고 있으므로 어떻게 열 액세스를 제공합니까? 저기있어? 내 아래 행렬 데이터 선언에서 내가 잃어버린 곳을.
//#define ROW_EFFIN_MAJOR
union {
struct {
#ifdef ROW_EFFIN_MAJOR
// Eat one of several nasty things, OpenGL :|
float m11, m12, m13, m14,
m21, m22, m23, m24,
m31, m32, m33, m34,
m41, m42, m43, m44;
#else
float m11, m21, m31, m41,
m12, m22, m32, m42,
m13, m23, m33, m43,
m14, m24, m34, m44;
#endif
};
float m[16];
// Use at your own risk: m[1] COLUMNMAJOR is not the same as m[1] ROWMAJOR
// Rows!
union MatrixRow {
struct {
float r1, r2, r3, r4;
};
float r[4];
} row[4];
// .... Columns...?
union MatrixColumn {
// TODO:
// Set Union
// Column Access ?
// ???
// Profit
} col[???];
};
조언, 팁, 트릭 또는 도움이 필요합니다. 이상적으로 col [0] .c1 또는 col [0] .c (c는 전체 열의 float [4] 임)로 열에 액세스하고 싶습니다. 그러나이 이상이 열 액세스의 더 큰 정의를 위해 죽임 당할 경우 (비록 함수와는 별도로 기울어 져 있기 때문에 특별한 구조체와 함수로 수행 할 수 있기 때문에 바람직하지 않습니다. 데이터 멤버를 통해 직접 데이터).
나는 이것을 google-fu로 bash하려고 꽤 많은 시간을 보냈지 만, 인접하지 않은 결합을 만드는 방법을 알 수는 없습니다.
C++에는 다차원 배열 개념이 없으므로 주요 차원 개념이 없습니다. 배열 배열의 개념을 지원하지만, 내부 배열 열 또는 행을 호출하는지 여부는 대부분 당신에게 달려 있습니다. 행을 초기화 할 때 일반적으로 소스 코드 행과 일치하기 때문에 행으로 참조하는 것이 더 일반적이지만 순전히 우연입니다. –
Aaah union abuse! –
@WTP 연합 학대, 응? 특히 MatrixRow 유니온을 사용하여 디버거 비주얼 라이저를 만들뿐만 아니라 포인터 점프를 시작하지 않고도 네 개의 순차적 데이터 요소에 액세스하고 그룹화 할 수있을 때 악용 사례로 보지 않습니다. 내 'Union Vector4'를 완성하면 더욱 재미있게 될 것입니다. : D – Andhera