作者VictorTom (鬼翼&娃娃鱼)
看板C_and_CPP
标题Re: [问题] 小弟是初学者 看不太懂错误 爬文也不太清楚
时间Wed Nov 25 19:09:23 2009
※ 引述《lO (压力大)》之铭言:
: ( *[1m *[m 为色码,可以按 Ctrl+V 预览会显示的颜色 )
: ( 未必需要依照此格式,文章条理清楚即可 )
: 遇到的问题: (题意请描述清楚)
: [Linker error] undefined reference to `select(int, int, int)'
: ld returned 1 exit status
这个错误讯息告诉你:
Linker找不到一个叫select的函数....
这个函数收了分开的三个int型态的参数....
理由写在後面....
: 希望得到的正确结果:
: 发牌
: 程式跑出来的错误结果:
: 开发平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
: Dex-c++
: 有问题的code: (请善用置底文标色功能)
: #include<stdio.h>
: #include<stdlib.h>
: #include<time.h>
你的子函数(本例为select)实作写在main函数後面时....
compiler先读到main里的"select"这个symbol....
却发现它不认得这东西, 就有可能会跟你argu说找不到select的定义....
不过其实你的main里有宣告select的prototype....
也就是 void select(int, int, int); 这种东西....
所以compiler并没有跟你argu这件事....
但是1F的推文是提醒你这个问题:)
不写prototype的作法, 就是把下面的实作整个搬到main前面....
: int main()
: {
: srand((unsigned)time(NULL));
: int i1,i2,com,player,poker[52],number(int);
: void select(int,int,int),color(int);
第一, 小弟我不太习惯function prototype这样合在一起写....
第二, select的prototype有问题, 後面会一起讲到....
第三, 除非特别需要, 不然function的prototype习惯是放在global scope....
也是main()的前面的意思:)
: for (int k=0;k<=51;k++)
: poker[k]=k;
: select(com,player,poker[52]);
接着来说明上一段第二点的问题, 还有相关延伸的问题....
1. int poker[52]; 代表宣告一个阵列, 大小为52个int....
2. 其他地方直接写poker[52], 代表存取poker阵列的第52个int....
3. 依照你的code逻辑, select function应该是要对整个poker阵列做事....
所以你这样写, 代表把poker[52]当第三个参数传入select()....
然後poker阵列实际上只能存取其中[0~51] // 共52个....
所以这样写会有一个非法的记忆体存取, 或有潜在的问题....
: printf("%d %d",com,player);
: system("pause");
: }
然後问题就发生了, 你的main里宣告的prototype是传三个int....
你的(错误的)函数呼叫也真的传了三个int....
可是实际上你并没有这样的select function的实作....
因为你下面写的实作, 第三个参数是传了int[52]当参数....
於是这个实作其实没有人会呼叫到....
你看到的Linker Error则是在argu说....
main里呼叫的那个select function Linker它找不到....
: void select(int com,int player,int poker[52]) // 发牌的功能
实务上我们比较不会这样传个大小52的阵列进来....
而是把阵列的头的address给传进来....
这就是小弟我一开始推文说的, 把int poker[52]
改成int poker[], 或int *poker的地方....
但是这样做, main里的呼叫就要改成....
select(com,player,poker);
你也可以写成....
select(com,player,&poker[0]);
这样都代表着把poker的起始位址传入....
以下小弟我都没看, 故恕删....
有漏误的也请板上大大指正....<(_ _)>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.134.41.4
1F:推 jimmylin212:函数传递阵列很容易出错.有时候值就不见了 11/26 08:05
2F:→ jimmylin212:精辟的解说!! 11/26 08:05