gpt4 book ai didi

c++ - 无法将 int *(*)[] 转换为 int(**)[]

转载 作者:行者123 更新时间:2023-11-30 03:43:12 24 4
gpt4 key购买 nike

int main()
{
int j;
std::cin >> i >> j;
int (**ptr)[1];
ptr = new (int*[i][1]);//error
for (int index = 0;index < i;++index)
ptr[index] = new (int[j][1]);
}

我有一个编译器错误。

那么,如何分配int(**)[]呢?

最佳答案

问题。

原始代码,除了我添加了缺少的 #include 指令 - 为避免对您的代码的错误猜测,以及正在讨论的不相关问题,请将所有内容包含在发布代码:

#include <iostream>
int main()
{
int j;
std::cin >> i >> j;
int (**ptr)[1];
ptr = new (int*[i][1]);//error
for (int index = 0;index < i;++index)
ptr[index] = new (int[j][1]);
}

使用 MinGW g++ 5.1.0 编译:

C:\my\forums\so\116> g++ --version | find "++"g++ (tdm64-1) 5.1.0C:\my\forums\so\116> g++ original.cpporiginal.cpp: In function 'int main()':original.cpp:5:17: error: 'i' was not declared in this scope     std::cin >> i >> j;                 ^original.cpp:9:35: error: ISO C++ forbids variable length array [-Wvla]         ptr[index] = new (int[j][1]);                                   ^original.cpp:9:36: error: non-constant array new length must be specified without parentheses around the type-id [-Wvla]         ptr[index] = new (int[j][1]);                                    ^C:\my\forums\so\116> _

That compiler detected the following problems:

  • Missing declaration of variable i.

  • Inadvertent use of C99 variable length array, VLA, due to syntactical error.

Compiling with Visual C++ 2015 update 2:

C:\my\forums\so\116> cl /nologo- 2>&1 | find "++"Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23725 for x86C:\my\forums\so\116> cl original.cpporiginal.cpporiginal.cpp(5): error C2065: 'i': undeclared identifieroriginal.cpp(7): error C2065: 'i': undeclared identifieroriginal.cpp(7): error C2440: '=': cannot convert from 'int *(*)[1]' to 'int (**)[1]'original.cpp(7): note: Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style castoriginal.cpp(8): error C2065: 'i': undeclared identifierC:\my\forums\so\116> _

This compiler doesn't support C99 VLAs, and so instead diagnoses

  • Incompatible types in pointer assignment.

Apparently this is the error message the OP is concerned about, but the OP reported it as

cannot cast int ()[] to int(**)[]

which is meaningless because one can indeed cast between data pointer types.

So,

  • The error description in the question is incorrect.

  • The code has issues (lacking include, lacking variable declaration) in addition to the error singled out by the OP.

  • It's unclear what the code is meant to do, except in a very abstract sense that allowed advice such as “use a std::vector”.

However, the code snippet

for (int index = 0;index < i;++index)
ptr[index] = new (int[j][1]);

强烈表示这是尝试创建一个int值的动态大小矩阵(二维数组),其维度由用户,我假设在下面。


修复原始代码。

它通常有助于命名事物。在这种情况下,为了清楚起见,我们可以将 int* 类型命名为 Int_array_ptr。这表明了预期的用途:不是作为指向单个 int 的指针,而是作为指向 int 数组的第一项的指针,即作为指向数组的指针.

#include <iostream>
int main()
{
int n_rows;
int n_columns;
std::cin >> n_rows >> n_columns;

using Int_array_ptr = int*;
Int_array_ptr* matrix;
matrix = new Int_array_ptr[n_rows]; // An array of `n_rows` pointers.
for( int i = 0; i < n_rows; ++i )
{
matrix[i] = new int[n_columns](); // The `()` adds zero-initialization.
}

// At this point one can use it like `matrix[row][column] = 42`.
}

生成的结构称为锯齿状数组,因为它允许列 vector 具有不同的长度(这里它们的长度都相同)。


一般如何做矩阵。

矩阵作为锯齿状数组的一个很好的替代方法是使用单个连续的一维数组作为存储,并且只提供对该数组的二维索引。

管理数组存储的一个好方法是使用 std::vector

封装索引操作和其他数组内容(或公共(public)状态上的大多数相关操作集)的一个好方法是定义一个类。

因此,这强烈建议定义一个类,该类在存储由 std::vector 管理的单个一维数组上提供二维索引操作。

索引最好是通过 operator[],但作为一个成员操作,它只能接受 1 个参数。写例如matrix[Location(3,58)] 而不是理想的 matrix[3,58](将被解析为使用逗号表达式)。因此,通常使用函数调用运算符 operator() 代替 []

可以改为支持符号 matrix[3][58],但让我们选择概念上更简单的 operator() 实现:

#include <iostream>
#include <vector>
#include <stdlib.h> // EXIT_FAILURE
using namespace std;

class Matrix
{
private:
vector<int> items_;
int n_columns_;

auto index_of( int const row, int const col ) const
-> int
{ return row*n_columns_ + col; }

public:
auto operator()( int const row, int const col )
-> int&
{ return items_[index_of( row, col )]; }

auto operator()( int const row, int const col ) const
-> int
{ return items_[index_of( row, col )]; }

Matrix( int const n_rows, int const n_columns )
: items_( n_rows*n_columns )
, n_columns_( n_columns )
{}
};

auto main() -> int
{
int n_rows;
int n_columns;
std::cin >> n_rows >> n_columns;
if( cin.fail() ) { return EXIT_FAILURE; }

Matrix matrix( n_rows, n_columns );
// At this point one can use it like `matrix( row, column ) = 42`.
}

这比原来的代码多了很多,但是

  • 它是可重用的代码,可以节省工作量,

  • 它是更健壮的代码,困难的事情(内存管理)是自动化的,并且

  • 它甚至可以更高效,因为它使用单个动态分配进行管理。

关于c++ - 无法将 int *(*)[] 转换为 int(**)[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36274871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com