malloc 及 **Y(指標的指標) 用法? |
答題得分者是:Stallion
|
cod3339
一般會員 發表:27 回覆:15 積分:8 註冊:2004-12-07 發送簡訊給我 |
以下是一個讀raw 檔的程式用c 語言下去寫的
我要做的工作是使用 JPEG-LS 做 DPCM 第一個問題 :在其中我看不懂這幾行
Y = (unsigned char **)malloc(height * sizeof(unsigned char *));
for(i = 0; i < height; i )
Y[i] = (unsigned char *)malloc(width * sizeof(unsigned char));
第二個問題 :
fread(Y[i],width,sizeof(unsigned char),infile);
Y[i] 所存入的是什麼東西?內容值是什麼? 可以直接轉成 int 然後做運算嗎?
請求高手解答。 by 剛學程式語言的新手 XD 以下為完整程式碼 <textarea class="cpp" rows="10" cols="60" name="code">#include | |||||||||
dicky9055
一般會員 發表:20 回覆:48 積分:18 註冊:2006-08-02 發送簡訊給我 |
Y = (unsigned char **)malloc(height * sizeof(unsigned char *));
for(i = 0; i < height; i )
Y[i] = (unsigned char *)malloc(width * sizeof(unsigned char));
這段指的是宣告一個二維的動態陣列~c語言的寫法 fread(Y[i],width,sizeof(unsigned char),infile); 這段指的是把讀取的二進位檔資料設定給Y[i]存放,width指的是設定最多讀取之大小,sizeof(unsigned char)指的是每次讀取的大小,infile指的是從這個infile讀取 我想應是上面這樣..有錯的話就請其他大大幫我更正 另外..建議你去看一下c語言教學的書 這都是檔案處理的東西
編輯記錄
dicky9055 重新編輯於 2007-05-20 11:22:00, 註解 無‧
|
|||||||||
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
小弟也來插個花~
第一個問題: 屬C語言的指標與多重指標以及記憶體配置,基本程式設計的人應該先嘗試搞懂它,否則每次碰到這種問題,絕對還是有問題的。 指標是指向記憶體的,有了記憶體才能儲存資料,另外指標雖然是指向記憶體的,但是指標本身也應該要有位址來存放指標本身吧!所以記憶體就是這樣配置。如此,第一段的程式碼應該懂了吧!我試著將 unsinged char **Y,自左向右讀一次,希望能夠體會箇中的意義。 Y是一個不帶正負值字元型態的指標,他指向一個不帶正負值字元型態的指標,即雙重指標,有點暈吧!?這要多練習即可習慣瞭解,瞭解後就知道記憶體要如何配置。 第二個問題: 看了你的概述應該是在處理圖像的數據,如果你沒說明清楚還真不知道怎麼回答?! 一般圖像檔中放的都是十六進位的數據,所以你讀取出來的值是十六進位的「文字資料」表示,必須先轉換成「數值資料」,才能運算。 |
|||||||||
cod3339
一般會員 發表:27 回覆:15 積分:8 註冊:2004-12-07 發送簡訊給我 |
第一個問題:
主要是我看不懂這一行 <textarea class="cpp" rows="10" cols="60" name="code">for(i = 0; i < height; i ) Y[i] = (unsigned char *)malloc(width * sizeof(unsigned char)); </textarea> 看完就呆掉了,還有這種寫法在網路上大多只查到 Y = (int *)malloc(height * sizeof(int)); 而不知道 for 回圈是在做什麼的,for 給我的感覺好像是 初始條件 height =512 , width=512 ============= 模擬 memory ========== Y[0] Y[1] Y[2] . . . Y[511] ==================================== 總共產生512個Y[] ,每個Y[]裡面存放著都存放著二進位資訊,不知我的觀念有沒有錯,請指教 第二個問題 : 所以我要先把 char **y 轉成 int **y1 對吧!! 以下是我的寫法但執行後會出現錯誤 //我寫的 <=就表示新增的地方,大致跟原來的程式一樣 <textarea class="cpp" rows="10" cols="60" name="code"> Y = (unsigned char **)malloc(height * sizeof(unsigned char *)); for(i = 0; i < height; i ) Y[i] = (unsigned char *)malloc(width * sizeof(unsigned char)); Y1 = (int **)malloc(height * sizeof(int *)); for(i = 0; i < height; i ) Y1[i] = (int *)malloc(width * sizeof(int)); // read Y component for(i = 0; i < height; i ) fread(Y[i],width,sizeof(unsigned char),infile); fclose(infile); //----------------//我自已寫的-------------------------------------------------- for(i = 0; i < height; i ) Y1[i]=(int *)Y[i]; //------------------------------------------------------------------------------ // write Y component outfile=fopen(outfilename,"wb"); for(i = 0; i < height; i ) fwrite(Y1[i],width,1,outfile); //我自已寫的 fclose(outfile); for(i = 0; i < height; i ) { free(Y[i]); free(Y1[i]); //我自已寫的 } system("PAUSE"); return 0; </textarea> 請問是那裡有問題呢!! ,誠心請教 感謝回應。 註 : 小弟有用UltraEdit 開過 .raw 檔 結果出現亂碼,我想是因為raw 沒有檔頭的關系吧 觀念 : raw 內是存放 十六進制的數據,並無檔頭(head) <=對嗎? 如果錯誤或意義表達不清楚,請回文謝謝 ===================引 用 Stallion 文 章=================== 第一個問題: 屬C語言的指標與多重指標以及記憶體配置,基本程式設計的人應該先嘗試搞懂它,否則每次碰到這種問題,絕對還是有問題的。 指標是指向記憶體的,有了記憶體才能儲存資料,另外指標雖然是指向記憶體的,但是指標本身也應該要有位址來存放指標本身吧!所以記憶體就是這樣配置。如此,第一段的程式碼應該懂了吧!我試著將 unsinged char **Y,自左向右讀一次,希望能夠體會箇中的意義。 Y是一個不帶正負值字元型態的指標,他指向一個不帶正負值字元型態的指標,即雙重指標,有點暈吧!?這要多練習即可習慣瞭解,瞭解後就知道記憶體要如何配置。 第二個問題: 看了你的概述應該是在處理圖像的數據,如果你沒說明清楚還真不知道怎麼回答?! 一般圖像檔中放的都是十六進位的數據,所以你讀取出來的值是十六進位的「文字資料」表示,必須先轉換成「數值資料」,才能運算。
編輯記錄
cod3339 重新編輯於 2007-05-20 12:42:18, 註解 無‧
|
|||||||||
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
第一個問題 :
Y = (unsigned char **)malloc(height * sizeof(unsigned char *)); //這行是為其所指向的指標,安排空間以便擺放該被指向指標的位址值 for( i = 0; i < height; i )
Y[i] = (unsigned char *)malloc(width * sizeof(unsigned char)); //這行是為其所指向的指標的指標安排空間,以便擺放指標所指的內容值第二個問題 : 所以我要先把 char **y 轉成 int **y1 對吧!! 不對!還要維持你原來的程式內容。 基於型態大小 (char *)Y[i]是取該位址內一個char型態大小的Byte數資料出來,而(int *)Y[i]是取該位址內一個int型態大小的Bytes數資料出來,瞭解吧~ 我之前的意思是說取出的文字資料再轉換,是例如你要運算Y[0]的文字資料值,那麼先要將Y[0]裡面這個16進位的文字資料,轉換成數值: int value; value = 轉換成數值的函數(Y[0]); 另外我對圖檔的表頭沒有研究,無法提出建議,請搜尋本站或Goole一下。
編輯記錄
Stallion 重新編輯於 2007-05-20 13:26:15, 註解 順一下語句~ :)‧
|
|||||||||
dicky9055
一般會員 發表:20 回覆:48 積分:18 註冊:2006-08-02 發送簡訊給我 |
||||||||||
cod3339
一般會員 發表:27 回覆:15 積分:8 註冊:2004-12-07 發送簡訊給我 |
經過兩三天的實做我寫出來了,以下是我的程式碼,原來有一個很重要的觀念我搞錯了。
unsigned char X ; 是指 x 內存放著 0~255 的值,而不是文字。錯誤觀念 => 只要宣告為 char 就不可以做 加、減、乘、除...等運算 正確的觀念是可以做運算,而且是不用做轉型的動作 範例程式碼 <textarea class="cpp" rows="10" cols="60" name="code">unsigned char **pre,**diff; // pointer for Y component .... *(*(pre 0) 0)=*(*(diff 0) 0) 128; *(*(diff 0) 0)=0; </textarea><br /> 把 pre[0][0] = diff[0][0] 128 例外 把自已完成的程式碼 放上去 此 為 <無失真圖片壓縮> DPCM 實作 用JPEG-LS 題目: JPEG-LS有7種不同的預測方式,在編碼每一個像素時,都會先用全部七種的預測器先預測過後,選出誤差最小的預測器當成目前這個像素的預測器。
請注意,題目中的B、C、D、A皆為預測影像的值,而非原始影像的值。
X點是要做預測的點,A、B、C是X點的相鄰點 前一行 ======================
................| B | C | ..................... ======================= ............... | A | X | ..................... =======================
請使用JPEG-LS的預測法,替至少3張灰階測試影像做JPEG-LS的預測,請輸出(1)預測影像(2)誤差影像。
軟體使用方式 : 在程式的同一個資料夾下放入一張 in.raw,處理後輸出 preG <預測影像>、diffG<差值影像> 開發軟體 : visual studio.net 2005 作業環境 : windows XP SP2 開發時間 : 2007.5.22 重要的做法 : 先把 原圖<in.raw>的第一個點 copy 到預則圖的第一個點內。例 : pre[0][0] = Y[0][0] ; <textarea class="cpp" rows="10" cols="60" name="code">#include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { FILE *infile,*outfile,*outfile1; char infilename[50]="in.raw"; // input file name char preG[50]="prePhoto.raw"; // 預測影像 file name char diffG[50]="diffPhoto.raw"; // 誤差影像 file name unsigned char **Y,**pre,**diff; // pointer for Y component int i,j,k; int h=0; int Q = 20; //量化值 可為 5 或是 10 20 .... unsigned char tmp[8]="",d[8]=""; //tmp為經過predicton演算法後的結果,d 為原圖減預測 //open input file if((infile=fopen(infilename,"rb"))==NULL){ printf("Input file %s can't be opened!\n",infilename); system("PAUSE"); return 0; } //dynamically allocate 2D memory for Y component Y = (unsigned char **)malloc(height * sizeof(unsigned char *)); for(i = 0; i < height; i ) Y[i] = (unsigned char *)malloc(width * sizeof(unsigned char)); // read Y component for(i = 0; i < height; i ) fread(Y[i],width,sizeof(unsigned char),infile); //把原始圖讀進來 fclose(infile); pre = (unsigned char **)malloc(height * sizeof(unsigned char *)); for(i = 0; i < height; i ) pre[i] = (unsigned char *)malloc(width * sizeof(unsigned char)); diff = (unsigned char **)malloc(height * sizeof(unsigned char *)); for(i = 0; i < height; i ) diff[i] = (unsigned char *)malloc(width * sizeof(unsigned char)); /* for(int j =0 ;j < height; j ) for(int k =0 ;k < width; k ) *(*(pre j) k)=*(*(Y j) k)-255; //test preG diffG menory space */ for(i = 0 ; i < width ; i ) { *(*(pre 0) i)=*(*(Y 0) 0); //先把最上面一排的點做處理 *(*(diff 0) i)=0; } for(i = 1 ; i <textarea class="cpp" rows="10" cols="60" name="code">#pragma once #define WIN32_LEAN_AND_MEAN // 從 Windows 標頭排除不常使用的成員 #include 感謝各位的回應 : |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |