討論區快速選單
知識庫快速選單
掌握Salesforce雲端管理秘訣 程式設計俱樂部Facebook粉絲團 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
如何宣告三維動態陣列
更改我的閱讀文章字型大小
作者 : isaac1019(小猴)
[ 貼文 5 | 人氣 2121 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/22 下午 04:16:15
請教告位c++達人
一般可用new宣告二維動態陣列如下:
double **arr=new double *[n];
for (int i=0; i<n; i++) *arr=new double [m];

我現在需要用到一個三維的動態陣列,該如何宣告?
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人isaac1019註記此篇回應為很有道理 2006/3/22 下午 04:32:10
>一般可用new宣告二維動態陣列如下:
>double **arr=new double *[n];
>for (int i=0; i<n; i++) *arr=new double [m];
>
>我現在需要用到一個三維的動態陣列,該如何宣告?

一樣, 繼續往上擴充 (假設三維大小是s,m,n):

double ***arr = new double**[s];
for (int i=0; i<s; i++)
{
  arr[i] = new double*[n];
  for (int j=0; j<n; j++) arr[i][j] = new double[m];
}

你要四維,五維以上的都行, 按此方式擴增上去即可.
作者 : bechi(bechi)
[ 貼文 38 | 人氣 338 | 評價 110 | 評價/貼文 2.89 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/22 下午 04:33:44
> 請教告位c++達人
> 一般可用new宣告二維動態陣列如下:
> double **arr=new double *[n];
> for (int i=0; i<n; i++) *arr=new double [m];

> 我現在需要用到一個三維的動態陣列,該如何宣告?

double ***arr = new double **[n];
for (int i = 0; i < n; i++) {
  arr[i] = new double *[m];
  for (int j = 0; j < m; j++) {
    arr[i][j] = new double[d];
  }
}

基本上你的2為陣列例子,應該會有問題.
> for (int i=0; i<n; i++) *arr=new double [m];
 *arr一直new同一個位置n次, 應該要 *(arr+i) = new double[m];
作者 : isaac1019(小猴)
[ 貼文 5 | 人氣 2121 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 上午 06:56:16
謝謝大家指教,你說的沒錯!
我應該寫成
double **arr=new double *[n];
for (int i=0; i<n; i++) *arr[i]=new double [m];
作者 : terenas(風) 貼文超過200則
[ 貼文 490 | 人氣 7440 | 評價 680 | 評價/貼文 1.39 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人isaac1019註記此篇回應為最佳解答 2006/3/23 上午 08:32:44

>謝謝大家指教,你說的沒錯!
>我應該寫成
>double **arr=new double *[n];
>for (int i=0; i<n; i++) *arr[i]=new double [m];
如果是我 我會用class struct 去做, 而不會去maintain 一個
三維的array
作者 : isaac1019(小猴)
[ 貼文 5 | 人氣 2121 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 上午 09:06:43
可否再一問,那我要釋放記憶體,又該如何做呢?
作者 : bechi(bechi)
[ 貼文 38 | 人氣 338 | 評價 110 | 評價/貼文 2.89 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 上午 10:57:43
題目是問如何 宣告三維陣列, 既然你覺得用class struct 去做比較好 為何又問如何是放記憶體....
作者 : terenas(風) 貼文超過200則
[ 貼文 490 | 人氣 7440 | 評價 680 | 評價/貼文 1.39 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 下午 12:55:16

>題目是問如何 宣告三維陣列, 既然你覺得用class struct 去做比較好 為何又問如何是放記憶體....
動態new 的 就動態delete 而已, 為何不用release memory 呢?
作者 : bechi(bechi)
[ 貼文 38 | 人氣 338 | 評價 110 | 評價/貼文 2.89 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 下午 01:30:40
看題目是問如何動態宣告 3維陣列, 既然發提人接受 struct, class的方法, 為何又回來問如何動態 release 3維陣列. 如果他問的是 struct, class 的releasing memory, 那你為何不回答他的問題.
作者 : terenas(風) 貼文超過200則
[ 貼文 490 | 人氣 7440 | 評價 680 | 評價/貼文 1.39 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 下午 02:50:20

>看題目是問如何動態宣告 3維陣列, 既然發提人接受 struct, class的方法, 為何又回來問如何動態 release 3維陣列. 如果他問的是 struct, class 的releasing memory, 那你為何不回答他的問題.
不就回答了?
new 的opposite 不就是delete?
而用原本的array 的方式, 也不就是將它的
for loop 中的new 字改成 delete 不就好了.
作者 : bechi(bechi)
[ 貼文 38 | 人氣 338 | 評價 110 | 評價/貼文 2.89 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 下午 03:41:35
> 不就回答了?
> new 的opposite 不就是delete?
> 而用原本的array 的方式, 也不就是將它的
> for loop 中的new 字改成 delete 不就好了.

回答的真妙, 誰不知道 new的opposite是 delete. 他要的是流程.
你還真認為 new 換 delete就ok.
還有 他比較接受你用 struct, class的方法, 還請這位大大指導一下.
作者 : terenas(風) 貼文超過200則
[ 貼文 490 | 人氣 7440 | 評價 680 | 評價/貼文 1.39 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 下午 03:53:28

>> 不就回答了?
>> new 的opposite 不就是delete?
>> 而用原本的array 的方式, 也不就是將它的
>> for loop 中的new 字改成 delete 不就好了.
>
>回答的真妙, 誰不知道 new的opposite是 delete. 他要的是流程.
>你還真認為 new 換 delete就ok.
>還有 他比較接受你用 struct, class的方法, 還請這位大大指導一下.
哦, 我怎麼看來是你要的呢?
請問你要什麼流程呢? 我真的不懂呢.
我覺得你的問題比較妙.
作者 : bechi(bechi)
[ 貼文 38 | 人氣 338 | 評價 110 | 評價/貼文 2.89 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 下午 05:05:11
那請前輩指導一下如何用 struct, class 宣告三維陣列 , 釋放記憶體.
寫一小段程式指導一下, 高抬貴手, 不要講的模模糊糊, 我都看不懂.

講struct, class, new, delete, 這樣我不懂你怎麼做到的.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 下午 06:04:39
#include <stdio.h>
#include <stdlib.h>

void* malloc2d( int w, int h, int size )
{
  int j;
  void **a = (void**) malloc( h*sizeof(void*) + w*h*size );
  for( j=0; j<h; j++ )
    a[j] = ((char *)(a+h)) + j*w*size;
  return a;
}

class Array2D
{
  public:
    int w, h;
    int **m;
    Array2D( int width, int height )
    {
     w = width;
     h = height;
     m = (int**)malloc2d(w,h,sizeof(int));
    }
    ~Array2D(){free(m);}
};

void main()
{
  Array2D a(3, 5);

  int i, j;
  for( j=0; j<a.h; j++ )
    for( i=0; i<a.w; i++ )
     a.m[j][i] = j*a.w+i;

  for( j=0; j<a.h; j++ )
  {
    for( i=0; i<a.w; i++ )
     printf( "%i ", a.m[j][i] );
    printf( "\n" );
  }
}


那個叫 bechi 的, 請教人也這麼大氣焰, 真讓人摸不著頭顱...

來, 現在就給你一個千錘百鍊的 Array2D class, 你氣焰這麼大, 想你必然看得懂, 我就不解釋了.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/3/23 下午 06:37:01
#include <stdio.h>
#include <stdlib.h>

void* malloc3d( int w, int h, int d, int size )
{
  int j, k;
  void ***a = (void***) malloc( d*sizeof(void**) + h*d*sizeof(void*) + w*h*d*size );

  for( k=0; k<d; k++ )
    a[k] = ((void**)(a+d)) + k*h;

  for( k=0; k<d; k++ )
    for( j=0; j<h; j++ )
     a[k][j] = ((char*)(a+d+h*d)) + (k*h+j)*w*size;

  return a;
}

class Array3D
{
  public:
    int w, h, d;
    short ***m;
    Array3D( int width, int height, int depth )
    {
     w = width;
     h = height;
     d = depth;
     m = (short***)malloc3d(w,h,d,sizeof(short));
    }
    ~Array3D(){free(m);}
};

void main()
{
  Array3D a(3, 4, 6);

  int i, j, k;
  for( k=0; k<a.d; k++ )
    for( j=0; j<a.h; j++ )
     for( i=0; i<a.w; i++ )
     a.m[k][j][i] = i;

  for( k=0; k<a.d; k++ )
  {
    for( j=0; j<a.h; j++ )
    {
     for( i=0; i<a.w; i++ )
     printf( "%3i", a.m[k][j][i] );
     printf( "; " );
    }
    printf( "\n" );
  }
}
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.21875