У меня проблема с передачей указателя на функцию. Когда функция возвращает указатель, кажется, что он отличается от того, что находится в функции.
Поэтому я передаю указатель на функцию, которая получает необработанные данные изображения, которые затем должны быть сохранены в памяти, на которую ссылается указатель.
Если затем я передаю указатель изнутри функции необработанного изображения функции для создания файла 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 () поступает из сторонней библиотеки, с которой я связываюсь, поэтому я не смогу изменить определение.
2 ответа
Мне удалось это решить. Спасибо всем за указатели, которые привели меня к решению:
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;
}
Учитывая, что rawData
является нулевым указателем в main()
, вам почти наверняка потребуется изменить интерфейс на getRawImage()
, чтобы он принимал char **
, а вы проходили &rawData
к нему. Вам также необходимо подумать о том, как вызывающий код будет знать, насколько велики данные.
FTR_PVOID
как "указатель на void" или void *
, но вместо этого он может быть сопоставлен с char *
. Поскольку я ничего не знаю о библиотеке, извините, я больше не могу помочь. Вам нужно знать, что делает функция и как должен работать ее интерфейс. Без мануала делать нечего. Поиск в Google по запросу ftrScanGetFrame
, кажется, предлагает Futronics Fingerprint Reader в качестве библиотеки, но вы должны определить, используете ли вы ее, а также канонический URL-адрес библиотеки и ее документации.
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
scanGetFrame
добавляет данные?writeJPEGBFile
?scanGetFrame
— это макрос, который принимает адресpBuffer
или что-то в этом роде. В противном случае я не вижу, чтобы это работало. Не могли бы вы опубликовать определениеscanGetFrame
?