2010-11-09 9 views
1

Je tente de lire les valeurs d'un tableau à deux dimensions et de les multiplier pour créer un nouveau tableau. Ce n'est pas entièrement important.Erreur de syntaxe avec accès au tableau de macro

J'ai créé une macro pour lire les valeurs au lieu d'une fonction pour être théoriquement plus efficace, mais j'ai une erreur de syntaxe que je ne peux pas comprendre. La ligne d'émission est

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

avec en-tête de la fonction

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

La macro est

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

et quand je tente de compiler ce je reçois

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 

mais je ne peut pas tout à fait comprendre ce que le problème est.

+2

«J'ai créé une macro pour lire les valeurs au lieu d'une fonction d'être théoriquement plus efficace » C'est où vous êtes allé mal. Pourquoi coderiez-vous pour des avantages théoriques? Vous devriez coder pour la propreté et l'élégance. Quand vous avez terminé *, vous pouvez profiler votre code, savoir où sont les parties lentes et les corriger. Deviner est sans valeur. – GManNickG

+0

En outre, vous ne pouvez pas indexer en deux dimensions, juste le début et la taille. Vous avez également besoin d'une largeur pour effectuer l'arithmétique. Voir les commentaires sur la réponse de Vlad. – GManNickG

Répondre

3

Tout d'abord, vous devez placer vos arguments de macro entre parenthèses.

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

Deuxièmement, vous devez utiliser A au lieu de A* pour déréférencement. A* n'est pas valide du tout, mais vous vouliez peut-être &A (qui est aussi incorrect)? Troisièmement, dans ce cas, la macro n'apporte aucun avantage par rapport au simple accès au tableau. Quatrièmement, vous avez déclaré A en tant que tableau à une dimension, vous ne pouvez pas l'utiliser en tant que tableau multidimensionnel. Prendre une adresse d'un tableau unidimensionnel ne vous permet pas de passer automatiquement à la ligne "suivante", car C++ ne sait pas quelle sera la taille de la ligne.

+0

Cela ne devrait-il pas être 'READ (r, c, A)'? Le déréférencement ne ferait que vous donner un entier; vous ne pouvez pas indexer cela. Même alors, '(arr) [a]' aboutit à un entier qui ne peut pas être indexé via 'b'. Le code est cassé. – GManNickG

+0

@GMan: en effet, la signature de la fonction dit que A est un pointeur vers int, donc ce code n'est pas valide dans tous les cas. – Vlad

+0

désolé les gars, j'ai mal interprété le code. A est un tableau à deux dimensions stocké sous la forme d'un tableau à une dimension dans l'ordre majeur d'une ligne. Merci. – Rowhawn

0

Je ne vois pas le point d'utiliser la macro READ ici. Si vous avez à l'utilisateur cette sémantique, vous devez faire:

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