C erreur: attendu expression before '{' token
C'est le code http://pastebin.com/Y7zQkVHZ
et le compilateur me donne l'erreur ci-dessus. Quelle est l'erreur ?
merci(:
Voici le code sous une forme immédiatement lisible:
#include <stdio.h>
#define round(a) { \
if(a < 0) \
((a + 0.5) < (int)a)? (int)a: (int)a + 1; \
else \
((a - 0.5) < (int)a)? (int)a: (int)a + 1; \
}
#define ARRLENG 8 /* array length */
/* function prototype */
void arrRounder(double[ARRLENG]);
int main()
{
double arr[ARRLENG] = {2.13, 6.9, 9.49999, 0.5, 8.0, 0, -2.4, -2.5};
arrRounder(arr);
return 0;
}
void arrRounder(double arr[ARRLENG])
{
int i = 0;
for(i = 0; i < ARRLENG; i++)
arr[i] = round(arr[i]);
for(i = 0; i < ARRLENG; i++)
printf("%lf\n", arr[i]);
}
- Regardez de plus près à votre tour (la) de la macro et de la façon dont vous l'utiliser.
- Multilines macro ne sont pas mal? N'est-il pas préférable d'utiliser les fonctions de la place?
- Écrit comme une fonction de cette chose est très probable en l'optimiseur de toute raisonnable compilateur. Je ne suis pas sûr de ce que vous êtes l'espoir de gain par l'écriture d'une macro, mais de le suspendre que l'espoir d'un peu de raison et il suffit d'écrire une fonction.
- Et quel est le problème avec l'aide de la fonction round() en mathématiques.h?
Vous devez vous connecter pour publier un commentaire.
Votre
round()
macro est en effet un mélange de déclaration et d'expression, ce qui n'est pas permise dans cette voie.Soit vous devez transformer le
if
dans un autre opérateur ternaire - ce qui rend l'ensemble encore plus illisible ou vous devez le mettre dans une fonction.Le préprocesseur remplace
rounder
avec la macro corps verbatim. Si vous disposez d'une ligne qui ressemble àQui n'est pas valide C déclaration.
Macro invocations pourrait ressembler à des appels de fonction, mais ils ne le sont pas.
En supposant que votre algorithme arrondi est solide, cela fait la même chose dans l'expression de la forme:
Note tous les parenthèses autour de
a
, dans le cas où c'est un sans parenthèse expression. C'est le meilleur (nécessaire) de la pratique dans les macros.Je n'ai pas essayé ce code avec d'autres chiffres, mais devrait fonctionner correctement. Essayez de trouver un moyen d'éviter que l'opérateur de cast
(int)
parce que peut avoir surprendre les résultats.selon moi, vous devriez utiliser de simples accolades à la place de curley. découvrez pour la Syntaxe de la définition d'une macro.