[問題] 存取發生錯誤

看板C_and_CPP (C/C++)作者 (Sony)時間16年前 (2010/03/18 00:27), 編輯推噓4(4018)
留言22則, 2人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 無法評估運算式 存取發生違規 希望得到的正確結果: 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) c++ 2008 有問題的code: (請善用置底文標色功能) printf("%d", *wDeck[i].num); 補充說明: 完整程式碼http://filedeck.net/files/10BVY1TL/main.cpp 主要程式碼: struct card { const char *face; const char *suit; int *num;//判斷牌型儲存位置 }; //發三張 看是雜牌 對子 三條 void dete(Card * const wDeck) { int i = 0 , j ,n=0; int num[52] = {0};//計算總數 int tempn = 0;//儲存第一次的計算總數 int times = 0;//計算迴圈跑的次數(發幾張牌 下一輪) const char* temp = wDeck[i].face; while(1){ for(i=n ; i < i+2 && i < 52 ; i++){//三張一輪 直到不足牌停止 const char* temp = wDeck[i].face;//第一張數值儲存下來 以便比較 for(j=i+1 ; j < i+2 && j<52 ; j++){ if(temp == wDeck[j].face){//數值相等 代表對子 總數加一 num[i]++; } } if(times>=1){//三張一輪迴 所以比較第一次不用比 if(num[i-1] > num[i]){//總數變小時 儲存 num[i] = num[i-1]; } } wDeck[i].num = &num[i];//紀錄相同張數 times++; if(times == 2){//比完一輪換下一輪 break; } } n=n+3; if(n>51){ n=51; } times = 0; if(i >51) //發完結束 break; } //印出函式 void deal( const Card * const wDeck ) { int i; for ( i = 0; i <= 51; i++ ){ printf( "%d \t %5s of %-8s%c ", i+1, wDeck[ i ].face, /*本來形態是指標 印出來不是位置嗎*/ 為什麼前面不用加* EX:*wDeck[i].face wDeck[ i ].suit, '\n'); printf("%d", *wDeck[i].num); /* 有問題程式碼 執行到i=5時 存取違規 本來*wDeck[i].num印出來的應該是 dete()函式的num[]阿(紀錄幾次相等的 以判斷牌型) 結果不是 */ } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.214.56

03/18 00:36, , 1F
綠字: face本身是char*型態, %s本來就是對應char*或
03/18 00:36, 1F

03/18 00:37, , 2F
char []都可以, 你*它會變成char; 想想假如有這個
03/18 00:37, 2F

03/18 00:38, , 3F
char str[]="test"; char *prt=str; // 或&str[0]
03/18 00:38, 3F

03/18 00:38, , 4F
str與ptr是不是都可以用%s給printf印出來:)
03/18 00:38, 4F

03/18 00:41, , 5F
喔喔 謝謝
03/18 00:41, 5F

03/18 00:42, , 6F
紅字: 所有wDeck[].num都肯定被設到嗎?? 置底貼code網頁
03/18 00:42, 6F

03/18 00:43, , 7F
比較方便懶得下免空orz 加()寫*(wDeck[i].num)呢?
03/18 00:43, 7F

03/18 00:44, , 8F
話說, 一般正常情況 i < i+2 肯定成立吧??
03/18 00:44, 8F

03/18 00:45, , 9F
不對我錯了, 這是置底十誡之六的問題....-_-||
03/18 00:45, 9F

03/18 00:46, , 10F
有寫過了*(wDeck[i].num) 一樣耶
03/18 00:46, 10F

03/18 00:54, , 11F
十誡講的char套用到int也是嗎? 還有那解決方法?
03/18 00:54, 11F

03/18 00:58, , 12F
套到什麼type都一樣, 讀懂它的觀念就不會有這個問題了XD
03/18 00:58, 12F

03/18 00:59, , 13F
方法有很多, 你可以自己想想的; 把num[]從caller傳入,
03/18 00:59, 13F

03/18 01:00, , 14F
全域變數, static變數, 動態配置num[]; 不過最重要的是,
03/18 01:00, 14F

03/18 01:01, , 15F
我不懂你為什麼不直接存num[i]的值就好要存address?_?
03/18 01:01, 15F

03/18 01:08, , 16F
num[i]的話 那要用int 套到另一個函數不是讀不到嗎
03/18 01:08, 16F

03/18 01:08, , 17F
所以才用指標
03/18 01:08, 17F

03/18 01:15, , 18F
請仔細看懂十誡之六, int num[52]在離開dete()以後就沒
03/18 01:15, 18F

03/18 01:16, , 19F
了, 你用指標才是錯的; 相對的直接把值存起來至少
03/18 01:16, 19F

03/18 01:16, , 20F
wDeck[i]可以用num直接記住值; 只是我不確定這樣做符不
03/18 01:16, 20F

03/18 01:17, , 21F
符合你的需要; 總之你得自己想/搞/寫清楚程式要做什麼:)
03/18 01:17, 21F

03/18 01:18, , 22F
想在不同函數share資料, 方法在上一段推文都寫過了@_@"
03/18 01:18, 22F
文章代碼(AID): #1BeGBTSv (C_and_CPP)
文章代碼(AID): #1BeGBTSv (C_and_CPP)