2014-10-08 78 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