2017-09-22 7 views
1
#include <stdio.h> 

#define mean(x,N) (double _sum=0.0; for (int _i=0;_i<N;++_i) _sum+=x[_i]; _sum/N) 

int main() { 
    const int N=100; 
    int i[N]; double d[N]; 
    // here we fill the arrays with data, and then 
    printf("%f %f %f\n", mean(i,N), mean(d,N)); 
} 

comment peut-on définir la macro appropriée dans le plus pur C, ou y parvenir d'une autre manière sans coder deux fonctions?Syntaxe du préprocesseur C pour la fonction multi-instructions?

+0

Ne peut pas être fait. pas avec une boucle. – cleblanc

+0

Le problème est qu'il est très très difficile de renvoyer une valeur à partir d'une macro multi-instructions. Vous pouvez le faire si vous pouvez construire la macro multi-instructions comme une simple virgule, mais quand vous le faites de cette façon, vous ne pouvez pas déclarer de variables locales, comme le '_sum' dont vous avez besoin ici. –

+0

Deux possibilités: (1) gcc a une extension où une boucle peut renvoyer une valeur, de sorte que pourrait fonctionner. (2) Utilisez C++ et un modèle. –

Répondre

1

Une macro ne fonctionnera pas dans cette situation.

un paramètre à une fonction doit être une expression. Ce que vous avez ci-dessus n'est pas une expression mais une séquence d'énoncés. Vous ne pouvez pas contourner cela avec la boucle que vous avez.

Il suffit de définir des fonctions, on accepter un double * et un int et l'autre d'accepter un int * et un int, pour effectuer cette action. Ne pas utiliser une macro où une fonction va faire.

+0

Alors que je suis d'accord qu'une fonction (ou une fonction inline) serait une bien meilleure solution, il existe https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html (si votre compilateur le supporte). – melpomene

1

Il n'y a aucun moyen portable pour écrire une macro pour renvoyer une valeur à partir d'une déclaration, en particulier une déclaration complexe. Vous voulez utiliser une macro pour implémenter une chose polymorphe ... Vous pouvez utiliser des fonctions surchargées C++ à cette fin.

Pour C, vous pouvez écrire une macro qui met à jour une variable et transmettre cette variable à printf. Prenez garde que les macros sont des sources notoires de bogues non triviaux.

Vous pouvez également utiliser les fonctions génériques C11, mais le soutien de ceux-ci est souvent manquante.

Voici une tentative:

#include <stdio.h> 

#define set_mean(res,x,N) do { res = 0; for (int i_ = 0; i_ < (N); i_++) res += (x)[i_]; res /= (N); } while (0) 

int main(void) { 
    const int N = 100; 
    int i[N]; 
    double d[N]; 
    double ires, dres; 
    // here we fill the arrays with data, and then 
    set_mean(ires, i, N); 
    set_mean(dres, d, N); 
    printf("%f %f %f\n", ires, dres); 
}