Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将简单指针强制转换为固定大小的多维数组?_C++_C_Casting_Multidimensional Array_Matrix - Fatal编程技术网

C++ 如何将简单指针强制转换为固定大小的多维数组?

C++ 如何将简单指针强制转换为固定大小的多维数组?,c++,c,casting,multidimensional-array,matrix,C++,C,Casting,Multidimensional Array,Matrix,我有一个函数,它接受指向浮点数组的指针。根据其他条件,我知道指针实际上指向2x2或3x3矩阵。(事实上,内存最初是这样分配的,例如float M[2][2])重要的是我想在函数体中做这个决定,而不是作为函数参数 void calcMatrix( int face, float * matrixReturnAsArray ) { // Here, I would much rather work in natural matrix notation if( is2x2 )

我有一个函数,它接受指向浮点数组的指针。根据其他条件,我知道指针实际上指向2x2或3x3矩阵。(事实上,内存最初是这样分配的,例如float M[2][2])重要的是我想在函数体中做这个决定,而不是作为函数参数

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...
    }

}

我知道我可以使用模板和其他技术来更好地解决这个问题。我的问题真的是关于如何在#######评论中扮演这样的角色。在C++中,

这种类型的铸件总是更干净,更容易处理,明智地使用TyBuff::/P>
float (*somethingAsMatrix)[2] = (float (*)[2]) matrixReturnAsArray;
typedef float Matrix_t[2][2];

Matrix_t* someThingAsMatrix = (Matrix_t*) matrixReturnAsArray;

如果这是C++而不是C,那么,你应该创建一个矩阵类。(或者更好的是,寻找一个开源的。

float*
可以指向一个float数组的第一个元素,应该重新解释为该数组类型。该转换的结果可能指向一个
float[][]
的第一个元素,因此应该将其重新解释为该类型,依此类推。你应该能够创作这样的演员阵容,并且直接去做

float (&arr)[2][2] = *reinterpret_cast<float (*)[2][2]>(matrixReturnAsArray);
给定
浮点arr[2][2]据我所知,没有任何东西可以保证
&arr[0][1]+1
&arr[1][0]
相同。因此,尽管可以通过执行
f[i*width+j]
将一维数组用作多维数组,但不能将多维数组视为一维数组

最好使用C++的编译时类型安全性,而不是仅仅依赖于不意外地传递错误的东西或执行错误的重新解释转换。要使用原始数组获得类型安全性,应使用对所需原始数组类型的引用:

void foo(float (&f)[2][2]) {}
void foo(float (&f)[3][3]) {}
如果要按值传递数组,则不能使用原始数组,而应使用类似std::array的内容:

void foo(std::array<std::array<float,2>,2> f) {}
void foo(std::array<std::array<float,3>,3> f) {}
voidfoo(std::array f){
voidfoo(std::数组f){}

我认为您试图解决的问题是错误的(例如,“如何施放?”很少是正确的问题)。我曾经为“如何轻松使用多维数组?”这个问题写过一个简单的解决方案:
float*
不可能指向多维的任何东西(除非你不应该做的非常糟糕的强制转换,如果编译器允许的话,我会感到惊讶)。
float*
指向一个float,它可能是一维float数组中的第一个值。但它不指向任何子数组,因为您需要多维数组。2x2和3x3都是二维的,所以都可以是
float**
。实际上,创建(或查找)并使用专用的
Matrix
类会更好。但是你的意思是,在aMDarray[3][3]的情况下,元素的存储不能保证是连续的吗?@DragoonWraith:对不起,你错了<代码>浮动a[2][2]
float**
@DragoonWraith不兼容:但这仍然是错误的<代码>浮动a[2][2]仍然是一个连续存储的
浮点
的单一序列,但编译器提供了二维地址计算。然后可以编写
float*p=&a[0][0]并自己进行索引计算。谢谢。现在这当然有效了。我只是想澄清一下,我是否对声明案例中元素的保证连续排列有一个误解,即aMDarray[3][3]@NoahR:这是连续的,与您建议的用法兼容。我尝试过这种技术,Mac OS X C++编译器说:“代码>错误:从不兼容类型‘双(*)[LDN]’< /代码>分配给‘双(*)[LDN]”。请注意,这两种报告类型是相同的!那么,为什么它们不可分配呢?我的代码看起来像这个
double(*F)[LDN];F=(双(*)[LDN])AF我还尝试在声明中初始化,并得到一条类似的错误消息。@Jason也许你的编译器坏了?如果你能提供你遇到麻烦的完整代码,那就值得问一个单独的问题。为什么这样做?是否有关于此强制转换以及混合指针和数组表示法的类型的清晰文档?ThxUse someThingAsMatrix[1][1]=2.0f;给出:将“float”赋值给“float[2]”Typedef时不兼容的类型仍然有用,但您需要:
Typedef float MatrixRow[2];MatrixRow*someThingAsMatrix=(MatrixRow*)matrixReturnAsArray
相当于ecatmur的答案。
sizeof(t[N])
是否保证准确地
N*sizeof(t)
?我知道标准中有一个非规范性注释提到了这一点。如果您能找到任何规范性的内容,请让我知道。5.3.3p2直接说明这是必需的。在我看来是规范的(不是在“注释”中”)“当应用于数组时,结果是数组中的总字节数。这意味着由n个元素组成的数组的大小是元素大小的n倍。”问题是,我没有看到任何实际上禁止数组在末尾包含额外空间的内容。据说它是“隐含”的,但我不知道怎么做。如果没有其他内容的话,该行禁止在数组末尾填充,因为该行是规范性的。
void foo(std::array<std::array<float,2>,2> f) {}
void foo(std::array<std::array<float,3>,3> f) {}