找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
尊貴會員無限使用任何功能尊貴會員無限下載附件認識好友、聊天,分享生活趣事
催眠火影柯南名偵探柯overlord中文中字
淫堕の姫淫堕の姫旧校舎の龍族教義乃木坂nkkd 320エクリプ

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]戰隊大失格02-

(4月新番)[繁]夜櫻家

[繁]怪物轉生 Re:Mons

(4月新番)[繁]神明渴

(4月新番)[繁]搖曳露

[繁]我的英雄學院 Mem
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 2882|回復: 11
打印上一主題下一主題

[問題](已完成)指標觀念問題...應該吧[複製鏈接]

Rank: 2Rank: 2

帖子
475
積分
967 點
潛水值
31639 米
跳轉到指定樓層
樓主
發表於 2016-11-24 01:06 PM|只看該作者|倒序瀏覽
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
本帖最後由 baepi 於 2016-11-29 03:46 PM 編輯

又是小弟我~繼上次問過創建二維動態記憶體~雖然大體已經成功~但是卻發現若是使用class物件~那麼並不會有建構的動作...聽不懂沒關係~畢竟這次跟上次那篇並無太大關係

這次小弟碰到的問題是...先看小弟完成的套件拙作
  1. template<class T> T** new_new( int xx , int yy )
  2. {
  3.         T **temp = (T**)new T[ ( xx * sizeof(T*) ) + ( xx * yy )  ];        //[ 指標數量 + 大小 ]
  4.         T *buf = (T *)( temp + xx );        //強制轉為1維陣列 + 略過指標數量
  5.         temp[ 0 ] = buf;
  6.         for( int i = 1 ; i < xx ; i++ )
  7.         {
  8.                 temp[ i ] = temp[ i - 1 ] + yy ;
  9.         }
  10.         return temp;
  11. }
複製代碼
由此套件創建的二維動態記憶體....class元件會建構了~可是建構的值卻是錯誤的...這是問題1
建構的數量很明顯不對...這是問題2
下面有完整程式碼 + 執行結果~請高手們能給我解答或是提供嘗試的方向
  1. #include <iostream>
  2. using namespace std;
  3. #define x 3
  4. #define y 2
  5. template<class T> T** new_new( int xx , int yy )
  6. {
  7.         T **temp = (T**)new T[ ( xx * sizeof(T*) ) + ( xx * yy )  ];        //[ 指標數量 + 大小 ]
  8.         T *buf = (T *)( temp + xx );        //強制轉為1維陣列 + 略過指標數量
  9.         temp[ 0 ] = buf;
  10.         for( int i = 1 ; i < x ; i++ )
  11.         {
  12.                 temp[ i ] = temp[ i - 1 ] + yy ;
  13.         }
  14.         return temp;
  15. }
  16. class test
  17. {
  18. public:
  19.         int a;
  20.         int b;
  21.         test();
  22.         ~test();
  23. };
  24. test::test()
  25. {
  26.         cout<<"這是建構\n";
  27.         a = 7 ;
  28.         b = 8;
  29. }
  30. test::~test()
  31. {
  32.         cout<<"這是解構\n";
  33. }
  34. void main()
  35. {
  36. cout<<"固定二維陣列\n";
  37.         test t[ x ][ y ];
  38.         for( int i = 0 ; i < x ; i++ )
  39.         {
  40.                 for( int j = 0 ; j < y ; j++ )
  41.                 {
  42.                         cout << t[ i ][ j ].a << t[ i ][ j ].b << '\t' ;
  43.                 }
  44.                 cout<<endl;
  45.         }
  46.         cout<<endl;

  47.         cout<<"動態二維陣列\n";
  48.         test **tt;
  49.         tt = new test*[ x ];
  50.         for( int i = 0 ; i < x ; i++ )
  51.         {
  52.                 tt[i] = new test[ y ];
  53.         }
  54.         for( int i = 0 ; i < x ; i++ )
  55.         {
  56.                 for( int j = 0 ; j < y ; j++ )
  57.                 {
  58.                         cout << tt[ i ][ j ].a << tt[ i ][ j ].b << '\t' ;
  59.                 }
  60.                 cout<<endl;
  61.         }
  62.         cout<<endl;
  63.         for( int i = 0 ; i < x ; i++ )
  64.         {
  65.                 delete [] tt[i];
  66.         }
  67.         delete [] tt;

  68.         cout<<"一次刪除的動態二維陣列\n";
  69.         test **ttt = new_new< test >( x , y );
  70.         for( int i = 0 ; i < x ; i++ )
  71.         {
  72.                 for( int j = 0 ; j < y ; j++ )
  73.                 {
  74.                         cout << ttt[ i ][ j ].a << ttt[ i ][ j ].b << '\t' ;
  75.                 }
  76.                 cout<<endl;
  77.         }
  78.         cout<<endl;
  79.         delete [] ttt;
  80. }
