Traitement du code par le préprocesseur

FloFlo Membre
avril 2008 modifié dans API AppKit #1
Bonjour,

je suis actuellement sur le développement d'une petite application de gestion boursière à  l'aide de cocoa et core data et je souhaiterai quérir votre aide...

Je dispose en effet d'une sous-classe de NSArrayController qui ajoute des comportements supplémentaires style formulaires d'ajout, fonction d'import de fichiers csv etc...

Je souhaite appliquer cette Classe à  la gestion de plusieurs entités différentes sans avoir à  créer une sous-classe spécifique pour chaque type d'entité genre CustomEntity1Controller etc...

Je me suis orienté sur l'utilisation des directives préprocesseurs mais je suis bloqué, j'ai un truc du style :

<br /> #Define PROPERTIES {&quot;id&quot;, ...}<br /> #Define COUNT = 3<br /> <br /> #Define PROPERTIES {&quot;id2&quot;, ...}<br /> #Define COUNT = 2<br /><br /> //Dans le code<br /> char * tab = PROPERTIES<br /> int i;<br /> <br /> for (i = 0 ; i &lt; COUNT ; i++)<br />  //traitement<br />


Ce que je voudrait c'est que la boucle for travail sur les bonnes propriétés en fonction de l'entité que le NSArrayController gère mais je ne sais pas trop comment faire, j'ai entendu parler de #IFDEF mais je ne sais pas s'il est adapté à  mon cas...

Le but est que le préprocesseur traite le code afin d'éviter de créer une variable locale que l'on remplirait à  l'aide de test style

<br />  if ([self entityName] == @&quot;ENTITY1&quot;)<br />


Merci d'avance pour vos réponses.

Flo

Réponses

  • Philippe49Philippe49 Membre
    00:55 modifié #2
    dans 1208023250:


    #Define PROPERTIES {"id", ...}
    #Define COUNT = 3

    #Define PROPERTIES {"id2", ...}
    #Define COUNT = 2

    déjà  cela ne devrait pas passer
    #define sans majuscule, pas de symbole =

    dans 1208023250:

    //Dans le code
    char * tab = PROPERTIES

    cela non plus : en dehors du point-virgule qui manque, comment un pointeur sur caractère peut-il pointer sur un tableau de pointeurs que représente PROPERTIES ?


    dans 1208023250:

    Le but est que le préprocesseur traite le code 


      ??????????

  • Philippe49Philippe49 Membre
    00:55 modifié #3
    dans 1208023250:



    <br /> &nbsp;if ([self entityName] == @&quot;ENTITY1&quot;)<br />
    



    Là  tu compares les adresses des chaà®nes, pas les chaà®nes ;: deux chaà®nes pourraient correspondre au même texte ENTITY1 et ne pas être à  la même adresse. Le test posé serait alors faux.
  • FloFlo Membre
    avril 2008 modifié #4
    Salut,

    Biensûr que tout ce code ne marche pas, il fallait le voir plus comme du pseudo-code, des lignes écrites pour offrir une vision globale de ce que je voudrait faire...

    En dehors des erreurs de syntaxe dues au fait qu'il ne s'agit pas exactement de ce que j'ai fait mais plutôt de l'idée (test par valeur, adresse, majuscule et point virgule etc...) je souhaite que le préprocesseur traite le code :

    c'est à  dire que le pré-traitement qu'il va effectuer remplace les constantes du code par la macro constantes du #define adéquates . En réalité, ce qu'il me manque c'est un genre de test qui définisse dans le "macro code" la valeur de PROPERTIES et de COUNT en fonction de l'entité gérée par le NSArrayController. Mais je ne sais pas si c'est possible, d'où ma question...

    Il est vrai que j'aurais du préciser qu'il s'agissait d'un genre de pseudo code, pour être plus précis :

    <br />#define PROPERTIES {@&quot;exemple1&quot;, @&quot;exemple2&quot;, @&quot;exemple3&quot;, @&quot;exemple4&quot;}<br />#define COUNT 4<br /><br />-(id)newObject<br />{<br />	id newObject = [super newObject];<br />	NSString * tab&#91;] = PROPERTIES;<br />	int i;<br />	<br />	for(i = 0; i&lt;COUNT; i++)<br />	    [newObject setValue:[sheet attributeForPosition: i] forKey:tab[i]];<br /><br />        return newObject;<br />}<br />
    

  • Philippe49Philippe49 Membre
    00:55 modifié #5

    Il y a eu plusieurs fils de discussions sur ce site au sujet des macros, beaucoup sont dans la rubrique Trucs et Astuces. Par exemple,
    http://www.objective-cocoa.org/forum/index.php/topic,2172.0.html

    Remarques
    • L'utilisation des macros en Objective-C est identique à  celle du C
    • Les utiliser, certes, mais uniquement pour clarifier le code


  • schlumschlum Membre
    avril 2008 modifié #6
    Le préprocesseur, comme son nom l'indique... préprocesse
    C'est à  dire qu'il fait les remplacements avant la compilation.

    Je ne vois donc pas comment on pourrait faire un test avec une variable dynamique dedans.

    Sinon, oui, il existe #if, #ifdef, #ifndef, mais ce sont des tests statiques toujours.
  • FloFlo Membre
    00:55 modifié #7
    Ok merci, je pense avoir la réponse à  ma question :

    En gros il m'est impossible de faire un truc du genre :
    <br />#ifdef [self entityName]<br /> #define PROPERTIES {@&quot;exemple1&quot;, @&quot;exemple2&quot;}<br /> #define COUNT 2<br />#elseif <br /> #define PROPERTIES {@&quot;exemple1&quot;}<br /> #define COUNT 1<br />
    


    Il est donc nécessaire de créer une variable locale qui contiendra les "properties" que l'on remplira à  l'aide de test (en respectant biensûr le principe de test par identité et par valeur ;))
    dans une méthode genre awakeFromNib ou init.

    Merci pour vos réponses.

  • schlumschlum Membre
    00:55 modifié #8
    Oui, complètement impossible...
    Pour le préprocesseur, "self" ne veut absolument rien dire.
Connectez-vous ou Inscrivez-vous pour répondre.