讀取並處理多種資料型態的問題 |
尚未結案
|
asliu
一般會員 ![]() ![]() 發表:3 回覆:1 積分:0 註冊:2003-03-13 發送簡訊給我 |
知道用void *可以指向任何資料型態陣列,用Variant可以存取各種型態的資料。不知道有什麼樣較好的寫法可以讀取一串資料(可能是unsigned char, unsigned short, float, double,讀取那種型態的資料可能由data type變數決定)到記憶體中,由data type變數便可以處理(加減乘除)該種資料型態的陣列,不然幾乎所有處理資料的函式都要針對所有的資料型態重新實作一次程式碼。
void readdata(void *data, int datasize, int datatype) { FILE *fp = fopen("test", "rb "); unsigned char *data0; unsigned short *data1; float *data2; double *data3; switch(datatype) { case dtByte: data0 = new unsigned char[datasize]; data = (unsigned char*)data0; fread(data, sizeof(unsigned char), datasize, fp); break; case dtUshort: data1 = new unsigned short[datasize]; data = (unsigned short*)data1; fread(data, sizeof(unsigned short), datasize, fp); break; case dtFloat: data2 = new float[datasize]; data = (float*)data2; fread(data, sizeof(float), datasize, fp); break; case dtDouble: data3 = new double[datasize]; data = (double*)data3; fread(data, sizeof(double), datasize, fp); break; } fclose(fp); } void processdata(void *data, int datasize, int datatype) { unsigned char *data0; unsigned short *data1; float *data2; double *data3; switch(datatype) { case dtByte: data0 = (unsigned char*)data; for (int i=0; i |
liangnet
中階會員 ![]() ![]() ![]() 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
我想有個方法你參考看看,但是還是一樣要為每一型態寫處理的程式,就是使用涵數重載
void readdata(unsigned char *data, int datasize)
void readdata(unsigned short *data, int datasize)
void readdata(float *data, int datasize)
void readdata(double *data, int datasize) 以unsigned char 做範例:
那你readdata就寫成如下
void readdata(unsigned char *data, int datasize, int datatype) { FILE *fp = fopen("test", "rb "); data = new unsigned char[datasize]; fread(data, sizeof(unsigned char), datasize, fp); fclose(fp); }其它的只要將資料的型態改變就好了。 還有一種做法就是用Template。不過這方面我還不了解! |
liangnet
中階會員 ![]() ![]() ![]() 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
|
asliu
一般會員 ![]() ![]() 發表:3 回覆:1 積分:0 註冊:2003-03-13 發送簡訊給我 |
void *data; datasize = 100; switch(datatype) { case dtByte: readdata((BYTE *)data, datasize); break; case dtUSHORT: readdata((USHORT *)data, datasize); break; case dtDWORD: readdata((DWORD *)data, datasize); break; case dtFLOAT: readdata((float *)data, datasize); break; case dtDOUBLE: readdata((double *)data, datasize); break; } template我知道template的做法,只是還是要像如上使用switch...case...,會造成很大的困擾,只要跟資料型態有關的碼還是全部要用switch...case...作一次,其實我是想問有沒有類似的做法,是直接用特定變數代表特定型態的做法,如 switch(datatype) { case dtByte: T = BYTE; break; case dtUSHORT: T = USHORT; break; case dtDWORD: T= DWORD; break; } readdata((T *)data, datasize); processdata((T *)data, datasize) savedata((T *)data, datasize)就是資料型態只需要用switch...case...取代一次,然後之後那樣的資料型態就可以一再使用,不知道有沒有這樣的寫法,不過還是很謝謝你的回答。 |
liangnet
中階會員 ![]() ![]() ![]() 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |