У меня проблема с передачей указателя на функцию. Когда функция возвращает указатель, кажется, что он отличается от того, что находится в функции.

Поэтому я передаю указатель на функцию, которая получает необработанные данные изображения, которые затем должны быть сохранены в памяти, на которую ссылается указатель.

Если затем я передаю указатель изнутри функции необработанного изображения функции для создания файла 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
Blazanor 8 Окт 2014 в 10:45
Как scanGetFrame добавляет данные?
 – 
juanchopanza
8 Окт 2014 в 10:50
1
Вы пытались напечатать переменные указателя в обоих случаях непосредственно перед тем, как они будут переданы writeJPEGBFile ?
 – 
Hrishi
8 Окт 2014 в 10:51
Похоже, scanGetFrame — это макрос, который принимает адрес pBuffer или что-то в этом роде. В противном случае я не вижу, чтобы это работало. Не могли бы вы опубликовать определение scanGetFrame?
 – 
M Oehm
8 Окт 2014 в 10:51
1
Кто отвечает за выделение памяти, на которую указывает rawData? У вас есть бесплатная, но я не вижу в коде malloc. Если getRawImage должен изменить указатель, он должен получить char** вместо char*.
 – 
Claudio
8 Окт 2014 в 10:52
Память выделяется в getRawImage() следующим образом: pBuffer = (unsigned char *) malloc(ImageSize.nImageSize);
 – 
Blazanor
8 Окт 2014 в 13:15

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;
}
0
Blazanor 13 Окт 2014 в 09:31

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

1
Jonathan Leffler 8 Окт 2014 в 10:55
Можете ли вы предложить возможное решение, учитывая, что scanGetFrame() ожидает, что параметр 2 будет char *? Это мой первый проект на C, хотя я много лет работал с PHP, Java и C#, но я все еще привыкаю к ​​указателям C и распределению памяти. Спасибо за ваше время.
 – 
Blazanor
9 Окт 2014 в 00:32
Я ожидаю интерпретировать FTR_PVOID как "указатель на void" или void *, но вместо этого он может быть сопоставлен с char *. Поскольку я ничего не знаю о библиотеке, извините, я больше не могу помочь. Вам нужно знать, что делает функция и как должен работать ее интерфейс. Без мануала делать нечего. Поиск в Google по запросу ftrScanGetFrame, кажется, предлагает Futronics Fingerprint Reader в качестве библиотеки, но вы должны определить, используете ли вы ее, а также канонический URL-адрес библиотеки и ее документации.
 – 
Jonathan Leffler
9 Окт 2014 в 07:07