線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:8021
推到 Plurk!
推到 Facebook!

malloc 及 **Y(指標的指標) 用法?

答題得分者是:Stallion
cod3339
一般會員


發表:27
回覆:15
積分:8
註冊:2004-12-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-20 09:53:03 IP:125.229.xxx.xxx 訂閱
以下是一個讀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 #include #define width 512 // frame width #define height 512 // frame height int main() { FILE *infile,*outfile; char infilename[50]="Lena512.raw"; // input file name char outfilename[50]="Lena.raw"; // output file name unsigned char **Y; // pointer for Y component int i; //open input file if((infile=fopen(infilename,"rb"))==NULL){ printf("Input file %s can't be opened!\n",infilename); 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); //Y[i] 請問存入的內容值是數字嗎?我是否可以直接轉型成 int 然後做演算法運算 fclose(infile); // write Y component outfile=fopen(outfilename,"wb"); for(i = 0; i < height; i ) fwrite(Y[i],width,1,outfile); fclose(outfile); for(i = 0; i < height; i ) free(Y[i]); return 0; } </textarea>
編輯記錄
cod3339 重新編輯於 2007-05-20 10:01:18, 註解 無‧
cod3339 重新編輯於 2007-05-20 10:02:51, 註解 無‧
cod3339 重新編輯於 2007-05-20 10:04:48, 註解 無‧
dicky9055
一般會員


發表:20
回覆:48
積分:18
註冊:2006-08-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-20 11:20:55 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-20 11:43:23 IP:211.22.xxx.xxx 未訂閱
小弟也來插個花~
第一個問題:
屬C語言的指標與多重指標以及記憶體配置,基本程式設計的人應該先嘗試搞懂它,否則每次碰到這種問題,絕對還是有問題的。
指標是指向記憶體的,有了記憶體才能儲存資料,另外指標雖然是指向記憶體的,但是指標本身也應該要有位址來存放指標本身吧!所以記憶體就是這樣配置。如此,第一段的程式碼應該懂了吧!我試著將 unsinged char **Y,自左向右讀一次,希望能夠體會箇中的意義。
Y是一個不帶正負值字元型態的指標,他指向一個不帶正負值字元型態的指標,即雙重指標,有點暈吧!?這要多練習即可習慣瞭解,瞭解後就知道記憶體要如何配置。
第二個問題:
看了你的概述應該是在處理圖像的數據,如果你沒說明清楚還真不知道怎麼回答?!
一般圖像檔中放的都是十六進位的數據,所以你讀取出來的值是十六進位的「文字資料」表示,必須先轉換成「數值資料」,才能運算。
cod3339
一般會員


發表:27
回覆:15
積分:8
註冊:2004-12-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-20 12:38:40 IP:125.229.xxx.xxx 訂閱
第一個問題:
主要是我看不懂這一行
<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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-20 13:19:07 IP:211.22.xxx.xxx 未訂閱
第一個問題 :
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-20 16:06:38 IP:211.76.xxx.xxx 未訂閱
沒記錯的話
RAW確時沒有檔頭
另外
malloc和new的意思差不多
編輯記錄
dicky9055 重新編輯於 2007-05-20 16:08:55, 註解 無‧
cod3339
一般會員


發表:27
回覆:15
積分:8
註冊:2004-12-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-23 12:17:02 IP:125.229.xxx.xxx 訂閱
經過兩三天的實做我寫出來了,以下是我的程式碼,原來有一個很重要的觀念我搞錯了。
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 | .....................
=======================
1
3
5
7
No
B
A B-C
B-(A-C)/2
(A B)/2
請使用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 "stdafx.h"
<textarea class="cpp" rows="10" cols="60" name="code">#pragma once #define WIN32_LEAN_AND_MEAN // 從 Windows 標頭排除不常使用的成員 #include #include #include #include #include #define width 512 // frame width #define height 512 // frame height </textarea>
感謝各位的回應 :
編輯記錄
cod3339 重新編輯於 2007-05-23 12:26:55, 註解 圖沒法貼上‧
cod3339 重新編輯於 2007-05-23 12:31:43, 註解 無‧
系統時間:2024-04-28 20:25:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!