網站公告 :


Delphi K.Top討論區 » 影音多媒體程式設計討論區(C++Builder) » 三維動態宣告
發表新文章
 
主題:三維動態宣告
瀏覽次數:874
尚未結案
kunawa
一般會員




發表:17
回覆:8
積分:5
註冊:2004-04-30

發送簡訊給我
#1 發表時間:2004-08-01 21:18:48 IP:203.203.xxx.xxx 未訂閱


ShowMessage("
int ***R = new int **[14];
for(int i = 0; i < 14; i++)
{
    int **R = new int *[Height/16];
    for(int j = 0; j < (Height/16); j++)
    R[i][j] = new int [Width/16];
")


大家好
請問一下
我想要寫一個三維動態宣告
但我寫好後 電腦說在最後一行 Cannot convert 'int *' to 'int'
請問那我該怎麼改才是對的呢?
謝謝



richtop
資深會員




發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 發表時間:2004-08-01 22:44:28 IP:211.76.xxx.xxx 未訂閱

kunawa 您好:

引言:
ShowMessage("
int ***R = new int **[14];
for(int i = 0; i < 14; i++)
{
    int **R = new int *[Height/16];
    for(int j = 0; j < (Height/16); j++)
    R[i][j] = new int [Width/16];
")


您的程式寫法相當奇怪,不知道您真正的目的。
R[i][j] = new int [Width/16];這行程式的左邊已經是int,而右邊卻是要將一個陣列的位置(int *)給左邊,所以產生了錯誤。
不過您宣告了兩次R,一個是int***,另一個是int**,且用了ShowMessage(.),我不知您的真正用意。

RichTop 敬上

=====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####


kunawa
一般會員




發表:17
回覆:8
積分:5
註冊:2004-04-30

發送簡訊給我
#3 發表時間:2004-08-01 23:32:25 IP:203.203.xxx.xxx 未訂閱

sorry
showmessage是因為我要配合版規
版規裡說要寫在showmessage裡...^^"
抱歉造成誤會
另外...
會這樣重複宣告是因為我不太懂動態宣告
所以應該是寫錯了^^"
請問可以教我如何宣告三維動態陣列嗎? 謝謝



richtop
資深會員




發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 發表時間:2004-08-02 00:06:58 IP:211.76.xxx.xxx 未訂閱

kunawa 您好:

底下有個修改自您所提供程式碼的範例,您先參考一下吧!
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int ***R = new int **[14]; // for creating R[14][12][10].
    for (int i = 0; i < 14; i++)
    { R[i] = new int *[12];
        for (int j = 0; j < 12; j++)
        { R[i][j] = new int [10];
        for (int k=0; k<10; k++)
        R[i][j][k] = 100*i+10*j+k;
        }
    }
    ShowMessage(IntToStr(R[3][2][1]));
    // 釋放記憶體
    for (int i = 0; i < 14; i++)
    { for (int j = 0; i < 12; i++)
        { delete [] R[i][j];
        }
        delete [] R[i];
    }
    delete [] R;
}


RichTop 敬上

=====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####


kunawa
一般會員




發表:17
回覆:8
積分:5
註冊:2004-04-30

發送簡訊給我
#5 發表時間:2004-08-02 00:30:22 IP:203.203.xxx.xxx 未訂閱

可以囉...
不過請問一下為什麼要多釋放記憶體那一步呢??
謝謝



richtop
資深會員




發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#6 發表時間:2004-08-02 15:31:35 IP:211.76.xxx.xxx 未訂閱

kunawa 您好:

之所以要釋放記憶體的原因是:
系統不知道我們會在什麼時候以及會要求多少記憶體空間,所以不會主動釋放動態配置的記憶體,這部分必須由程式設計者在使用完畢後,自行將動態配置的記憶體歸還系統。否則,將導致該段記憶體區塊無法再為系統所用,造成記憶體漏失現象。這是用C/C++寫動態記憶體配置程式時,必須要特別注意的地方。
總之系統資源有限,有借有還,最好不需要再用時就還,這樣可以更有效的共用系統資源。

RichTop 敬上

=====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####


hornacek
一般會員




發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#7 發表時間:2004-08-03 09:14:14 IP:220.135.xxx.xxx 未訂閱

引言:

kunawa 您好:

之所以要釋放記憶體的原因是:
系統不知道我們會在什麼時候以及會要求多少記憶體空間,所以不會主動釋放動態配置的記憶體,這部分必須由程式設計者在使用完畢後,自行將動態配置的記憶體歸還系統。否則,將導致該段記憶體區塊無法再為系統所用,造成記憶體漏失現象。這是用C/C++寫動態記憶體配置程式時,必須要特別注意的地方。
總之系統資源有限,有借有還,最好不需要再用時就還,這樣可以更有效的共用系統資源。

RichTop 敬上

=====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####


想請教一下,若在程式中沒有加上釋放記憶體的機制,在程式結束後,作業系統是否會自動將程式所用的所有記憶體釋放掉呢?謝謝!



richtop
資深會員




發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#8 發表時間:2004-08-03 10:59:59 IP:211.76.xxx.xxx 未訂閱

hornacek 您好:

理論上C/C++裡,您在程式中明確指定(靜態)的記憶體空間,如陣列等,因系統在執行時就知道,所以會在程式執行結束後將之釋放(含程式本身利用的資源)。
但是動態記憶體配置宣告的部分,其釋放權與責任在程式設計者,因為只有原設計者才知道要用多大的空間與何時不再需要,這部分系統是不插手的。

其它語言也各有其回收資源的機制,不盡然C/C++與相同。

RichTop 敬上

=====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####

發表人 - richtop 於 2004/08/03 11:03:58


hornacek
一般會員




發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#9 發表時間:2004-08-31 10:08:28 IP:220.135.xxx.xxx 未訂閱

引言:

hornacek 您好:

理論上C/C++裡,您在程式中明確指定(靜態)的記憶體空間,如陣列等,因系統在執行時就知道,所以會在程式執行結束後將之釋放(含程式本身利用的資源)。
但是動態記憶體配置宣告的部分,其釋放權與責任在程式設計者,因為只有原設計者才知道要用多大的空間與何時不再需要,這部分系統是不插手的。

其它語言也各有其回收資源的機制,不盡然C/C++與相同。



因此換句話說,所有在程式動態配置的記憶體,若沒有在程式中釋放的話,程式關掉之後,這些記憶體就會如孤兒般,沒有程式可以使用囉?



richtop
資深會員




發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#10 發表時間:2004-08-31 12:19:27 IP:211.76.xxx.xxx 未訂閱

引言:

因此換句話說,所有在程式動態配置的記憶體,若沒有在程式中釋放的話,程式關掉之後,這些記憶體就會如孤兒般,沒有程式可以使用囉?




您幾乎可以這樣說,正常狀況下確是如此。
不過如果您在程式結束前將該段"故意未釋放"記憶體的位址記下,您有可能再舊地重遊喔!
不過這應該不是正常的方法!
底下程式碼,簡單示範"偷改"函式內宣告為static變數的值,意思跟上面的說明有點類似,供您參考。
//---------------------------------------------------------------------------
int * showStatic()
{ static int staticValue=0;

    ShowMessage(staticValue++);
    return( &staticValue ); // 傳回staticValue的位址
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int *peeker;
    for (int k=0; k<2; k++)
    showStatic(); // 正常呼叫

    peeker = showStatic(); // 偷偷留下showStatic()中staticValue的位址
    *peeker = 99; // 在showStatic()外部改staticValue的值
    showStatic();
}
//---------------------------------------------------------------------------


RichTop 敬上

=====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####


系統時間:2010-09-03 19:10:32,  線上使用者 255 / Max 3,401,主題數:92,416,回覆數:208,133。  聯絡我們 | Delphi.ktop討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!

趴趴狗旅遊網大花蓮旅遊網大花蓮民宿網花蓮市旅遊網花蓮市民宿網大南投旅遊網大南投民宿網
日月潭風景區日月潭旅遊網日月潭民宿網台東旅遊網台東民宿網集集旅遊網集集民宿網
關子嶺旅遊網關子嶺民宿網白河旅遊網白河民宿網
. . . . . . . .