複製代碼
執行結果
  1. 固定二維陣列
  2. 這是建構
  3. 這是建構
  4. 這是建構
  5. 這是建構
  6. 這是建構
  7. 這是建構
  8. 78      78
  9. 78      78
  10. 78      78

  11. 動態二維陣列
  12. 這是建構
  13. 這是建構
  14. 這是建構
  15. 這是建構
  16. 這是建構
  17. 這是建構
  18. 78      78
  19. 78      78
  20. 78      78

  21. 這是解構
  22. 這是解構
  23. 這是解構
  24. 這是解構
  25. 這是解構
  26. 這是解構
  27. 一次刪除的動態二維陣列
  28. 這是建構
  29. 這是建構
  30. 這是建構
  31. 這是建構
  32. 這是建構
  33. 這是建構
  34. 這是建構
  35. 這是建構
  36. 這是建構
  37. 這是建構
  38. 這是建構
  39. 這是建構
  40. 這是建構
  41. 這是建構
  42. 這是建構
  43. 這是建構
  44. 這是建構
  45. 這是建構
  46. 87      87
  47. 87      87
  48. 87      87

  49. 這是解構
  50. 這是解構
  51. 這是解構
  52. 這是解構
  53. 這是解構
  54. 這是解構
  55. 請按任意鍵繼續 . . .
複製代碼
已知錯誤
  1. T **temp = (T**)new T[ ( xx * sizeof(T*) ) + ( xx * yy )  ];        //[ 指標數量 + 大小 ]
複製代碼
但是實在不知怎麼修改....

...
瀏覽完整內容,請先 註冊登入會員
分享分享0收藏收藏0支持支持0

使用道具檢舉

Rank: 2Rank: 2

帖子
241
積分
299 點
潛水值
22810 米
頭香
發表於 2016-11-25 09:05 AM|只看該作者
new_new 第一行, 為何要
new T[ ( xx * sizeof(T*) ) + ( xx * yy )  ];

real data 只有xx*yy不是嗎?
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。

使用道具檢舉

Rank: 2Rank: 2

帖子
1051
積分
617 點
潛水值
27320 米
3
發表於 2016-11-25 09:36 AM|只看該作者
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。
建構的數量當然不對啊
因為你寫的是
new T[ ( xx * sizeof(T*) ) + ( xx * yy )  ];
這是產生 class T 共 xx*sizeof(T*) + (xx*yy) 個
假設是在32bit 的pc windows OS 下 sizeof(T*) 為4
所以你一共產生了 xx*4 + xx*yy 個T 物件. 被建構的次數也是 xx*4 + xx*yy 次

怎麼改.. 分兩次new
一次 temp= new T*[xx];
temp[0] = new T[xx*yy];   之後的程式碼就一樣..

點評

baepi 大大說的我懂~我也曾這樣想過~只是這樣delete就要刪除兩次了....orz  發表於 2016-11-25 04:07 PM

使用道具檢舉

inunu 該用戶已被刪除
4
發表於 2016-11-28 03:27 AM|只看該作者
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com
1. 把你 動態二維陣列 裡的做法整個代進去就對了

2. delete[] 本來就需要兩個層次, 否則就不是二維

使用道具檢舉

Rank: 2Rank: 2

帖子
1051
積分
617 點
潛水值
27320 米
5
發表於 2016-11-28 09:11 AM|只看該作者
c++ 下沒辦法只有一次new . 因為 class 要construct . 也要 destruct
但又因為你要求的是兩個不同的class ( T*  跟 T 是不一樣的東西) 所以.. 沒有辦法做到.




若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

Rank: 2Rank: 2

帖子
475
積分
967 點
潛水值
31639 米
6
發表於 2016-11-28 10:17 AM|只看該作者
inunu 發表於 2016-11-28 03:27 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

1. 把你 動態二維陣列 裡的做法整個代進去就對了

2. delete[] 本來就需要兩個層次, 否則就不是二維 ...

感謝還是有人給予回覆...其實我測試到現在已經半放棄了
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

Rank: 1

帖子
9
積分
31 點
潛水值
19590 米
7
發表於 2016-11-28 03:43 PM|只看該作者
本帖最後由 kiwis 於 2016-11-28 04:42 PM 編輯

我猜你是想要”只 new 一次,也只 delete 一次,但是想用二維陣列的方式操作”吧?

