Passing a pointer to an int array to a member function, error: invalid types 'int[int]' for array subscript
Passing a pointer to an int array to a member function, error: invalid types 'int[int]' for array subscript
好的,我对编程和 C++ 还很陌生,所以请放轻松。我正在尝试编写一个程序,该程序采用金属板的尺寸进行二维有限元法分析(忽略厚度)。因此,我为我的零件(板)、网格元素和元素节点创建了一个 class。网格将由方形元素组成,并将应用于板的正面。现在,我正在努力整理网格,然后再继续处理元素和节点 classes.
我正在使用(或想要使用)动态分配来创建一个包含网格元素的二维数组(我的网格)。我正在尝试编写一个函数“meshingPart”来创建二维数组,其中行数是板的高度,列数是板的长度。
当我 运行 程序时,我遇到了这些错误,但我不确定如何修复它们:
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)
此 class 方法的第一个参数声明为对单个孤独 int
的引用。它不是数组,因此 class 方法中将其视为数组的代码会使您的 C++ 编译器非常非常难过。
int *partMesh; //
partMesh = new int[MESHROW][MESHCOL];
partMesh
声明为指向 int
的指针。 new
表达式有效地生成指向 MESHCOL
整数数组的指针。在 C++ 中,您不能将指向数组的指针转换为不同类型的指针。
此外,此处显示的任何内容都不需要首先使用 new
。 partMesh
可以简单地是 std::vector<vector<int>>
,new
可以替换为战略 resize()
。作为额外的奖励,您的 C++ 程序将在不再需要时自动删除所有这些内存,不会泄漏它,并且还会在需要时实现正确的 copy/move 语义!
meshingPart(&partMesh, MESHROW, MESHCOL);
正如我们得出的结论,函数的第一个参数是对数组的引用。将指向 int
的指针的地址传递给它也不起作用。
此外,由于 partMesh
是同一 class 的成员,因此在 class 通道中具有一个功能,以某种形式,是同一 [=61= 的成员] 到另一个 class 方法完成绝对有用,无论如何。由于它是同一个 class 的成员,因此不需要传递, class 方法可以直接访问它。毕竟,这就是 classes 的意义所在。
结论:
导致这些编译错误的 C++ 类型系统有几个问题。
这里甚至没有必要使用 new
来初始化指针,并且需要调整其类型以反映它是指向二维数组的指针,或者new
语句本身需要调整以分配一维数组,因为这是 C++ 唯一允许您转换为普通指针的东西。甚至那也是过度设计的,因为 std::vector
会自行处理所有这些讨厌的细节。
甚至不需要将同一个class的成员传递给同一个class的方法,作为参数,只需要class 方法直接访问它。
很明显,生成所示代码的可能过程是将其完整编写,并且仅在编写完整代码后才尝试编译。每当使用这种方法时,几乎肯定会出现大量编译错误。一次只写几行,测试它们,确保它们正常工作,然后才再写几行,从而编写大型程序的效率要高得多。这样一来,需要修复的错误数量就会非常少,并且易于管理。
好的,我对编程和 C++ 还很陌生,所以请放轻松。我正在尝试编写一个程序,该程序采用金属板的尺寸进行二维有限元法分析(忽略厚度)。因此,我为我的零件(板)、网格元素和元素节点创建了一个 class。网格将由方形元素组成,并将应用于板的正面。现在,我正在努力整理网格,然后再继续处理元素和节点 classes.
我正在使用(或想要使用)动态分配来创建一个包含网格元素的二维数组(我的网格)。我正在尝试编写一个函数“meshingPart”来创建二维数组,其中行数是板的高度,列数是板的长度。
当我 运行 程序时,我遇到了这些错误,但我不确定如何修复它们:
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)
此 class 方法的第一个参数声明为对单个孤独 int
的引用。它不是数组,因此 class 方法中将其视为数组的代码会使您的 C++ 编译器非常非常难过。
int *partMesh; //
partMesh = new int[MESHROW][MESHCOL];
partMesh
声明为指向 int
的指针。 new
表达式有效地生成指向 MESHCOL
整数数组的指针。在 C++ 中,您不能将指向数组的指针转换为不同类型的指针。
此外,此处显示的任何内容都不需要首先使用 new
。 partMesh
可以简单地是 std::vector<vector<int>>
,new
可以替换为战略 resize()
。作为额外的奖励,您的 C++ 程序将在不再需要时自动删除所有这些内存,不会泄漏它,并且还会在需要时实现正确的 copy/move 语义!
meshingPart(&partMesh, MESHROW, MESHCOL);
正如我们得出的结论,函数的第一个参数是对数组的引用。将指向 int
的指针的地址传递给它也不起作用。
此外,由于 partMesh
是同一 class 的成员,因此在 class 通道中具有一个功能,以某种形式,是同一 [=61= 的成员] 到另一个 class 方法完成绝对有用,无论如何。由于它是同一个 class 的成员,因此不需要传递, class 方法可以直接访问它。毕竟,这就是 classes 的意义所在。
结论:
导致这些编译错误的 C++ 类型系统有几个问题。
这里甚至没有必要使用
new
来初始化指针,并且需要调整其类型以反映它是指向二维数组的指针,或者new
语句本身需要调整以分配一维数组,因为这是 C++ 唯一允许您转换为普通指针的东西。甚至那也是过度设计的,因为std::vector
会自行处理所有这些讨厌的细节。甚至不需要将同一个class的成员传递给同一个class的方法,作为参数,只需要class 方法直接访问它。
很明显,生成所示代码的可能过程是将其完整编写,并且仅在编写完整代码后才尝试编译。每当使用这种方法时,几乎肯定会出现大量编译错误。一次只写几行,测试它们,确保它们正常工作,然后才再写几行,从而编写大型程序的效率要高得多。这样一来,需要修复的错误数量就会非常少,并且易于管理。