Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++ 铿锵++;无法初始化类型为';国际(*)[dim2]和#x27;具有类型为';国际(*)[dim2]和#x27;_C++ - Fatal编程技术网

C++ 铿锵++;无法初始化类型为';国际(*)[dim2]和#x27;具有类型为';国际(*)[dim2]和#x27;

C++ 铿锵++;无法初始化类型为';国际(*)[dim2]和#x27;具有类型为';国际(*)[dim2]和#x27;,c++,C++,为什么代码 void fcn(int *twoDArrayPtr, const int dim1, const int dim2) { int (*array)[dim2] = reinterpret_cast<int (*)[dim2]>(twoDArrayPtr); } int main() { return 0; } 类型相同,因此我认为可以执行分配。由于int(*)[dim2]是指向大小为dim2的数组的指针,因此可以是指向可由指针索引的连续内存中大小为d

为什么代码

void fcn(int *twoDArrayPtr, const int dim1, const int dim2) {
    int (*array)[dim2] = reinterpret_cast<int (*)[dim2]>(twoDArrayPtr);
}

int main() {
    return 0;
}
类型相同,因此我认为可以执行分配。由于
int(*)[dim2]
是指向大小为
dim2
的数组的指针,因此可以是指向可由指针索引的连续内存中大小为
dim2
的数组的指针,因此我认为这应该是可行的

我正在Mac OS/X上使用clang++并提供以下版本信息:

Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn) Target: x86_64-apple-darwin14.0.0 Thread model: posix 苹果LLVM版本6.0(clang-600.0.56)(基于LLVM 3.5svn) 目标:x86_64-apple-darwin14.0.0 线程模型:posix

<代码> DIM2不是编译时常数,VLAs(可变长度数组)不存在于C++中。一些其他编译器(例如GCC)具有允许VLAs在C++中的语言扩展,但CLAN的行为是标准一致的。 您可以使用为您进行地址转换的类(或类模板)来解决此问题,例如

// This is very rudimentary, but it's a point to start.
template<typename T>
class array2d_ref {
  public:
    array2d_ref(T *p, std::size_t dim) : data_(p), dim_(dim) { }

    T *operator[](std::size_t i) { return &data_[i * dim_]; }

  private:
    T *data_;
    std::size_t dim_;
};

...

