【问题标题】:Syntax error with macro array access宏数组访问的语法错误
【发布时间】:2010-11-09 23:06:35
【问题描述】:

我正在尝试从二维数组中读取值并将它们相乘以创建一个新的数组数组。这并不完全重要。

我创建了一个宏来读取值,而不是一个函数,理论上效率更高,但我遇到了一个我无法弄清楚的语法错误。问题线是

    // compute and write the value for the result array
        writearr( result, n, r, c, ( READ(r, c, A*) * READ(c, r, A*) ) );

带函数头

    void newarr(int n, int* A, int* result)

宏是

    #define READ(a, b, arr) (arr[a][b])

当我尝试编译时,我得到了

    gcc -Wall -O2   -c -o placeholder.o placeholder.c
    placeholder.c: In function âwritearrâ:
    placeholder.c:26: error: expected expression before â[â token
    make: *** [placeholder.o] Error 1

但我不太清楚问题是什么。

【问题讨论】:

  • “我创建了一个宏来读取值,而不是一个函数,理论上更高效”这就是你出错的地方。你为什么要编码理论优势?你应该为清洁和优雅而编码。当您完成后,您可以分析您的代码,找出慢的部分并修复它们。猜测是没有价值的。
  • 另外,你不能只给定开始和大小就二维索引。你也需要一个宽度,所以你可以执行算术。请参阅弗拉德答案中的 cmets。

标签: c arrays macros syntax-error


【解决方案1】:

首先,您需要将宏参数括在括号中。

#define READ(a, b, arr) ((arr)[a][b])

其次,您应该使用A 而不是A* 进行取消引用。 A* 根本无效,但您可能想要&A(实际上也不正确)?

第三,在这种情况下,宏实际上并没有为仅仅访问数组带来任何优势。

第四,您将 A 声明为一维数组,您不能将其用作多维数组。获取一维数组的地址不允许您自动切换到“下一个”行,因为 C++ 不知道该行的大小。

【讨论】:

  • 不应该是READ(r, c, A)吗?取消引用只会给你一个整数;你不能索引那个。即使这样,(arr)[a] 也会产生一个整数,不能通过b 对其进行索引。密码坏了。
  • @GMan:确实函数签名说 A 是一个指向 int 的指针,所以这段代码在任何情况下都是无效的。
  • 对不起,我误解了代码。 A 是以行主要顺序存储为一维数组的二维数组。谢谢。
  • @Rowhawn:那么你的宏应该类似于#define READ(a, b, arr) ((arr)[(a)*N+(b)]),其中N 是(常量!)行大小。 (或者 [(a)+(b)*N]) 如果您的订单相反。)但是内联函数要好得多!
【解决方案2】:

我看不出在这里使用 READ 宏的意义。如果你必须使用这个语义,你需要做:

writearr( result, n, r, c, ( READ(r, c, A) * READ(c, r, A) ) );

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多