2014-10-08 6 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() успешно в основной функции()?


Определение для scanGetFrame() выглядит следующим образом:

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

Функция scanGetFrame() происходит от 3-сторонней библиотеки, что я связывающей с, так что я не буду иметь возможность изменить определение ,

+0

Как «сканироватьGetFrame» добавлять данные? – juanchopanza

+1

Вы пробовали печатать переменные указателя в обоих случаях, прежде чем они передаются в 'writeJPEGBFile'? – Hrishi

+0

Похоже, что 'scanGetFrame' - это макрос, который принимает адрес' pBuffer' или некоторых таких. В противном случае я не вижу, чтобы это работало. Не могли бы вы опубликовать определение 'scanGetFrame'? –

ответ

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

Учитывая, что rawData является нулевым указателем в main(), вы почти наверняка нужно пересмотреть интерфейс getRawImage() так, что он принимает char ** и проходите &rawData к нему. Вам также нужно подумать о том, как код вызова будет знать, насколько велики данные.

+0

Можете ли вы предложить возможное решение, учитывая, что scanGetFrame() ожидает, что параметр 2 будет char *? Это мой первый проект на C, хотя я много лет работал с PHP, Java и C#, но я все еще привык к указателям на C и распределению памяти. Спасибо за ваше время. – Blazanor

+0

Я ожидал бы интерпретировать 'FTR_PVOID' как 'указатель на void' или' void * ', но вместо этого он может быть отображен на' char * '. Поскольку я ничего не знаю о библиотеке, извините, я больше ничего не могу поделать. Вам нужно знать, что делает функция, и как ее интерфейс должен работать. Без руководства ничего не делать. Поиск Google для 'ftrScanGetFrame', кажется, предлагает Futronics Fingerprint Reader в качестве библиотеки, но вы должны определить, используете ли вы это, канонический URL-адрес библиотеки и ее документации. –

Смежные вопросы