array2d_ref<int> array(twoDArrayPtr, dim2);
//这是非常基本的,但这是一个起点。
模板
类数组2d\u ref{
公众:
array2d_-ref(T*p,std::size_-T dim):数据(p),dim(dim){
T*运算符[](std::size_T i){return&data_[i*dim_]}
私人:
T*数据;
标准:尺寸;
};
...
阵列2d_ref阵列(两个DARRAYPTR,dim2);

但是,除非在编译时知道数组的维数,否则不可能(可方便地)使用数组指针。

<代码>代码DIM2< /COD>不是编译时常数,VLAs(可变长度数组)不存在于C++中。一些其他编译器(例如GCC)具有允许VLAs在C++中的语言扩展,但CLAN的行为是标准一致的。 您可以使用为您进行地址转换的类(或类模板)来解决此问题,例如

// This is very rudimentary, but it's a point to start.
template<typename T>
class array2d_ref {
  public:
    array2d_ref(T *p, std::size_t dim) : data_(p), dim_(dim) { }

    T *operator[](std::size_t i) { return &data_[i * dim_]; }

  private:
    T *data_;
    std::size_t dim_;
};

...

array2d_ref<int> array(twoDArrayPtr, dim2);
//这是非常基本的,但这是一个起点。
模板
类数组2d\u ref{
公众:
array2d_-ref(T*p,std::size_-T dim):数据(p),dim(dim){
T*运算符[](std::size_T i){return&data_[i*dim_]}
私人:
T*数据;
标准:尺寸;
};
...
阵列2d_ref阵列(两个DARRAYPTR,dim2);

但是,除非在编译时知道数组的维数,否则不可能(可方便地)使用数组指针。

<代码>代码DIM2< /COD>不是编译时常数,VLAs(可变长度数组)不存在于C++中。一些其他编译器(例如GCC)具有允许VLAs在C++中的语言扩展,但CLAN的行为是标准一致的。 您可以使用为您进行地址转换的类(或类模板)来解决此问题,例如

// This is very rudimentary, but it's a point to start.
template<typename T>
class array2d_ref {
  public:
    array2d_ref(T *p, std::size_t dim) : data_(p), dim_(dim) { }

    T *operator[](std::size_t i) { return &data_[i * dim_]; }

  private:
    T *data_;
    std::size_t dim_;
};

...

array2d_ref<int> array(twoDArrayPtr, dim2);
//这是非常基本的,但这是一个起点。
模板
类数组2d\u ref{
公众:
array2d_-ref(T*p,std::size_-T dim):数据(p),dim(dim){
T*运算符[](std::size_T i){return&data_[i*dim_]}
私人:
T*数据;
标准:尺寸;
};
...
阵列2d_ref阵列(两个DARRAYPTR,dim2);

但是,除非在编译时知道数组的维数,否则不可能(可方便地)使用数组指针。

<代码>代码DIM2< /COD>不是编译时常数,VLAs(可变长度数组)不存在于C++中。一些其他编译器(例如GCC)具有允许VLAs在C++中的语言扩展,但CLAN的行为是标准一致的。 您可以使用为您进行地址转换的类(或类模板)来解决此问题,例如

// This is very rudimentary, but it's a point to start.
template<typename T>
class array2d_ref {
  public:
    array2d_ref(T *p, std::size_t dim) : data_(p), dim_(dim) { }

    T *operator[](std::size_t i) { return &data_[i * dim_]; }

  private:
    T *data_;
    std::size_t dim_;
};

...

array2d_ref<int> array(twoDArrayPtr, dim2);
//这是非常基本的,但这是一个起点。
模板
类数组2d\u ref{
公众:
array2d_-ref(T*p,std::size_-T dim):数据(p),dim(dim){
T*运算符[](std::size_T i){return&data_[i*dim_]}
私人:
T*数据;
标准:尺寸;
};
...
阵列2d_ref阵列(两个DARRAYPTR,dim2);

但是,除非您在编译时知道数组的维度,否则恐怕不可能(可移植地)拥有指向数组的指针。

当您在cast中使用
dim2
作为数组维度时,您正在尝试使用C99的可变长度数组(VLA)功能。(例如,gcc确实通过扩展支持这一点:)

好消息是,您现在不能这样做,但您很快就能通过引入

相关引用:

运行时大小的数组提供与C99的VLAs相同的语法和性能。。。请记住,运行时大小的阵列与C99的VLA并不完全相同。C++14的特性更具约束性,这也是一样的。具体而言,以下属性被排除在外:

运行时大小的多维数组
  • 对函数声明器语法的修改
  • sizeof(a)
    是一个运行时计算的表达式,返回
  • typedef int a[n]评估
    n
    并通过
    typedef
  • 所以你的代码很快就会合法化,大约是C++14


    我已经在Visual Studio 2015 Beta版上试用过,但遗憾的是,在撰写本文时它不受支持:(

    当您在cast中将
    dim2
    用作数组维度时,您正试图使用C99的可变长度数组(VLA)功能。(例如,gcc通过扩展支持这一点:)

    好消息是,您现在不能这样做,但您很快就能通过引入

    相关引用:

    运行时大小的数组提供与C99的VLA相同的语法和性能…请记住,运行时大小的数组与C99的VLA并不完全相同。C++14功能更受限制,这也是一样的。具体而言,以下属性被排除在外:

    运行时大小的多维数组
  • 对函数声明器语法的修改
  • sizeof(a)
    是一个运行时计算的表达式,返回
  • typedef int a[n];
    评估
    n
    并通过
    typedef