错误,宏观协议分歧

error, disagreement in macro agreements

我正在尝试编译一个 .c 文件来处理 mMIPS 指令集中的硬件剪辑,但是我似乎在“'results=sfu1'”行收到错误“'Disagreement in number of macro arguments'”当我尝试使用 lcc -o mips_mem.bin image.c 编译我的文件时。我不明白为什么它会给我这个错误。
这是 image.c:

 #define WIDTH   8
 #define HEIGHT  8

 #define sfu0(a, b) ((a) +((b) + *(int *) 0x12344321)) //clipping
 #define sfu1(a, b) ((a) -((b) + *(int *) 0x12344321)) //dividing by 13
 #define sfu2(a, b) ((a) +((b) - *(int *) 0x12344321)) /less multiplications

  void main(void)
 {
int a, b, result;
int max = 255;
char *buf_i = (char*)0x401000, *buf_o = (char*)0x402000;


for (a = 1; a < HEIGHT - 1; a++)
{
    for (b = 1; b < WIDTH - 1; b++)
    {
        result = sfu1((
                     -7*(int)buf_i[(a - 1) * WIDTH + b - 1] +
                      5*(int)buf_i[(a - 1) * WIDTH + b    ] +
                      2*(int)buf_i[(a - 1) * WIDTH + b + 1] +
                     -1*(int)buf_i[ a      * WIDTH + b - 1] +
                     15*(int)buf_i[ a      * WIDTH + b    ] +
                     -1*(int)buf_i[ a      * WIDTH + b + 1] +
                      2*(int)buf_i[(a + 1) * WIDTH + b - 1] +
                      5*(int)buf_i[(a + 1) * WIDTH + b    ] +
                     -7*(int)buf_i[(a + 1) * WIDTH + b + 1] +
                    128));

        /* Clipping */
        buf_o[a * WIDTH + b] = ((result) + ((max) + *(int *) 0x12344321));
    }
}

}

谁能解释一下这个错误的含义以及如何修复它?

sfu1 宏需要 2 个参数,但您只提供一个。

这段代码会导致同样的错误:

result = sfu1(1);

更正:

result = sfu1(

               -7 * (int)buf_i[(a - 1) * WIDTH + b - 1] +
               5 * (int)buf_i[(a - 1) * WIDTH + b] +
               2 * (int)buf_i[(a - 1) * WIDTH + b + 1] +
               -1 * (int)buf_i[a      * WIDTH + b - 1] +
               15 * (int)buf_i[a      * WIDTH + b] +
               -1 * (int)buf_i[a      * WIDTH + b + 1] +
               2 * (int)buf_i[(a + 1) * WIDTH + b - 1] +
               5 * (int)buf_i[(a + 1) * WIDTH + b] +
               -7 * (int)buf_i[(a + 1) * WIDTH + b + 1] +
               128

             , 2  // <<<<<<<<< missing argument in your snippet
            );

我只是添加了 2 作为第二个参数作为示例,因此您的程序编译没有错误,但它可能无法运行。我不知道这些宏的第二个参数应该是什么。

您的代码可能不正确或调用了未定义的行为,但这是另一个问题。