indentation du code décalée

ClicCoolClicCool Membre
Bonjour,

j'ai peut-être loupé quelques chose avec la nouvelle version d'Xcode mais je n'arrive pas à  rectifier l'indentation de mon code dès qu'un @//etc. est utilisé.

En effet dans le cadre de l'exploration des neuds d'un NSXMLDocument j'ai parfois des xPath commençant par @//
Ce que la doc confirme comme valide:
.../...You often begin an XPath expression with a double slash (?//?) followed by an element name.../...

Du reste le compilo ne bronche pas et surtout ça marche comme un charme.

Mais les 2 // fichent systématiquement le basar dans l'indentation du code qui chaque fois se décale d'un cran à  droite.

Je vais finir par avoir besoin d'un 2ème écran à  droite pour suivre le fil de mon code ...

Quelqu'un a une solution ?
Y aurait-il un réglage qui m'a échapé ???

Réponses

  • ClicCoolClicCool Membre
    20:26 modifié #2
    Bon, si je défini mes xPath vers mes balises par des static NSString en tête du .m seules les lignes commentées immédiatement en dessous sont décalées, tout rentre dans l'ordre dès le "typedef" suivant.

    Mais j'aimerais bien comprendre.
  • AliGatorAliGator Membre, Modérateur
    novembre 2006 modifié #3
    Bug de XCode et de son système d'indentation à  priori, vu les symptômes (et c'est toi le docteur ? :P)

    Essaye éventuellement avec des macros genre :
    [tt]#define XPATH(p) @ "//" #p[/tt]

    En l'utilisant avec XPATH(truc/bidule) pour générer @//truc/bidule

    Note que je ne suis même pas sûr que ça marchera car autant en C et C++ quand on met plusieurs chaines à  la suite "a" "b" "c" le compilo les traitent comme si c'était une unique chaine "abc" autant avec le "@" de l'Obj-C devant je ne sais pas si [tt]@ "cou" "cou"[/tt] est équivalent à  [tt]@coucou[/tt]... faut tester.

    [EDIT]Suis en train de penser que c'est quand même bizarre comme bug étant donné que si on fait un commentaire "//" dans le code, de façon normale et donc hors d'une chaà®ne, ça n'indente pas pour autant la ligne sur laquelle on fait le commentaire... Mais bon pour moi ça reste un bug du module d'intendation d'Xcode, à  faire remonter à  Apple.
  • ClicCoolClicCool Membre
    20:26 modifié #4
    dans 1163430196:


    [EDIT]Suis en train de penser que c'est quand même bizarre comme bug étant donné que si on fait un commentaire "//" dans le code, de façon normale et donc hors d'une chaà®ne, ça n'indente pas pour autant la ligne sur laquelle on fait le commentaire... Mais bon pour moi ça reste un bug du module d'intendation d'Xcode, à  faire remonter à  Apple.


    Je me suis fait la même réflexion,
    et pourtant elle tourne ;)

    Merci Ali, je vais tester ça ce soir.
  • ClicCoolClicCool Membre
    20:26 modifié #5
    dans 1163430196:

    Note que je ne suis même pas sûr que ça marchera car autant en C et C++ quand on met plusieurs chaines à  la suite "a" "b" "c" le compilo les traitent comme si c'était une unique chaine "abc" autant avec le "@" de l'Obj-C devant je ne sais pas si [tt]@ "cou" "cou"[/tt] est équivalent à  [tt]@coucou[/tt]... faut tester.


    Je viens de terminer mon travail et j'ai immédiatement essayé :)
    et un truc comme
    XPATH(@"tr/img")
    
    marche très bien avec ta définition de Macro.
    Merci ça me fait apprivoiser un peu plus les macros.

    Mais je me retrouve avec les même anomalies de l'indentation juste au dessous de mes délarations de macros contenant la séquence @// !!

    Par ailleurs, tant qu'à  déplacer cette indentation loufoque au début de mon .m, j'aimerais autant ne pas taper non plus le nom des tags en clair dans le code.
    Avec un
    static NSString* CCBaliseAlerteImg =@"//img";
    
    ça marche bien (sauf l'indentation immédiatement en dessous).
    Mais n'y aurait-il pas moyen d'utiliser un typedef déclarant toutes les valeurs possibles comme un type donné afin que le compilo puisse m'alerter si la valeur n'est pas du bon type?

    Je connais, dans ce sens, pour les valeurs entières:
    typedef enum CCStickCorner {<br />	CCStickCornerNo				=0,<br />	CCStickCornerTopLeft		=1,<br />	CCStickCornerTopRight		=2,<br />	CCStickCornerBottomLeft		=3,<br />	CCStickCornerBottomRight	=4<br />} CCWindowPosition;
    


    Y a-t-il un moyen de définir un type avec une liste exaustive de valeurs de type Object (comme une NSString) et non plus int ?
  • ClicCoolClicCool Membre
    20:26 modifié #6
    Pour ce qui est de l'indentation il s'agit finalement d'un bug connu.
    Inutile donc de le signaler à  Apple.
  • AliGatorAliGator Membre, Modérateur
    novembre 2006 modifié #7
    • Je n'avais pas prévu ma macro comme ça, moi... J'avais mis un "#" dans la définition de ma macro pour qu'elle "stringize" le texte passé en argument de la macro, et le but était que lors de l'appel de la macro tu ne précises pas le "//" justement (et c'est cette absence de "//" lors de l'appel à  la macro qui aurait contourné le pb)
    #define XPATH(p) @&quot;//&quot; #p<br />#define XPATH2(p) @&quot;//&quot; p<br /><br />NSString* s = XPATH(tr/img);<br />NSString* s2 = XPATH2( @&quot;tr/img&quot; );
    
      J'ai mis 2 variantes car je ne sais pas laquelle des 2 fonctionnera, si tant est qu'une des 2 fonctionne, mais le but est de générer le XPath "//tr/img" donc bien avec les "//" au début du XPath, "//" que tu ne précises pas dans ton code puisque c'est la macro qui les rajoute.Du coup au moment de définir s et/ou s2 il n'y a pas de problème d'indentation, alors que ça définit bien le XPath "//tr/img".
    • Ce n'est pas tant un typedef qu'un enum que tu utilises (un typedef est pour définir un type de données, en l'occurence le type enum. Par contre c'est le faire de définir et utiliser l'enum (énumération) qui fait que tu n'as pas le droit (erreur de compilation si tu le fais) d'utiliser d'autres valeurs que celle énumérées. Les enum ne marchent qu'avec des valeurs entières (d'ailleurs dans certains compilateurs, enum et int ont le même type, même si c'est pas tout à  fait vrai justement de par cette validation que les valeurs existent)

    Quant à  remplacer ton enum par un équivalent mais pour les chaines, ce n'est pas possible avec un enum, mais tu peux le faire :
    - soit en utilisant des chaines static (comme tu le fais)
    - soit avec des DEFINE : [tt]#define CCIMGPATH @//tr/img[/tt].

    Ce que je ne capte pas c'est en quoi l'utilisation de static NSString* comme tu le fais déjà  au début de ton programme te pose problème ? Si tu rentres un nom que tu n'as pas défini (faute de frappe par exemple "CCBalizAlerteImg"), le compilo va de toute façon te gueuler dessus, donc tant mieux, non ? Et avec les #define ça fait la même chose, donc...
    Dans quel cas voudrais-tu qu'il te gueule dessus alors que pour l'instant il ne le fait pas ?
  • 20:26 modifié #8
    dans 1163445614:

    Y a-t-il un moyen de définir un type avec une liste exaustive de valeurs de type Object (comme une NSString) et non plus int ?

    [tt]#define CCStickCornerNone @";"
    #define CCStickCornerTopLeft @cornerLeft
    ...[/tt]
  • AliGatorAliGator Membre, Modérateur
    20:26 modifié #9
    dans 1163500056:

    dans 1163445614:

    Y a-t-il un moyen de définir un type avec une liste exaustive de valeurs de type Object (comme une NSString) et non plus int ?

    [tt]#define CCStickCornerNone @";"
    #define CCStickCornerTopLeft @cornerLeft
    ...[/tt]
    dans 1163498634:

    - soit en utilisant des chaines static (comme tu le fais)
    - soit avec des DEFINE : [tt]#define CCIMGPATH @//tr/img[/tt].
    ::) Grilled à  retardement, le Renaud ? :)
    Si tu veux on échange nos statuts, pour le coup  :P
  • 20:26 modifié #10
    Nan, le grilled à  retardement, c'est parce que tu mets tellement de temps à  répondre que t'es grillé. Moi c'est parce que je ne t'ai pas lu...
  • ClicCoolClicCool Membre
    novembre 2006 modifié #11
    dans 1163500798:

    dans 1163500056:

    dans 1163445614:

    Y a-t-il un moyen de définir un type avec une liste exaustive de valeurs de type Object (comme une NSString) et non plus int ?

    [tt]#define CCStickCornerNone @";"
    #define CCStickCornerTopLeft @cornerLeft
    ...[/tt]
    dans 1163498634:

    - soit en utilisant des chaines static (comme tu le fais)
    - soit avec des DEFINE : [tt]#define CCIMGPATH @//tr/img[/tt].
    ::) Grilled à  retardement, le Renaud ? :)
    Si tu veux on échange nos statuts, pour le coup  :P


    Bon, vous disputez pas, ça répond pas tout à  fait à  ma question ça ;)

    Ce que j'aurais voulu, c'est que toutes les valeurs genre CCBaliseAlerteImg soient définie comme les seules acceptable pour un type défini par moi-même genre CCBalisesAlerte.
    De façon a ce qu'un argument de type CCBalisesAlerte ne puisse pas avoir d'autre valeur que la série de CCBaliseAlerteImg CCBaliseAlerteErrorMsg, CCBaliseAlertelastSucces etc. sans que le compilateure ne pousse sa complainte du fond des bois.

    [EDIT]
    Histoire que je balance jamais dans le code une balise hors contexte gerne CCBalisePasYaAliEtRenaudOuBruQuiVontTrouverUneSolution alors que là  le compilo en attendait  une du genre CCBalisesAlerte.
  • ClicCoolClicCool Membre
    20:26 modifié #12
    dans 1163498634:

    • Je n'avais pas prévu ma macro comme ça, moi... J'avais mis un "#" dans la définition de ma macro pour qu'elle "stringize" le texte passé en argument de la macro, et le but était que lors de l'appel de la macro tu ne précises pas le "//" justement (et c'est cette absence de "//" lors de l'appel à  la macro qui aurait contourné le pb)


    Ben oui, c'est bien ce que j'ai fait mais je me suis mal exprimmé.

    1°) en début du .m:
    #define XPATH(p) @ &quot;//&quot; #p
    

    2°) plus bas dans le code des méthodes j'utilise XPATH(@tr/img) dans:
    resultArray = [alerteHtmlDoc nodesForXPath:XPATH(@&quot;tr/img&quot;) error:&amp;error];
    


    Et ça marche :)
    merci
  • AliGatorAliGator Membre, Modérateur
    novembre 2006 modifié #13
    dans 1163505246:

    2°) plus bas dans le code des méthodes j'utilise XPATH(@tr/img) dans:
    resultArray = [alerteHtmlDoc nodesForXPath:XPATH(@&quot;tr/img&quot;) error:&amp;error];
    


    Et ça marche :)
    Tiens, étonnant ça... donc en mettant le @";" dans le paramètre de la macro, alors que je demande un stringize qui est sensé rajouter les guillemets autour du paramètre ? (donc ça marche avec [tt]XPATH(@tr/img)[/tt] et non pas [tt]XPATH(tr/img)[/tt] ?)

    Va falloir que je révise mes cours sur les macros, moi :D




    Sinon pour le truc de ton enum, ce n'est pas possible avec autre chose que des entiers (le compilateur ne sait pas faire de "strcmp" au moment de la compilation pour vérifier que 2 chaines sont identiques !)... par contre...

    Par contre tu peux utiliser les enum si tu mets un système adéquat derrière. Par exemple un tableau (pourquoi pas de type C, pour le coup ça suffit carrément, pas besoin d'un NSArray) :
    static NSString* CCTagsList&#91;] = {<br />&nbsp; /* 0 */ @&quot;//tr/img&quot;,<br />&nbsp; /* 1 */ @&quot;//div/img&quot;,<br />&nbsp; /* 2 */ @&quot;//tr/ul/li&quot;,<br />&nbsp; /* 3 */ @&quot;//div/ul/li&quot;<br />};<br />typedef enum { CCImgInTr = 0, CCImgInDiv = 1 } CCImgTagID; // le 1er et 2e tag de la liste CCTagsList sont des &quot;ImgTag&quot; valides<br />typedef enum { CCLiInTr&nbsp; = 2, CCLiInDiv&nbsp; = 3 } CCLiTagID; // le 3er et 4e tag de la liste CCTagsList sont des &quot;LiTag&quot; valides<br />typedef enum { CCTr1&nbsp; &nbsp;  = 0, CCTr2&nbsp; &nbsp; &nbsp; = 2 } CCTrXTagID; // etc, etc<br /><br />-(void) test:(CCImgTagID)xpathid<br />{<br />&nbsp; NSString* xpath = CCTagsList[xpathid];<br />&nbsp; // ...<br />}
    
    Avec ce code tu ne peux passer comme ID que [tt]CCImgInTr[/tt] ou [tt]CCImgInDiv[/tt], si tu mets [tt]CCLiInTr[/tt] par exemple il va te gueuler dessus car ce n'est pas un CCImgTagID.
    En réalité tu vois que je passe par des int, qui ne sont rien d'autre que des index de ton tableau global CCTagsList, mais ça reste relativement élégant et répond à  ta demande :D
  • ClicCoolClicCool Membre
    20:26 modifié #14
    Merci
    :adios!:
    ça me va impec ta solution avec un tableau en c référencé par des enums !
  • ClicCoolClicCool Membre
    20:26 modifié #15
    dans 1163511155:

    dans 1163505246:

    2°) plus bas dans le code des méthodes j'utilise XPATH(@tr/img) dans:
    resultArray = [alerteHtmlDoc nodesForXPath:XPATH(@&quot;tr/img&quot;) error:&amp;error];
    


    Et ça marche :)
    Tiens, étonnant ça... donc en mettant le @";" dans le paramètre de la macro, alors que je demande un stringize qui est sensé rajouter les guillemets autour du paramètre ? (donc ça marche avec [tt]XPATH(@tr/img)[/tt] et non pas [tt]XPATH(tr/img)[/tt] ?)

    Va falloir que je révise mes cours sur les macros, moi :D


    Ben euh,
    Comment dire ?
    En fait, euh,

    Ben voilà , c'est moi qui m'est trompé quoi !  :o

    T'as raison, ça marche sans les @";" et pas avec.

    désolé  o:)
    j'espère que t'as pas encore eu le temps de réviser toute la doc sur le macros, c'est inutile pour toi ...
Connectez-vous ou Inscrivez-vous pour répondre.