Синтаксическая ошибка с доступом к макро-массиву - PullRequest
1 голос
/ 10 ноября 2010

Я пытаюсь прочитать значения из двумерного массива и умножить их, чтобы создать новый массив массива.Это не совсем важно.

Я создал макрос для чтения значений вместо функции, чтобы теоретически быть более эффективным, но у меня есть синтаксическая ошибка, которую я не могу понять.Строка выдачи

    // 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

но я не могу понять, в чем проблема.

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

Прежде всего, вам необходимо заключить аргументы макроса в скобки.

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

Во-вторых, вы должны использовать A вместо A* для разыменования.A* недействителен вообще, но вы, возможно, хотели &A (что также фактически неверно)?

В-третьих, в этом случае макрос на самом деле не дает никаких преимуществ по сравнению с простым доступом к массиву..

В-четвертых, вы объявили A как одномерный массив, вы не можете использовать его как многомерный.Получение адреса одномерного массива не позволяет автоматически переключаться на «следующую» строку, поскольку C ++ не знает, насколько большой будет эта строка.

0 голосов
/ 10 ноября 2010

Я не вижу смысла использовать макрос READ здесь. Если вам нужно использовать эту семантику, вам нужно сделать:

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