看板 C_and_CPP 關於我們 聯絡資訊
C 問題(Question): 小的最近初學C語言 在寫程式時遇到了十分不理解的地方 希望有大大可以為小的指點迷津 謝謝 http://ideone.com/zAvKns 我覺得我在做和這個網頁的程式碼一樣的事 我希望我能在函式Y改變函式X傳入的struct內data的值 而這個程式碼顯示的結果也的確是傳入的task.t與task->t 記憶體位址相同&&值也成功的被改變了 http://ideone.com/Uul86Q 這是小的現在在寫的程式(未完成) 問題: 我在第265行的函式Display中宣告了Struct Player A 並在第331行將&A傳入函式Getcard (Getcard的接收型態為 Player *A) 但是問題來了 我這樣子的傳入1. 傳入後的 printf %p A->Case 與 傳入前的 printf %p &A.Case 記憶體位址不同 && 我在Getcard改變A->Case為1 但是在Display A.Case仍為0 想請問為什麼呢 ? 我以為我是在做和第一個網址的程式碼一樣的傳址法 但是當我實際在我想寫的程式裡使用時 傳入的址卻與原本的址不同&&無法直接對地址 裡的儲存值做改變(我希望在Getcard值的改變也會直接改變在Display的值) http://tinyurl.com/lsb7yg6 此外還有一個小小的問題是我在程式碼第14-24行的宣告方式 (我要printf出牌組) 本來K後面是沒有" "的 我知道我的陣列宣告也只有13個(雖然現在compiler沒問題) 不知道為什麼 我的最後一張牌梅花K會printf不出來(printf出來K的地方會變成 我在很遠的地方的printf"Shuttle" 的Shuttle!) 感覺完全風馬牛不相關(剛剛測試不管有沒有多那個" " 都一樣) (意思是原本printf應該是 梅花 K 卻變成 梅花 Shuttle! 請問為什麼會這樣呢?) http://tinyurl.com/l449ogc http://tinyurl.com/k354rxv 附圖說明~(只有最後一張梅花K會有圖1的結果 其他牌都正常) 謝謝大家~ 初學者首po 如果有違反版規什麼的請告知...謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.168.68.183 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416555053.A.76C.html ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:33:18 ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:44:41 ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:49:39 ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:50:23 ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:51:17
allyusd: 我整理了程式碼,http://ideone.com/YEKS6011/21 16:43
allyusd: 可以直接在 ideone 執行,但是沒有解決你任何問題11/21 16:44
allyusd: 傳址看起來是正確的,K 後面多餘的刪除了。11/21 16:45
allyusd: 也許你需要提供一下 開發平台(Platform) 相關資訊?11/21 16:46
謝謝您 ! 請問一下是怎麼整理的呀 像我知道JAVA Eclipse 可以ctrl+F 抱歉其實我不知道開發平台是什麼 是作業系統或是IDE嗎? 是WIN7 Dev5.8.2 ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 16:47:35
allyusd: 我說的整理實際是把多餘的 code 註解掉啦 XD11/21 16:55
allyusd: 我用 VS 2013 測試,沒用過 Dev,請其它人幫忙看看吧11/21 16:56
好的~謝謝大大 請問您用VS2013也會跟我一樣沒辦法做修改嗎? 像我在Getcard的 229.237.245行讓a->Case = 1; 然後return; 跳回330行 但是331行卻不會執行.(printf過問題如上方所述 Getcard中為1 函式結束回來仍是0) (我確定test時有跳進三個if的其中之一,上方敘述都有做~就是存值存不進原本的a.Case) 此外繼續做下方電腦得牌(Player B)時 電腦的point也進不去(都是printf出0.0) 但是我前方Player A一樣的寫法 Point卻可以被做修改 為什麼會這樣啊QQ ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 16:59:45 ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 17:01:13 ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 17:04:54
allyusd: 沒有耶,我測試的結果一切正常,所以沒辦法幫你11/21 17:17
allyusd: 對了,我有對 scanf 做了修改,不知道有沒有影響11/21 17:18
我剛剛嘗試抓新的IDE (CODE BLOCK) 結果可以了=___= 這是IDE的問題的意思嗎QAQ ※ 編輯: defsrisars (1.168.68.183), 11/21/2014 17:32:12
carylorrk: 的確有可能是 Compiler 太舊的問題~11/21 18:58
好的嗚嗚
KoenigseggG: Orwell Dev-C++?11/22 00:15
是的~ 我以後學習使用code block好了= = 11/22 09:18
LPH66: 我仔細看了一下, 你在 Getcard 裡讀輸入的方法很危險11/22 09:31
LPH66: temp 只有一個字元的大小, 你卻讀一個 %s 進去11/22 09:31
LPH66: 這代表一定有什麼東西被讀進來的"字串"的結尾'\0'給吃掉了11/22 09:32
LPH66: 你要不要改用 %c 或是把 temp 改宣告成字串試試看?11/22 09:33
LPH66: (雖然這跟你原來的問題似乎無關就是了)11/22 09:33
謝謝大大~~ 這個問題我後來也真的遇到了 不知道為什麼這個scanf的動作 會影響到我紀錄戰績的array 我de了很久才發現 我的array一開始都有被存進W或L 一到那個scanf &temp 我的array就會被清空變成NULL 後來我爬文改用getchar(因為改%c也是遇到回車鍵問題) 一開始一樣又遇到 getchar(temp)被跳過 再爬文改寫成 getchar(); //這個好像是用來接回車鍵的 getchar(temp); 才成功 感謝大大的提出~ 另外請問我原題目問的傳址寫法會很危險嗎? 因為我覺得函式回傳很綁手綁腳 所以我都傾向傳指標進去直接做修改 話說有人知道第二個問題怎麼辦嗎QAQ 最後一張牌的bug我還是de不掉QAQ ※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:38:31 ※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:40:29 ※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:44:39
LPH66: 嗯, 這邊就是被那個'\0'蓋掉的就是你那個陣列11/22 09:44
是因為記憶體存放的關係嗎 為什麼temp的\0會蓋到陣列裡的值呀 ※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:45:29
LPH66: 至於傳址的部份我稍微看了一下應該是沒什麼問題11/22 09:45
LPH66: 或者該說這種做法在 C 裡很普遍所以會有問題我也覺得很怪..11/22 09:46
LPH66: >修文問題 確實是編譯器對變數存放位置的關係11/22 09:47
LPH66: 除非你深入追下去不然不會知道編譯器怎麼排的11/22 09:47
LPH66: 所以最正確的做法就是不要超界11/22 09:48
好的~ 謝謝您的回覆 因為我還很蔡逼八QAQ 所以都是想到什麼寫什麼 (像這個10點半應該有更簡潔有力的寫法) 然後很多寫的方式自己都不知道好不好或是正不正確、危不危險 有些地方也是爬文跟著寫其實自己也不太懂 像牌組的洗牌跟第二個問題的地方就不是我的想法 最怕的還是自己不知不覺用了很危險的寫法吧XD 那請問code block好嗎? 我只知道Dev很舊= = ※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:52:21
n91324: 去抓mingw 用GNU最新的編譯器11/22 16:18
好的 謝謝大大給我方向 我去研究一下 ※ 編輯: defsrisars (1.168.68.183), 11/22/2014 16:40:10
KoenigseggG: dev很舊,但Orwell dev應該很新吧0.0 11/22 21:16
KoenigseggG: 前幾天才出最新版而已 11/22 21:16
我也是這樣想的 所以才都用新版的Orwell (學校都還在4.9.2 我也都用隨身碟帶免安裝去寫 沒想到5.8.2了還是遇到問題1的問題 換code block也真的就好了 哭哭 ※ 編輯: defsrisars (1.168.68.183), 11/23/2014 02:10:36
KoenigseggG: 嗯嗯 加油XD 11/23 10:29