2014-10-08 45 views
0

我在傳遞指向函數的指針時遇到了問題。當函數返回時,指針看起來與它在函數中的不同。C函數指針參數在函數退出時不一樣

因此,我將一個指針傳遞給獲取原始圖像數據的函數,該數據應該存儲在指針引用的內存中。

如果我然後將原始圖像函數內的指針傳遞給函數以從原始數據創建JPEG文件,那麼它可以正常工作。

如果我首先等待原始圖像函數完成,然後使用傳遞給原始圖像函數的指針調用JPEG函數,那麼它將無法創建圖像。

代碼的簡化版本低於:

int getRawImage(unsigned char *pBuffer); 
int writeJPEGBFile(unsigned char *idata, char *ofile); 

int main(int argc, char** argv) { 
    unsigned char *rawData = NULL; 
    char filename[MAXPATHLEN] = "/home/user/tst/img.jpg"; 

    getRawImage(rawData); 
    // This does not work 
    writeJPEGBFile(rawData, filename); 
    free(rawData); 
    return 0; 
} 

int getRawImage(unsigned char *pBuffer) { 
    void *hDevice; 

    hDevice = scanOpenDevice(); 
    // Removed code for simplification 
    scanGetFrame(hDevice, pBuffer, NULL) 
    scanCloseDevice(hDevice); 
    // This Works!! 
    //char filename[MAXPATHLEN] = "/home/user/tst/img.jpg"; 
    //writeJPEGBFile(pBuffer, filename); 
    return 0; 
} 

int writeJPEGBFile(unsigned char *idata, char *ofile) { 
    // JPEG code goes here 
    return 0; 
} 

我的問題是什麼我做錯了,我怎麼能順利通過RAWDATA指針writeJPEGBFile()函數在main()函數?


的scanGetFrame(定義)如下:

typedef void *FTR_PVOID; 
FTR_API_PREFIX FTR_BOOL FTR_API ftrScanGetFrame(FTRHANDLE ftrHandle, FTR_PVOID pBuffer, PFTRSCAN_FRAME_PARAMETERS pFrameParameters); 

的scanGetFrame()函數來自於我與鏈接第三方庫,所以我將無法更改定義。

+0

'scanGetFrame'如何添加數據? – juanchopanza 2014-10-08 06:50:19

+1

你有沒有嘗試過在兩種情況下都將指針變量打印到'writeJPEGBFile'中? – Hrishi 2014-10-08 06:51:11

+0

它看起來像'scanGetFrame'是一個宏,它需要'pBuffer'或某些類似的地址。否則,我不認爲這個工作。你可以發佈'scanGetFrame'的定義嗎? – 2014-10-08 06:51:20

回答

0

我設法解決了這個問題。感謝所有爲我帶來解決方案的指針:

int getRawImage(unsigned char *pBuffer); 
int writeJPEGBFile(unsigned char *idata, char *ofile); 

int main(int argc, char** argv) { 
    unsigned char *rawData; // Removed the NULL assignment 
    char filename[MAXPATHLEN] = "/home/user/tst/img.jpg"; 

    // Set the size of rawData - loadImageSize() sets the value of the ImageSize class variable. 
    loadImageSize(); 
    rawData = (unsigned char *) malloc(ImageSize.nImageSize); 

    getRawImage(rawData); 
    // This works now 
    writeJPEGBFile(rawData, filename); 
    free(rawData); 
    return 0; 
} 

int getRawImage(unsigned char *pBuffer) { 
    void *hDevice; 

    hDevice = scanOpenDevice(); 
    // Removed code for simplification 
    scanGetFrame(hDevice, pBuffer, NULL) 
    scanCloseDevice(hDevice); 
    return 0; 
} 

int writeJPEGBFile(unsigned char *idata, char *ofile) { 
    // JPEG code goes here 
    return 0; 
} 
1

鑑於rawDatamain()一個空指針,你幾乎肯定需要的界面修改,以使getRawImage(),它需要一個char **和你傳遞&rawData它。您還需要考慮調用代碼如何知道數據有多大。

+0

考慮到scanGetFrame()期望參數2是char *,你能提出一個可能的解決方案嗎?這是我第一個C項目,儘管我已經使用PHP,Java和C#多年了,但我仍然習慣於C指針和內存分配。感謝您的時間。 – Blazanor 2014-10-08 20:32:12

+0

我希望將'FTR_PVOID'解釋爲'指向void或void *'的指針,但它可能會映射到'char *'。由於我對圖書館一無所知,我很抱歉,我無法再幫忙。您需要知道該功能的功能,以及界面應該如何工作。沒有手冊,什麼都不做。谷歌搜索'ftrScanGetFrame'似乎建議Futronics Fingerprint Reader作爲庫,但您應該確定這是否是您使用的,以及該庫及其文檔的規範URL。 – 2014-10-09 03:07:22