C++/LabVIEW 互操作:从 LabVIEW 数组中提取数据时出错/函数参数中出现意外类型转换

发布于 2024-12-27 09:03:13 字数 2891 浏览 3 评论 0原文

我正在使用 Cluebat-man 的 LabVIEW-C++ 数组互操作类,我从数组中提取数据时遇到错误。或者更确切地说,数据提取似乎成功,但当我稍后尝试使用数据时,构建失败。

(上下文:该程序旨在实现 Manjunath 等人的同级组过滤;该函数旨在提取图像的色调平面。我相当确定这不是特定函数的问题,除了它的声明之外参数,因为当我尝试使用 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

I'm using Cluebat-man's LabVIEW-C++ array interoperability class, and I'm getting an error extracting the data from from the array. Or, rather, the data extraction appears to succeed, but build fails when I try to use the data a line later.

(Context: The program is designed to implement Manjunath et al's peer-group filtering; the function is designed to extract the hue plane of an image. I'm fairly certain it's not a problem with the specific function, aside from perhaps its declaration of parameters, because the same problem crops up later in the program when I try to use the results from 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

Extraction and function call:

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

Function definition:

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

The error is:

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)'

System information:

  • IDE:Netbeans 7.1
  • Compiler: MinGW (gcc v4.6.2)
  • Make: GNU make 3.79.1
  • System: Windows 7 version 6.1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

琉璃梦幻 2025-01-03 09:03:13

我猜错误就在这一行:

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 *[] 作为参数类型)。

I'm guessing the error is on this line:

hueImageData = getHuePlane(LvImageData, width, height);

The reason is because of type missmatch: LvImageData is defined as int [][] while getHuePlane expects int *.

Also, you should also get an error on this line (in getHuePlane):

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

This is because HSLimage in the function is an int * while you try to access it as int [][] (or int *[] as the argument type should really be).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文