Blazanor
Blazanor

Reputation: 175

C Function pointer parameter not the same when function exits

I am having a problem with passing a pointer to a function. When the function returns the pointer seems to be different than what it is in the function.

So I pass a pointer to the function which gets raw image data which should then be stored in the memory referenced by the pointer.

If I then pass the pointer from inside the raw image function to a function to create a JPEG file from the raw data then it works correctly.

If I first wait for the raw image function to finish and then call the JPEG function using the pointer I passed to the raw image function then it fails to create the image.

A simplified version of the code is below:

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;
}

My question is what am I doing wrong and how can I pass the rawData pointer to the writeJPEGBFile() function successfully in the main() function?


The definition for scanGetFrame() is as follows:

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

The scanGetFrame() function comes from a 3rd party library that I am linking with so I will not be able to change the definition.

Upvotes: 0

Views: 189

Answers (2)

Blazanor
Blazanor

Reputation: 175

I managed to work it out. Thanks to all for the pointers which led me to the solution:

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;
}

Upvotes: 0

Jonathan Leffler
Jonathan Leffler

Reputation: 753695

Given that rawData is a null pointer in main(), you almost certainly need to revise the interface to getRawImage() so that it takes a char ** and you pass &rawData to it. You also need to think about how the calling code will know how big the data is.

Upvotes: 1

Related Questions