将指向 int 数组的指针传递给成员函数,错误:数组下标的类型"int[int]"无效



好的,我对编程和 c++ 相当陌生,所以请放轻松。我正在尝试编写一个程序,该程序可以采用金属板的尺寸进行二维有限元方法分析(厚度忽略)。因此,我为我的零件(板)、网格的元素和元素的节点创建了一个类。网格将由方形元素组成,并将应用于板的正面。现在,我正在努力在继续处理元素和节点类之前整理网格。

我正在使用(或想要使用)动态分配来创建包含网格元素的二维数组(我的网格)。我正在尝试编写一个函数"meshingPart"来创建 2-D 数组,行数是板的高度,列是板的长度。

当我运行该程序时,我收到这些错误,但不确定如何解决它们:

In member function 'void PartClass::meshingPart(int&, int, int)':
error: invalid types 'int[int]' for array subscript
At global scope:
error: expected constructor, destructor, or type conversion before '(' token

另外,当我使用 printPart() 函数时,它会打印指针的地址或数组的值吗?我对此并不完全确定,我也是指针的新手。

任何帮助将不胜感激!提前谢谢。

class PartClass
{
private:
const int HEIGHT; // mm
const int LENGTH; // mm
const int WIDTH;  // mm
const int SEED;   // mm
const int MESHROW; 
const int MESHCOL;
int *partMesh; // Mesh array - an int pointer

// Creates the mesh for the part by generating elements to fill the width and length 
// of the part. The elements are stored in a 2-D array. 
void meshingPart(const int &partMesh, int inRow, int inCol);

public:
// Constructs a part with the given parameters, seeds the part for the mesh, 
// then creates the mesh by generating square elements with length = height = SEED. 
PartClass(int inHeight, int inLength, int inWidth, int inSeed);
void printPart()
{
cout << "Part mesh:" << *partMesh << endl;
}
};
class ElementClass
{
private:
int elemID;
static int numElems;
// Shape functions:
int N1;
int N2;
int N3;
int N4;

public:
// Default constructor
ElementClass()
{
elemID = numElems;
numElems++;
};
};
PartClass :: PartClass(inHeight, inLength, inWidth, inSeed)
{
HEIGHT = inHeight;
LENGTH = inLength;
WIDTH = inWidth;
SEED = inSeed;
MESHROW = HEIGHT/SEED; 
MESHCOL = LENGTH/SEED; 
// Dynamically declares an array, gets memory, assigns address to partMesh.
partMesh = new int[MESHROW][MESHCOL]; 
meshingPart(&partMesh, MESHROW, MESHCOL);
}

void PartClass :: meshingPart(int &partMesh, int inRow, int inCol)
{ 

for( int i; i < inRow; i++)
{
for( int j; j < inCol; j++)
{
partMesh[i][j] = ElementClass();
}
}
}

显示的代码存在多个问题,而不是一个问题。必须修复所有问题才能解决所有编译错误。

void PartClass :: meshingPart(int &partMesh, int inRow, int inCol)

此类方法的第一个参数声明为对单个孤独int的引用。它不是一个数组,因此此类方法中的代码将其视为数组会使您的C++编译器非常非常难过。

int *partMesh; //
partMesh = new int[MESHROW][MESHCOL]; 

partMesh声明为指向int的指针。new表达式有效地生成指向MESHCOL整数数组的指针。在C++中,不能将指向数组的指针转换为不同类型的指针。

此外,此处显示的任何内容都不需要首先使用newpartMesh可以只是std::vector<vector<int>>new被战略resize()所取代。作为额外的奖励,您的C++程序将在不再需要时自动删除所有这些内存,不会泄漏它,并在需要时实现正确的复制/移动语义!

meshingPart(&partMesh, MESHROW, MESHCOL);

正如我们所总结的,函数的第一个参数是对数组的引用。将指向int的指针的地址传递给它也将不起作用。

此外,由于partMesh是同一类的成员,因此在类中具有一个函数以某种形式将同一类的成员传递给另一个类方法,无论如何都可以实现绝对有用的。由于它是同一类的成员,因此不需要传递,因此类方法可以直接访问它。毕竟,这就是课程的全部意义所在。

结语:

  1. C++类型系统有几个问题导致这些编译错误。

  2. 这里甚至没有必要使用new来初始化指针,要么需要调整其类型以反映它是指向 2D 数组的指针,要么需要调整new语句本身以分配一维数组,因为这是C++唯一允许您转换为普通指针的东西。即使这样也是过分的,因为std::vector会自己处理所有这些讨厌的细节。

  3. 甚至没有必要将同一类
  4. 的成员传递给同一类的方法,作为参数,只需让类方法直接访问它即可。

  5. 很明显,生成所显示代码的可能过程是完整地编写它,并且仅在编写整个内容后尝试编译。每当使用这种方法时,几乎可以保证会出现大量的编译错误。通过一次只写几行来编写一个大型程序,测试它们,确保它们正常工作,然后再写几行,效率要高得多。这样,需要修复的错误数量将保持相当小且易于管理。

最新更新