2009年5月16日 星期六

malloc

最近想優化電腦鼠的程式,因為最近在製作斜線的時後複製了45度、90度、135度、180度的副程式,還分成左轉、右轉,所以一共有8個類似的副程式,可是裡面的用法其實都一樣,但是就是裡面部分的參數不同而已。


本來想改成副程式,利用return,回傳計算後的參數,但是因為return同一時間只能回傳一個變數,所以就請教黃老師,老師提供一個有趣的方式:動態記憶體的分配方式(allocates memory )。老師是用c++的程式寫給我參考。以下是範例程式:


int* p1()
{
    int *array;
    array = (int*) malloc (sizeof(int));
    *(array+0)=10;  //a[0]
    *(array+1)=11;  //a[1]
    *(array+2)=12;  //a[2]
    return array;    


}
void p2()
{
    int* b;
    b = p1();
    cout<<*(b)<<" "<<*(b+1)<<" "<<*(b+2)< }


查了一下,通常要使用malloc( ) 通常需要配合一個free( )的函式(記憶體有借要有還),可是寫在副程式裡好像rerutn的時後,就把空間還給主程式了。


不過比較困擾我的是,只要用到malloc( ),不管大小,至少都需要一定的時間,才會完成分配動態記憶體的工作。另外我在試float的時後也不是很成功,數值一直傳錯,真的還需要好好研究一下。



這東西還滿有趣的,如果不知道陣列大小的話,用這方式似乎可以節省記憶體空間。不過……不熟悉用法,用起來問題還滿多的;還是別想太多把變數直接宣告成global,這樣也不用管要回傳幾個值,把參數pass進去就好。


不知道如果我需要回多2個以上的變數的話,有沒有其他比較好的方式可以使用。


2 則留言:

  1. C語言是使用傳指標的方法。例如:
    void sun_func(int *i, float *f)
    {
        *i = 10;
        *f = 100.0;
    }
    main()
    {
        int i;
        float f;
       
        sub_func(&i,&f);
    }
    只要main()結束了,區域變數就被釋放。
    但要注意,指標不好除錯,誤用會當得很慘。

    [版主回覆05/18/2009 12:14:57] 那如果main一直不結束,又一直重複使用sun_func ( ) 的話會如何?
     

    回覆刪除
  2. 重覆使用sub_func()不會有問題。
    而且sub_func()可以由不同的函式去呼叫。
    因為是告知sub_func()要將資料放入那一個位址,所以不會弄錯。

    [版主回覆05/18/2009 19:49:32]嗯。謝謝!

    回覆刪除