[問題] 優化問題(可能是::類別問題)(記憶體飆高

看板C_and_CPP (C/C++)作者 (扛霸子)時間13年前 (2013/04/08 17:25), 編輯推噓1(1011)
留言12則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Microsoft Visual Studio 2005 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 許多,如有需要再補充 問題(Question): 記憶體飆高,目前有個解決方法,但不適合我要打的程式中 --- 大家好, 我是程式新手,但我不畏懼爬文翻書,但這個問題我不知道從何下手, 希望各位能夠指點我,或是告訴我一些關鍵字或方向, 我手邊有一本Visual C++ 2010 的教學手冊 以下是我遇到的問題(關鍵問題我標記成紅色) (或是看網頁版的:http://ideone.com/mJ5P7p ) 網頁版內容有點差別,但要表達的意思相同 main { for(gen=1;gen<=600;gen++) { 一些演算法(); } 統計等副程式(); 其他東西等... } 一些演算法() { 繁複計算後算出100個sita; for(i=1;i<=100;j++) { 送出sita並給機器人(); } } 送出sita並給機器人() { AL::ALMotionProxy motion("127.0.0.1", 9559); //連線機器人,但很像是類別宣告 AL::ALValue names = AL::ALValue::array("LHipPitch"); //宣告關節 AL::ALValue angles = AL::ALValue::array(sita);//給予角度 motion.setAngles(names, angles, fractionMaxSpeed);//讓機器人做指定角度 } -- 其中問題點就是每次送出一個角度 因為是在迴圈裡會做很多次, 就會連線一次,記憶體就會使用約300,000K以上 使用置底的方便看程式:http://ideone.com/mJ5P7p (迴圈內記憶體會飆高) 嘗試1:(目前唯一成功,但不適用) 但是如果不寫成副程式的副程式這樣子 全部寫成主程式 然後把AL::ALMotionProxy motion("127.0.0.1", 9559); 放在main的第一行(不在迴圈內 這樣子Compiled會過然後記憶體使用只會在3,000K~6,000K左右 但是全部丟在主程式裡面感覺很亂 (我現在打的是簡單例子,實際上我的演算法滿龐大的 使用置底的方便看程式:http://ideone.com/liECKl (放到迴圈外就不會飆高,但不適合) 嘗試2:(失敗) 如果單純把AL::ALMotionProxy motion("127.0.0.1", 9559);拉到main裡面 Compiled不會過,因為motion未宣告的識別項跟setAngles不是等位類別結構 使用置底的方便看程式:http://ideone.com/e7124M 不是全域宣告 嘗試3:(失敗) 有想過不修改程式單純把 AL::ALMotionProxy motion("127.0.0.1", 9559); 拉到main之外,當作全域宣告的感覺 Compiled會過,但是程式無法執行... 使用置底的方便看程式:http://ideone.com/UoDcVG (執行程式出問題) 所以我只好請教各位有什麼地方可以指點我... 或是告訴我我應該查詢哪些關鍵字 感謝各位幫忙 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.120.31.105

04/08 17:58, , 1F
AL::ALValue::array(...) 這是一個function?
04/08 17:58, 1F
恩對,那是將要傳的值要給哪個關節給寫出來,跟給多少寫出來, 給多少就是沿用計算出來的數值,在本文範例我是只給一個關節,所以就一個sita數值而已 主要可以看嘗試1,嘗試1可以解決問題,所以AL::ALValue::array方面是沒問題的 但只是不想要把所有程式都放在主程式中...因為這樣會超亂....應該很合理吧... 因為實際上他是在副程式的副程式中, 如果要全寫在主程式有些副程式可能要複製很多次...

04/08 18:14, , 2F

04/08 18:16, , 3F
在 main 裡面 new 一次並在 main 結束時 delete
04/08 18:16, 3F

04/08 18:18, , 4F
walk 裡面用個區域變數 reference 之前 new 的實體
04/08 18:18, 4F

04/08 18:21, , 5F
不過還建議你如果能用 class 封裝起來會比較好閱讀跟修改
04/08 18:21, 5F
我有試過class但是一樣會出現 motion未宣告的識別項跟setAngles不是等位類別結構 我寫的是像這樣,而且很像沒有連到IP,有點奇怪所以沒寫在我的嘗試裡面 http://ideone.com/OZxNgJ 另外你的方法可以解決我的問題,最後還是因為動態記憶體的問題.... 爬文的時候有查到這個可能性 但是我當下沒有辦法與我發現的問題作連結... 總之感謝您摟~ 如果不介意的話,是否能讓我知道您是怎麼思考的,讓我學會找出問題點 現在記憶體似乎解決了,套在我自己寫的小範例程式上執行是沒問題的, 然後套在另一個程式也沒有問題, 但是套在其中一個程式中有點問題跑到一半會直接錯誤.... 找了一個晚上還沒找到問題 副程式隨便擺在某一行,有時候會出錯有時候不會...(Compiled都會過

04/08 19:57, , 6F
你最後一個例子根本沒宣告motion是啥阿
04/08 19:57, 6F
你是說class的嗎...如果是的話,我有發現...所以我就沒寫在嘗試裡了> <

04/08 22:10, , 7F
建議找本C++入門書看過一遍 你手邊那本是在介紹IDE不是C++
04/08 22:10, 7F
IDE@@? 可是我看那本內容是在講C++耶 還是我講錯本了 http://www.tenlong.com.tw/items/9862760907?item_id=59325 這本

04/08 22:35, , 8F
Visual C++ 2010是一套軟體 C++是程式語言 兩個是不一樣的
04/08 22:35, 8F
但我使用的是Visual C++軟體來寫C++ 這本書裡面講的應該也是C++,還是有點不懂差別在哪裡...

04/08 23:14, , 9F
一般的函式庫在設計的時候都有預期的使用方法。
04/08 23:14, 9F

04/08 23:15, , 10F
以你的例子,頻繁地連線根斷線顯然不是預期的使用方法。
04/08 23:15, 10F
恩..可是我看他的函示庫範例都是寫在主程式,沒有寫在副程式的程式中...

04/08 23:15, , 11F
另一方面你可能對 C++ 的語法不夠熟悉,
04/08 23:15, 11F
恩..是有點不熟悉,我只是大概知道程式的邏輯(大概吧)跟會用if else 跟for迴圈...

04/08 23:17, , 12F
主要是多看別人的 code,可以幫助你快速累積經驗。
04/08 23:17, 12F
恩...我也想看別人的code但是總是覺得簡單的code太簡單,本來就看得懂, 難的又太難...不會慢慢懂...雖然有在寫程式的過程中慢慢學會,但是有點慢... 依然還是只會if else for...> < ※ 編輯: converse0728 來自: 114.26.155.89 (04/09 00:38)
文章代碼(AID): #1HOeqd1x (C_and_CPP)
文章代碼(AID): #1HOeqd1x (C_and_CPP)