ATTRIBUTES* addRelation(char*,char*,ATTRIBUTES*);
void nattr(ATTRIBUTES*);
void tuplelen(ATTRIBUTES*);
void infattr(char*,ATTRIBUTES*);
void addValues(ATTRIBUTES*,char*);
int count(VALUES*);
void project(ATTRIBUTES*,char*);
void select(char*,char*,char*,ATTRIBUTES*);
int inStringArray(char*[][],int,char*);
我不断收到此错误,如果在Array中包含一个值会使我的程序出错,我感到困惑。
我也有此错误,但我的语法正确。我没有正确编译该头文件吗?
我一直在用gcc
最佳答案
此类错误通常是由缺少(完整)声明引起的。换句话说:由于前向声明,您的一种类型是已知的,但是编译器不知道该类型的实际结构(这使得无法知道该数组或其元素之一的长度)。
类似以下内容应导致相同的错误:
struct Data;
Data myData[50]; // The compiler doesn't know how much data is needed
要解决此问题,您必须包括适当的头文件或添加完整的声明(确保不重复定义):
struct Data; // This line is now obsolete in this simple example
struct Data {
int someInteger;
};
Data myData[50]; // The compiler now knows this is essentially 50 integers (+padding)
没有注意到它不仅在抱怨
incomplete type
,还在抱怨incomplete element type
。从本质上讲,这意味着C++无法确定多维数组的大小。
如果要定义或传递n维数组,则必须记住,只允许使用一维可变长度的维(因为否则编译器将无法确定正确的大小)。简而言之,最多只能出现一次
[]
。这里有些例子:
void doSomething(int args[]) {
// 1 dimension, every element is the length of one integer
args[0]; // this is the first integer
args[1]; // this is the second integer (offset is args + sizeof(int))
}
void doSomething(int args[][2]) {
// 2 dimensions, every element is the length of two integers
args[0]; // this is the first set of integers
args[1]; // this is the second set (offset is args + sizeof(int[2]))
}
void doSomething(int args[][]) {
// 2 dimensions, no idea how long an element is
args[0]; // this is the first set of integers
args[1]; // this is the second set (offset is args + sizeof(int[])... oops? how long is that?)
}
作为一种解决方法,您可以仅传递指针,并隐藏拥有数组的事实(因为已知指针的长度)。唯一的缺点是,编译器将不再知道您确实在传递数组而不是单个值(通过引用)。
void doSomething(int args*[]) {
// 2 dimensions, set of integers
args[0]; // this is the first set of integers
args[1]; // this is the second set (offset is args + sizeof(int*))
}
所以回到您的实际问题:
只需更换线
int inStringArray(char*[][],int,char*);
与
int inStringArray(char**[],int,char*);
请记住,您可能还必须更新代码的其他部分,并且要小心,以防在某个地方传递该数组(例如,使用
delete
释放它)。