Arrière-plan de la question:
void dash(int *n, char c)
est de dessiner des caractères c séparés par '+'.
Le paramètre n
est un tableau d'entiers, par ex. {1, 3, 2} et '-' pour c
devraient donner "+ - + --- + - +", ce qui fonctionne bien. Pour utiliser le tiret je fais {int f={1, 3, 2}; dash(f, '-');}
, ce qui rend la copie de construction & passable.
La question elle-même:
Pour éviter & copier-coller que je voulais faire #define F(X, Y) {int f=X; dash(f, Y);}
, entraînant une F({1, 3, 2}, '-')
bien utilisable.
Malheureusement, le compilateur se plaint de l'obtention de 4 arguments (longueur de tableau + 1) au lieu de 2.
Alors, comment pouvez-vous donner {1, 3, 2}
comme paramètre à une macro?Initialisation du tableau C via la macro
Répondre
macros VARIADIC sont une caractéristique de C99.
#define F(Y,...) dash((int[]){__VA_ARGS__},Y)
Alors, comment pouvez-vous donner {1, 3, 2} comme paramètre à une macro?
F('-',1,3,2);
Essayez F(({1, 3, 2}), '-')
Cela ne s'étend pas à la bonne C. valide –
Au lieu d'essayer d'utiliser une macro pour mettre en place et faire ces appels, je serais probablement envisager de changer l'interface dash()
utiliser varargs:
#include <stdarg.h>
void dash(char c, ...)
{
// ...
}
int main() {
dash('+', 1, 3, 2, -1); // note: negative number indicates
// the end of the list of numbers
return 0;
}
L'utilisation de varargs n'est pas la meilleure chose au monde (ils sont difficiles à utiliser et ne sont pas sûrs), mais je pense que ce serait mieux que la concoction de macro que vous essayez de générer. De plus, rappelez-vous que même si vous restez avec votre interface actuelle pour dash()
et créez une macro qui fait ce que vous voulez, vous devez toujours avoir un moyen d'indiquer la fin de la séquence de nombres à transmettre dash()
. Sinon, le tableau de bord ne peut pas savoir quand il a atteint la fin du tableau. Vous avez plusieurs choix:
- utiliser une valeur sentinelle, tel que 0, -1, ou tout nombre négatif (comme dans l'exemple vararg ci-dessus)
- passe le nombre d'éléments dans le tableau comme un argument
- Définissez la taille de la baie comme faisant partie de l'interface
dash()
. Dans votre exemple,dash()
peut nécessiter la transmission d'un tableau de 3 ints. Pas plus, pas moins (en fait, plus serait OK - ils ne seraient tout simplement pas utilisés). Si vous avez fait cela, la réparation de votre macro serait beaucoup plus facile, mais je suppose que ce n'est pas la façon dont vous voulez que le tableau de bord se comporte.
Voici ma version:
#include <stdio.h>
void dash(int len, int *n, char c){
int i;
printf("dash(%i, {", len);
for(i=0; i<len-1; i++)
printf(" %i,", n[i]);
printf(" %i }, '%c')\n", n[i], c);
}
#define NOPAREN(...) __VA_ARGS__
#define F1(arr,char) { int f[]={NOPAREN arr}; dash(sizeof(f)/sizeof(f[0]),f,char); }
#define F2(char,...) { int f[]=__VA_ARGS__; dash(sizeof(f)/sizeof(f[0]),f,char); }
int main(void){
F1((1,3,2), '-');
F2('-', {4,6,5});
}
Résultat:
dash(3, { 1, 3, 2 }, '-')
dash(3, { 4, 6, 5 }, '-')
Vous pouvez passer { 1, 3, 2 }
comme argument à une macro si vous définissez { 1, 3, 2 }
comme une autre macro
#define PARAMS { 1, 3, 2 }
F(PARAMS, '-')
#undef PARAMS
Malheureusement, il semble y avoir aucun di façon rectale de faire littéralement ce que vous demandez, c'est-à-dire passer spécifiquement { 1, 3, 2 }
sous cette forme spécifique. Il pourrait être utile de passer à d'autres méthodes, y compris les méthodes spécifiques au C99 suggérées dans d'autres réponses.
- 1. C++ Initialisation du tableau
- 2. Initialisation du tableau dans la structure - C?
- 3. php Initialisation du tableau
- 4. C initialisation d'un tableau
- 5. C++ initialisation classe tableau instance
- 6. Initialisation du tableau en F #
- 7. Java initialisation du tableau 3D
- 8. Initialisation de la structure par l'utilisation excessive de la macro
- 9. Initialisation du tableau bidimensionnel de structures en C++
- 10. Initialisation de tableau dans C++ géré
- 11. C++: Initialisation du champ hérité
- 12. Initialisation d'un tableau de structures en C#
- 13. initialisation du vecteur rapide C++
- 14. initialisation de la matrice C++
- 15. Initialisation du tableau d'objets avec les données du fichier texte
- 16. Initialisation de tableau dynamique
- 17. initialisation statique en C
- 18. initialisation de tableau Scala
- 19. Initialisation d'un tableau après déclaration
- 20. VB.Net Initialisation d'un tableau à la volée
- 21. C# Initialisation du tableau - avec une valeur autre que la valeur par défaut
- 22. initialisation du tableau direct avec une valeur constante
- 23. Chemin complet du fichier C/C++ dans la macro assert
- 24. C/C initialisation du tableau privé dans le fichier d'en-tête
- 25. Initialisation des variables de tableau
- 26. initialisation d'un tableau 2-dim en Scala
- 27. à l'intérieur du thread C++, initialisation de la référence
- 28. C# Variable Question Initialisation
- 29. Initialisation du tableau de structure et littéraux de chaîne
- 30. Initialisation du constructeur à partir du cache stocké en C#
La façon dont 'dash' détermine le nombre d'éléments dans le tableau n'est pas claire. Y a-t-il toujours 3? –
Je l'ai implémenté pour arrêter au dernier élément, qui doit être 0. Mais ce n'était pas important pour la question elle-même, donc je l'ai laissé ici. –