如果是的話,也不是不行這樣做,只是有點複雜。
重點是要實作一個一維陣列的template。
  1. template<class T>
  2. class T2DArray
  3. {
  4. public:
  5.         T2DArray(int new_x, int new_y):
  6.           p_array(0),
  7.           x(new_x),
  8.           y(new_y)
  9.         {
  10.                 p_array = new T[ x*y ];
  11.         };

  12.         ~T2DArray()
  13.         {
  14.                 if(p_array)
  15.                         delete [] p_array;
  16.         };

  17.         class TArray
  18.         {
  19.         public:
  20.                 TArray(T* array, int new_length):
  21.                   length(new_length),
  22.                   p_array(array)
  23.                 {
  24.                 }

  25.                 T& operator[](int index)
  26.                 {
  27.                         if(index >= length || 0 > index)
  28.                                 throw std::invalid_argument( "invalid index.\n" );
  29.                         else
  30.                                 return (p_array[index]);
  31.                 };

  32.         private:
  33.                 T* p_array;
  34.                 int length;

  35.         };

  36.         TArray operator[](int index)
  37.         {
  38.                 if(index >= x || 0 > index)
  39.                         throw std::invalid_argument( "invalid index.\n" );
  40.                 else
  41.                         return TArray(p_array+(y * index) ,y);
  42.         };


  43. private:
  44.         T2DArray(const T2DArray&);                           // copy constructor
  45.         T2DArray& operator=(const T2DArray&);        // assign operator
  46.         T* p_array;
  47.         int x;
  48.         int y;

  49. };
複製代碼
T2DArray[ index ] 會傳回一個 TArray,
TArray[ index ] 會傳回記憶體上真正的數字,

不過是一個感覺上危險到不行的東西,
隨時會來個 Array Out Of Bound 的例外...

個人並不推薦這種用法。...
瀏覽完整內容,請先 註冊登入會員

點評

kaworucloud 這樣子每次存取時都會產生一個暫時性的TArray物件,回傳完y上的資料後立即消滅吧?每存取一次就要建構一個物件,感覺效能成本很重啊  發表於 2016-11-30 10:36 AM
baepi 大大這寫法真是讓我長知識了...  發表於 2016-11-28 05:04 PM
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

Rank: 1

帖子
9
積分
31 點
潛水值
19590 米
8
發表於 2016-11-28 03:49 PM|只看該作者
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
補一下實際操作,不知道為何程式碼沒辦法貼,所以請看附檔 : p
附件: 你需要登錄才可以下載或查看附件。沒有帳號?註冊

使用道具檢舉

inunu 該用戶已被刪除
9
發表於 2016-11-29 04:12 AM|只看該作者
baepi 發表於 2016-11-28 10:17 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

感謝還是有人給予回覆...其實我測試到現在已經半放棄了
delete要幾次跟幾維本質上是不太有直接關係的~是 ...

一般的二維陣列用法因為涉及兩個 [], (兩層的指標)
...
瀏覽完整內容,請先 註冊登入會員
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。

使用道具檢舉

Rank: 2Rank: 2

帖子
380
積分
462 點
潛水值
12140 米
10
發表於 2016-11-29 02:34 PM|只看該作者
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。
其實,我不太明白你的用意。
用多少就配置多少記憶體,new 了卻不用,只是為了避開錯誤,不是正確的作法。
靜態動態一維二維陣列對記憶體的使用上你可能要去了解。
包含過去的我在內,很多人對這方面觀念很弱,真的不好解釋。
試著解釋給其他同事聽,也是解釋了很久。

基本上:
1. 我不建議在function 或method 內new 東西然後 return 出來。
...
瀏覽完整內容,請先 註冊登入會員





--
人人有把握,各個沒機會。

使用道具檢舉

Rank: 2Rank: 2

帖子
475
積分
967 點
潛水值
31639 米
11
發表於 2016-11-29 03:45 PM|只看該作者
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。
kilean 發表於 2016-11-29 02:34 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

其實,我不太明白你的用意。
用多少就配置多少記憶體,new 了卻不用,只是為了避開錯誤,不是正確的作法。
...

...
瀏覽完整內容,請先 註冊登入會員
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

Rank: 1

帖子
9
積分
31 點
潛水值
19590 米
12
發表於 2016-11-30 06:20 PM|只看該作者
kiwis 發表於 2016-11-28 03:43 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

我猜你是想要”只 new 一次,也只 delete 一次,但是想用二維陣列的方式操作”吧?

如果是的話,也不是不 ...

>kaworucloud
...
瀏覽完整內容,請先 註冊登入會員
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部