200910070009二維陣列所需要注意的地方

其實這個問題我有提過,最近版主在porting PNG 那包lib時,又遇到同樣的問題,但是我又忘囉,還有有別人提醒。 是這樣的之前在弄gif 的時候也是這樣那種open source 的東西,尤其在解圖檔時,基本上都會一次把圖檔的資訊都讀進來,所以memory 都一次local 的跟圖檔一樣大塊,在x86可以喔!但是在嵌入式的系統,memory 就會不夠用,所以勢必要一行一行的解開寫到buffer 去。

下面程式image_date 是一各pointer 他的意義其實跟下面這張圖一樣,他宣告囉跟圖行大小一樣大的pointer, 以高來說如果是 32 的話那就有32 個 pointer。  

http://picasaweb.google.com.tw/tzeng01520028/CNabhC#5389515431650910994

 所以當版主在image_date[y] 的那裡就是去取出圖形的每一行的資料,32個指標依y的變化,去指向每一 row of picture,當我把資料拿完後,我馬上把該資料free(image_date[y]) 掉,所以我每一次所佔據的通空間其實都只有圖形的每一各row (省記憶體)。

當我真正做完資料圖取之後別忘囉!還有一各地方 free(image_date) 這個動作一定要做,因為那是剛剛一開始宣告32個pointer 的地方,如果忘記囉!那連續跑的話memory 就會用光,這個小地方要注意阿!

 

    image_data = (png_bytepp) malloc(png_height * sizeof(png_bytep));
    for (y=0; y < png_height; y++) {
        image_data[y] = (png_bytep)malloc(png_get_rowbytes(png_ptr, png_info_ptr));
        png_read_rows(png_ptr, &image_data[y], NULL, 1);
    /**********************************************************************/  
        if (OneFileFlag) {
            if ((color_type == PNG_COLOR_TYPE_PALETTE) || ((color_type == PNG_COLOR_TYPE_GRAY) && bpp < 8))
            {
                for (x=0, BufferP = Buffer; x < png_width; x++) {
                    *BufferP++ = image_data[y][4*x];
                    *BufferP++ = image_data[y][4*x+1];
                    *BufferP++ = image_data[y][4*x+2];                   
                }               
                if (fwrite(Buffer, png_width * 3, 1, f[0]) != 1)
                    printf("Write to file(s) failed.");
            
            }          
        }
        free(image_data[y]);
    }
    free(image_data);

沒有上一則|日誌首頁|沒有下一則
回應





Powered by Xuite
    沒有新回應!
關鍵字