-1

我正在使用 Microsoft Visual Studio 2010 编写 C 代码。这是我定义的一段代码:

#define setImagVal_Matrix(matrix,type,x,y,val) \
(getImagVal_Matrix(matrix,type,x,y) = (val))

然后我在这个函数中使用它:

for(bands=0; bands < no_of_bands; bands++) {
outputmatrix[bands] =  new_Matrix(yrange,xrange,getDataType_Image(inputImage),getDataFormat_Image(inputImage));
    for(r=0; r < no_of_rows; r++) {
        for(c=0; c < no_of_cols; c++) {
            if(c<x1 || c>x2 || r<y1 || r>y2)
            {
                continue;
            }
            else
            {
                  setImagVal_Matrix(outputmatrix[bands],getDataType_Matrix(outputmatrix[bands]),c-x1,r-y1,123);
            }
        }
    }
}

但是,它在 setImagVal_Matrix 函数调用上向我显示了此错误:
“错误:预期表达式”

当我构建解决方案时,这里是在同一行显示语法错误的输出:
1>c:\cviplab-net-2010\cviplab\crop.c(50): error C2059: syntax error : ')'

花了几个小时后,我仍然找不到错误的原因。知道如何解决吗?

编辑:
我分析了预处理文件并发现了语法错误,但我仍然不知道如何修复它。这是导致错误的行:
((((((outputmatrix[bands])->data_type) **)((outputmatrix[bands])->iptr))[r-y1][c-x1]) = (123));
错误是针对) 之后的**

4

3 回答 3

2

停止使用宏作为函数。尝试这个:

inline void setImagVal_Matrix(int matrix, int type, int x, int y, int val) {
    getImagVal_Matrix(matrix, type, x, y) = val;
}

根据需要更改int类型,您将获得编译器帮助您提供有用的错误消息,而不是神秘的错误消息。哎呀,它甚至可以帮助您找出参数类型。

于 2013-02-28T14:40:41.530 回答
0

在您的宏中,您对看起来不像左值的东西进行赋值。你的意思是==

于 2013-02-28T14:41:11.727 回答
0

我想建议至少为宏参数使用括号:

#define setImagVal_Matrix((matrix),(type),(x),(y),(val)) \
       (getImagVal_Matrix((matrix),(type),(x),(y)) = (val))

另外,要查看它是否真的是括号问题,您可以尝试查看预处理文件。

但是,实际上为此目的使用宏并不是一个好的做法。如果您关心函数调用,您可以创建函数inline

inline void setImagVal_Matrix(matrix,type,x,y,val) {
    getImagVal_Matrix(matrix,type,x,y) = val;
}

尽管这inline只是对编译器的建议,但这将避免很多编译错误并且几乎不调试运行时错误。

于 2013-02-28T14:55:56.283 回答