我对c ++比较陌生,习惯于Java(我更喜欢)。 我这里有一些指针问题。我创建了一个最小程序来模拟更复杂的程序的行为。
这是代码:
void test (int);
void test2(int*);
int* global [5]; //Array of int-pointer
int main(int argc, char** argv) {
int z = 3;
int y = 5;
cin >> z; // get some number
global[0] = &y; // global 0 points on y
test(z); // the corpus delicti
//just printing stuff
cout << global[0]<<endl; //target address in pointer
cout << &global[0]<<endl; //address of pointer
cout << *global[0]<<endl; //target of pointer
return 0; //whatever
}
//function doing random stuff and calling test2
void test (int b){
int i = b*b;
test2(&i);
return;
}
//test2 called by test puts the address of int i (defined in test) into global[0]
void test2(int* j){
global[0]= j;
}
棘手的部分是test2。我将我在test中创建的变量的地址放入全局指针数组中。不幸的是,这个程序给了我一个编译器错误:
main.cpp: In function 'int test(int)':
main.cpp:42:20: error: 'test2' was not declared in this scope
return test2(&i);
^
我在这里找不到任何范围问题。我尝试将测试的int i更改为全局变量,但它没有帮助,所以我想,这不是原因。
编辑:它现在编译,但为cin = 20提供了错误的值。 * global [0]应该是400,但是是2130567168.它似乎不是一个int / uint问题。距离2,14e9太远了。 Edit2:输入值无关紧要。
答案 0 :(得分:3)
'test2' was not declared in this scope
这是因为编译器不知道test2
是什么。你需要在main上面添加一个函数原型。
void test (int b);
void test2(int& j);
或只是:
void test (int);
void test2(int&);
因为此时编译器只需知道参数的类型而不知道它们的名称。
编辑:将函数定义移到main之上而不添加原型也可以,但最好使用原型。
答案 1 :(得分:1)
在调用函数之前,编译器必须知道它。
因此,您要重新排列函数定义,使test2
先到,test
秒和main
最后,或者您放置test2
和test1
的声明在main
之前:
void test2(int& j); // declaration
void test(int b); // declaration
int main(int argc, char** argv) {
// ...
}
void test(int b){ // definition
// ...
}
void test2(int& j) { // definition
// ...
}
这将揭示更严重的错误;您使用test2
致电int*
,但预计会int&
。您可以将呼叫转为test2(i);
。
将函数巧妙地分成声明和定义之后,就可以执行典型C ++源文件管理的下一步:将声明放入头文件(通常是*.h
或*.hpp
)和#include
来自包含*.cpp
的实施文件(通常为main
)。然后为这两个函数定义添加两个实现文件。也在那里添加相应的#include
。不要忘记在标题中包含警戒。
最后,分别编译三个实现文件,并使用链接器从三个结果对象文件中创建可执行文件。
答案 2 :(得分:0)
你需要在调用之前声明test2。每个函数都需要在调用之前声明。
在main上面添加这些行以声明函数;
void test2(int& j);
void test2(int& j);
int main(){...}