[問題] 回傳值的消失
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ 2010
問題(Question):
事情是這樣的:(以下程式碼僅為片段,完整版在最後面)
VectorCpx& VectorCpx::resize(unsigned place)
{
VectorCpx newVec(place, Complex(0.0,0.0));
delete[] pCpx;
return newVec;
}
fstream file("outVec.txt", ios::out);
int main()
{
VectorCpx v1;
v1.resize(10);
file << v1;
}
有一個 class 名叫 VectorCpx,其中有一個成員函式 resize(unsigned place)
VectorCpx 的功能是能夠創一個資料型態是 Complex(複數,另一個 class)的 vector
而 resize(unsigned place) 的功能則是改變已經創好的 vector,使它填入指定數目的0
(file 是自定義輸出)
這裡我的想法是直接創一個新的 VectorCpx,按照 resize(unsigned) 的要求填入0
把原本的 VectorCpx 砍掉,回傳新的回去
但實際上執行時,卻仍然是印出舊的 VectorCpx,而我自己測試確定新的有創造成功
請問我這種寫法哪裡有問題嗎?自己看是看不出個所以然來......
感謝大家m(_ _)m
程式碼(Code):(請善用置底文網頁, 記得排版)
VectorCpx.h:http://ideone.com/a8fcFl
VectorCpx.cpp:http://ideone.com/u8voXB
main.cpp:http://ideone.com/ZYi9CF
補充說明(Supplement):
這個是學校的功課,如果有需要的話我再把說明文件放上來0.0
--
吾乃
不死之眾矢之的
無右之聯合之盾
武田軍最強騎兵團首席武將
不死鬼
馬場美濃守信房是也
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.35.4
推
04/13 14:28, , 1F
04/13 14:28, 1F
我知道,不過我覺得直接弄一個新的丟回去比較簡單._.
→
04/13 16:26, , 2F
04/13 16:26, 2F
推
04/13 16:57, , 3F
04/13 16:57, 3F
不太懂......0.0
我還是解釋一下resize的作用好了
resize(unsigned place, Complex cpx)
這個函式會傳入一個整數place,還有一個Complex cpx。
如果傳入的整數比vector的資料個數還大,那就把vector擴張到適合的大小,並且從原本
的資料之後一直到place的位置都填入cpx,如果當初沒有傳入cpx則填0
如果傳入的整數比vector裡面資料個數還少,那vector大小不變,但原本的資料從尾開始
砍到剩下符合的數量
例如說原本VectorCpx v1是[1][2][3][4][5][ ][ ][ ],資料個數是5,容量是8
此時v1.resize(10,6),因為10比5大,因此v1必須擴張到能夠大以塞入至少10筆資料
而原本的容量8不夠大,因此要擴張為16,之後v1裡要放入10筆資料
前面都是舊資料,後面一直到第10筆則全部填入"6"
因此變成[1][2][3][4][5][6][6][6][6][6][ ][ ][ ][ ][ ][ ],資料個數是10,容量是16
如果是v1.resize(7,6),雖然7比5大,但還在容量8範圍內,因此不用擴張陣列
變成[1][2][3][4][5][6][6][ ],資料個數是7,容量是8
如果是v1.resize(3,6),3比5小,因此不會塞入新的資料,反而舊資料要從尾砍到剩下3筆
容量不變,變成[1][2][3][ ][ ][ ][ ][ ]
至於resize(unsigned place)則是一種overload而已
我的想法是這樣:
與其要大費周章的去改變原本的v1的大小,把資料搬來搬去最後再回傳回去
倒不如直接創一個新的VectorCpx來實作這個功能
如果v1需要擴張的話,就創一個VectorCpx newVecBig(place,cpx)
這個vector的容量是我要的,資料數也是我要的,不一樣的是這個vector裡沒有舊資料
因此再把舊的資料一筆筆覆蓋到newVecBig相對應的位置上
如果v1不需要擴張,則創一個與v1相同大小的空VectorCpx newVecSmall
這個vector裡面沒有存任何的資料,因此把舊的資料一筆筆貼到相對應的位置
貼到我當初要求的資料數(place值)為止
最後再把v1 delete掉,回傳newVecBig或newVecSmall,這就是我要的vector
不過現在問題就出在不知道為什麼印出來的值仍然是v1的值......
不知道我哪裡觀念錯誤0.0
→
04/13 17:20, , 4F
04/13 17:20, 4F
→
04/13 18:30, , 5F
04/13 18:30, 5F
→
04/13 18:31, , 6F
04/13 18:31, 6F
→
04/13 18:32, , 7F
04/13 18:32, 7F
→
04/13 18:32, , 8F
04/13 18:32, 8F
喔喔大概開始有點概念了......
不過不太知道要怎麼改,請問是用像是 this -> newVec之類的方法嗎?
(不過編譯器不給我過就是,囧)
→
04/13 22:09, , 9F
04/13 22:09, 9F
→
04/13 22:12, , 10F
04/13 22:12, 10F
→
04/13 22:19, , 11F
04/13 22:19, 11F
→
04/13 22:19, , 12F
04/13 22:19, 12F
→
04/13 22:22, , 13F
04/13 22:22, 13F
→
04/13 22:22, , 14F
04/13 22:22, 14F
喔......還有這種方法,之前居然都沒想到,囧
感謝你的提醒......
可是我還是好想知道我原來的想法觀念要怎麼實行阿 <囧>
→
04/13 22:57, , 15F
04/13 22:57, 15F
→
04/13 22:58, , 16F
04/13 22:58, 16F
→
04/13 22:59, , 17F
04/13 22:59, 17F
→
04/13 23:00, , 18F
04/13 23:00, 18F
err......不好意思,我發現我不會指,囧
如果我沒理解錯你的意思的話,那應該是要把舊vector的每個空間的pCpx
指向新的vector的每個空間的pCpx指向的位址?
但是以我對這段話及對pointer觀念的理解,寫不出來囧......
for(unsigned int i = 0; i < mCapacity; i++)
*pCpx[i] = &newVec.pCpx[i];
這是我目前想出來的鬼東西......
→
04/13 23:16, , 19F
04/13 23:16, 19F
→
04/13 23:36, , 20F
04/13 23:36, 20F
→
04/13 23:37, , 21F
04/13 23:37, 21F
→
04/13 23:47, , 22F
04/13 23:47, 22F
→
04/13 23:49, , 23F
04/13 23:49, 23F
→
04/13 23:51, , 24F
04/13 23:51, 24F
→
04/13 23:52, , 25F
04/13 23:52, 25F
0.0?
如果不管我剛才加的那段程式碼的話(那段是錯的),應該是可以跑才對阿......
只是他cmd視窗不會有東西,會另外開一個.txt檔印出結果
→
04/13 23:55, , 26F
04/13 23:55, 26F
→
04/13 23:55, , 27F
04/13 23:55, 27F
我自己建專案跑的時候,至少確定可以印出A、B兩段阿0.0
而且也沒有跳警告說DBL_MIN找不到......奇怪
→
04/13 23:58, , 28F
04/13 23:58, 28F
→
04/13 23:58, , 29F
04/13 23:58, 29F
結果程式當掉了......
→
04/14 00:04, , 30F
04/14 00:04, 30F
→
04/14 00:06, , 31F
04/14 00:06, 31F
我還以為我delete的是原本v1的pCpx?!
→
04/14 00:07, , 32F
04/14 00:07, 32F
→
04/14 00:07, , 33F
04/14 00:07, 33F
→
04/14 00:21, , 34F
04/14 00:21, 34F
→
04/14 00:21, , 35F
04/14 00:21, 35F
→
04/14 00:23, , 36F
04/14 00:23, 36F
→
04/14 00:24, , 37F
04/14 00:24, 37F
error C2679: 二元運算子 '=' : 找不到使用右方運算元型別 'VectorCpx *' 的運算子
(或是沒有可接受的轉換)
所以說我連operator=的重載函式都寫錯了嗎......
→
04/14 01:05, , 38F
04/14 01:05, 38F
→
04/14 01:06, , 39F
04/14 01:06, 39F
→
04/14 01:12, , 40F
04/14 01:12, 40F
→
04/14 01:19, , 41F
04/14 01:19, 41F
→
04/14 01:21, , 42F
04/14 01:21, 42F
→
04/14 01:23, , 43F
04/14 01:23, 43F
→
04/14 01:25, , 44F
04/14 01:25, 44F
→
04/14 01:28, , 45F
04/14 01:28, 45F
→
04/14 01:29, , 46F
04/14 01:29, 46F
→
04/14 01:35, , 47F
04/14 01:35, 47F
→
04/14 01:36, , 48F
04/14 01:36, 48F
→
04/14 01:36, , 49F
04/14 01:36, 49F
→
04/14 01:41, , 50F
04/14 01:41, 50F
→
04/14 01:43, , 51F
04/14 01:43, 51F
→
04/14 01:43, , 52F
04/14 01:43, 52F
→
04/14 01:46, , 53F
04/14 01:46, 53F
→
04/14 01:47, , 54F
04/14 01:47, 54F
→
04/14 01:47, , 55F
04/14 01:47, 55F
→
04/14 01:49, , 56F
04/14 01:49, 56F
→
04/14 01:52, , 57F
04/14 01:52, 57F
→
04/14 01:52, , 58F
04/14 01:52, 58F
→
04/14 01:53, , 59F
04/14 01:53, 59F
→
04/14 01:56, , 60F
04/14 01:56, 60F
→
04/14 01:56, , 61F
04/14 01:56, 61F
→
04/14 01:56, , 62F
04/14 01:56, 62F
這裡我想搞清楚一下0.0
所以rep大修補我的程式的方法是:
因為原本我的程式碼在delete[] pCpx之後,pCpx指向的記憶體位置裡的資料仍然沒變
(Q1:那請問我delete掉的是什麼?)
因此利用這段程式碼
memcpy(this, &newVec , sizeof(VectorCpx));
newVec.pCpx = NULL;
(Q2-a:我有上網查過memcpy的用法和解釋,但還是不懂為什麼可以用在這邊......)
(Q2-b:為什麼要把newVec.pCpx指向NULL?)
來把newVec.pCpx指向非法位址
(Q3:為什麼指向NULL是非法位址?因為他照理來說會在return時被delete掉嗎?)
就可以把newVec.pCpx留在v1.pCpx,以避免return時newVec被delete掉
(Q4:為什麼newVec在return時會被delete掉?)
大概是以上幾個問題還沒搞懂......
推
04/14 12:20, , 63F
04/14 12:20, 63F
→
04/14 12:21, , 64F
04/14 12:21, 64F
→
04/14 12:21, , 65F
04/14 12:21, 65F
→
04/14 12:23, , 66F
04/14 12:23, 66F
→
04/14 12:24, , 67F
04/14 12:24, 67F
→
04/14 12:25, , 68F
04/14 12:25, 68F
感謝各位不厭其煩一直替我解惑......m(_ _)m
目前程式還是先依照我原本的作法,在rep大提供了那兩行程式碼後已經完成了99.9%
剩下的0.1%是個main裡奇怪的小問題:
v3.push_back(Complex(0.5566, 0.9527)).push_back(Complex(0.2, 0.3));
這樣會出問題,似乎是讀不到後面的push_back
v3.push_back(Complex(0.5566, 0.9527));
v3.push_back(Complex(0.2, 0.3));
這樣就對了
而push_back的程式碼內容都沒變,不知道為什麼......
除此之外,這個程式基本上已經完成了
等段考完後,我會再用原本應該要用的正確觀念─使用者期望物件自己的變動
來把這個程式重寫一遍,不過這次也是學到了很多東西
現在希望先能把rep大講的那些東西好好搞懂......
(問題在上面0.0)
再次感謝大家的不辭勞苦 m(_ _)m
→
04/14 15:02, , 69F
04/14 15:02, 69F
→
04/14 15:02, , 70F
04/14 15:02, 70F
→
04/14 22:54, , 71F
04/14 22:54, 71F
→
04/15 00:18, , 72F
04/15 00:18, 72F
→
04/15 00:37, , 73F
04/15 00:37, 73F
→
04/15 00:39, , 74F
04/15 00:39, 74F
→
04/15 00:40, , 75F
04/15 00:40, 75F
→
04/15 00:41, , 76F
04/15 00:41, 76F
→
04/15 00:43, , 77F
04/15 00:43, 77F
→
04/15 00:44, , 78F
04/15 00:44, 78F
總之我這次捅了個麻煩的大洞......0.0,等考完我再把這部份好好的磨助教磨到懂
以下是目前的最終版本
VectorCpx.h:http://ideone.com/qT1F8O
VectorCpx.cpp:http://ideone.com/J00SSs
main.cpp:http://ideone.com/awxpCS
有大家的幫忙,才能完成這份功課
最後希望我明後天的期中考能順利過關>"<
※ 編輯: o07608 來自: 220.133.35.4 (04/15 18:39)
→
04/15 18:41, , 79F
04/15 18:41, 79F