problème de macro ou define

j'ai besoin d'initialiser des blocs de NSMutableString. J'ai donc écrit:
les strings sont déclarés dans une interface et j'ai programmé:#define placeString(Xyz) Xyz=[NSMutableString stringWithCapacity:50];[Xyz setString:@";"];[Xyz retain]
#define multiStrings(xa, xb, xc, xd, xe, xf, xg, xh, xi, xj) placeString(xa);placeString(xb);\
placeString(xc);placeString(xd);placeString(xe);placeString(xf);\
placeString(xg);placeString(xh);placeString(xi);placeString(xj);
ça marche, mais je ne trouve pas cela très élégant ni très pratique. Notamment je ne peux faire varier le nombre de string-paramètres. Si vous êtes familier de ce genre de chose, comment feriez vous?multiStrings(string0, string1, string2, string3, string4, string5, string6, string7, string8, string9 )
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bien sur tu peux en faire une fonction à nombre de paramètre variable si tu ne veux pas du NSMUtableString**, ou tu peux aussi utiliser un NSArray.
Il y a bien la possibilité de faire des macros à nombre variable d'argument, mais pour réutiliser ces arguments directement dans l'expansion dans la macro. Par exemple : que tu peux utiliser avec autant d'arguments que tu veux derrière l'argument format... mais cette liste au nombre arbitraire d'arguments ne sera que réutilisée telle quel dans stringWithFormat (les ## devant __VA_ARGS__ servant à enlever la virgule si cette liste n'est pas spécifiée, cf la doc ici) Mais de là à appliquer reccurrsivement une macro placeString sur chacun de tes arguments... ça par contre ça m'étonnerait que ce soit jouable.
La seule solution que je connaisse (enfin que j'ai pu voir pratiquer) c'est de définir des trucs du genre Ou alors faut passer par une fonction et pas par une macro, ou un NSArray (ou tableau C, etc...) bien sûr sinon ([EDIT] Ah ben comme a proposé Leeroy)
Tu peux faire une méthode avec des paramètres multiples
CocoaWithLove en parle ici
A+
Le problème est que je veux appliquer 4 macros à des séries de trois NSMutableString. Ma solution actuelle est:
les définitions et les exemples d'applications sur un groupe de trois: ça marche et ça réduit le nombre de lignes par trois ce qui n'ai déjà pas si mal.
Je vais pas de te faire ton code mais toutes tes macro sont écrivable en C standard (en passant pas des pointeurs), en plus tu y gagne avec un nombre de paramètre variable.
#define placeString(Xyz) Xyz=[NSMutableString stringWithCapacity:50];[Xyz setString:@";"];[Xyz retain]
Tu peux gagner un peu d'octets en faisant :
#define placeString(Xyz) Xyz=[NSMutableString stringWithCapacity:0];[Xyz retain]
Normalement l'allocation met la chaine à @";";
@ devulder
Très bien l'article sur CocoaWithLove
@Leeroy
NSMUtableString** ne me gène pas et c'est la seule solution pour initialiser les NSMUtableString car on ne peut faire un NSArray avec des objets inexistants (j'ai bêtement essayé, mais à ma décharge je ne suis qu'un amateur).
Pour t'en servir tu passe l'adresse d'un NSMutableString** que tu viens de créer. Tu peux aussi mettre le code dans un fichier .mm (obj-C++) pour tirer partie des références du C++ et ainsi simplifier la fonction.