C ++ / LabVIEW interop: ошибка при извлечении данных из массива LabVIEW / непредвиденное преобразование типа в параметре функции - PullRequest
0 голосов
/ 17 января 2012

Я использую Класс совместимости массива LabVIEW-C ++ Cluebat-man, , и я получаю ошибку при извлечении данных из массива. Или, скорее, извлечение данных происходит успешно, но сборка завершается неудачно, когда я пытаюсь использовать данные строкой позже.

(Контекст: программа предназначена для реализации фильтрации по одноранговым группам Манджуната и его коллег; функция предназначена для извлечения плоскости оттенка изображения. Я вполне уверен, что это не проблема с конкретной функцией, за исключением, возможно, его объявление параметров, потому что та же проблема возникает позже в программе, когда я пытаюсь использовать результаты из getHuePlane())

#ifndef IO_TYPE //Normal arrays or LabVIEW?
#define I_TYPE  /* int* */ CLvArrayHandlePtr<unsigned __int32, 2>
#define O_TYPE /* int* */ CLvArrayHandlePtr<unsigned __int8, 2>
#define IO_TYPE
#endif

#ifndef USING_LABVIEW_DEFINED
#define USING_LABVIEW //remove if not
#define USING_LABVIEW_DEFINED
#endif

Извлечение и вызов функции:

#include "LvArrayIndexer.h"
#include "LvArrayTemplate.h"

O_TYPE pgf(I_TYPE HSLimage, int width, int height, int halfWindowSize, int noiseThreshold) {
#ifdef USING_LABVIEW
    size_t size[2] = {width, height};
    HSLimage.Resize(size);
    CLvArrayIndexer<unsigned __int32, 2 > baseImgIndexer(HSLimage);

    CLvArrayHandlePtr<unsigned __int8, 2 > hueImage;
    hueImage.Resize(size);
    CLvArrayIndexer<unsigned __int8, 2 > hueImgIndexer(hueImage);

    int LvImageData[width][height];
#else
    int hueImage[width][height];
#endif
    int hueImageData[width][height];
    int windowSize = 2 * halfWindowSize - 1;
    int windowLength = windowSize * windowSize;
    int window[windowSize][windowSize];
    int flattenedWindow[windowLength];
    vector<int> peerGroup;
    int currentValue;

#ifdef USING_LABVIEW
    for (int x = 0; x < width; x++)
        for (int y = 0; y < height; y++)
            LvImageData[x][y] = baseImgIndexer[x][y];

    hueImageData = getHuePlane(LvImageData, width, height);
#else
    hueImageData = getHuePlane(HSLimage, width, height);
#endif
//Function continues
}

Определение функции:

int* getHuePlane(int* HSLimage, int width, int height) {
    int hueImage[width][height];
    double calcValue;

    /*Get hue plane
     *AL HU SA LU ->AL HU.SA LU -> AL HUF
     *AL HU -> AL.HU -> 0.HU -> HU
     */
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            calcValue = int(double(HSLimage[x][y]) / 65536); //A-H-S-L; removes S-L
            calcValue = (calcValue / 256) - int(calcValue / 256);
            calcValue = calcValue * 256;
            hueImage[x][y] = int(calcValue);
        }
    }

    return hueImage;
}

Ошибка:

pgf.cpp:88:58: error: cannot convert 'int (*)[(((unsigned int)(((int)height) + -0x000000001)) + 1)]' to 'int*' for argument '1' to 'int* getHuePlane(int*, int, int)'

Системная информация:

  • IDE: Netbeans 7.1
  • Компилятор: MinGW (gcc v4.6.2)
  • Марка: GNU make 3.79.1
  • Система: Windows 7 версии 6.1

1 Ответ

0 голосов
/ 17 января 2012

Я предполагаю, что ошибка в этой строке:

hueImageData = getHuePlane(LvImageData, width, height);

Причина заключается в несоответствии типов: LvImageData определяется как int [][], а getHuePlane ожидает int *.

Кроме того, вы также должны получить сообщение об ошибке в этой строке (в getHuePlane):

calcValue = int(double(HSLimage[x][y]) / 65536); //A-H-S-L; removes S-L

Это потому, что HSLimage в функции является int *, пока вы пытаетесьполучить доступ к нему как int [][] (или int *[] в соответствии с типом аргумента).

...