Comment créer des variable à  indentation

plusdegoplusdego Membre
12:03 modifié dans API AppKit #1
Bonjour à  tous,


je suis débutant et j'ai besoin d'un coup de pouce. Je cherche à  créer un ensemble de variables du type :
NSArray $var1 = [NSArray ...
NSArray $var2= [NSArray ...
NSArray $var3= [NSArray ...
...
NSArray $varn= [NSArray ...

Est-ce possible de le faire à  partir d'une boucle de i=1 à  i=n ?

Merci d'avance,

Julien

Réponses

  • schlumschlum Membre
    12:03 modifié #2
    Non... Il faut faire un tableau !
    On ne peut pas faire de l'indirection sur les variables... Ce n'est pas du Basic  ;)
  • plusdegoplusdego Membre
    12:03 modifié #3
    dans 1223639406:

    Non... Il faut faire un tableau !
    On ne peut pas faire de l'indirection sur les variables... Ce n'est pas du Basic  ;)


    Aie aie... le problème c'est que mes NSArray contiennent beaucoup de données. Quand tu dis faire un tableau, c'est bien faire un NSArray remplit de Nsarray(s) ?

    amicalement,

    Julien
  • AliGatorAliGator Membre, Modérateur
    12:03 modifié #4
    Oui, c'est bien des NSArray... mais du coup c'est donc tout à  fait possible. Il faut même mieux en fait utiliser un NSMutableArray (donc modifiable après sa création) que tu initialises à  vide et que tu remplis au fur et à  mesure de la création de tes tableaux

    NSMutableArray* tabOfvars = [[NSMutableArray alloc] init];<br />for(i=0;i&lt;n;i++)<br />{<br />&nbsp; NSArray* vari = [[NSArray alloc] init....];<br />&nbsp; [tabOfVars addObject: vari];<br />&nbsp; [vari release]; // on n&#39;en a plus besoin directement, et elle est ajoutée à  tabOfVars maintenant donc plus besoin de la garder localement.<br />}
    
    De plus si ce sont des données statiques (genre un tableau que tu initialises toujours aux mêmes valeurs et qui ne dépendent pas d'autres choses comme des réglages utilisateurs ou quoi, bref c'est toujours le même tableau que tu crées), tu peux peut-être plutôt écrire ton "tableau de tableau" dans un fichier au format plist, comme ça tu peux ensuite le charger en une seule ligne grâce à  la méthode [tt]initWithContentsOfFile:[/tt] qui va directement créer ton NSArray de NSArrays à  partir du contenu du plist !
  • plusdegoplusdego Membre
    12:03 modifié #5
    Merci, j'avance dans le bon sens.
    dans ton code, tu met [[NSArray alloc] init...].

    Jusqu'à  maintenant, pour initialiser un NSArray, j'utilise:
    NSArray *text = [NSArray array]...

    A quoi sert le alloc ?

    Amicalement,

    Julien
  • schlumschlum Membre
    12:03 modifié #6
    [NSArray array...] c'est un constructeur de commodité ; il construit l'objet et fait un autorelease dessus...
  • AliGatorAliGator Membre, Modérateur
    12:03 modifié #7
    array = alloc+init+autorelease.
    Comme tous les constructeurs de commodité qui sont basés sur le même principe, comme par exemple le constructeur de commodité "string" de NSString, qui est exactement équivalent à  alloc+init+autorelease, ou stringWithFormat: qui est le constructeur de commodité équivalent à  alloc+initWithFormat+autorelease.

    Par contre donc si tu utilises la méthode array, ça va donc te créer un objet autoreleasé, donc dans ce cas il ne faut plus faire le "release" que j'ai mis à  la fin de la boucle "for" bien sûr. Faut rester cohérent.
  • plusdegoplusdego Membre
    12:03 modifié #8
    Merci pour vos réponses. Je progresse petit à  petit. J'ai donc 2 nouvelles question pour vous...
    - Est-il possible de remplacer une chaine de caractère dans tous un NSarray d'un coup ou faut-il le faire en extrayant chacune des lignes du NSArray ?
    - Disons que j'ai un NSArray composé de 2 NSArray. Quel code utiliser pour sortir la valeur situé à  l'index 10 de l'array inclut à  l'index 2 de l'array principal (Expérons que cela soit compréhensible comme question...).

    Un grand merci à  vous tous !!

    Julien
  • LeChatNoirLeChatNoir Membre, Modérateur
    12:03 modifié #9
    Pour la 1erer question : NSArray's makeObjectsPerformSelector: and makeObjectsPerformSelector:withObject: methods let you send messages to all objects in the array
    Pour la 2eme : [[monTableauPrincipal objectAtIndex:2] objectAtIndex:10];

    A+
  • plusdegoplusdego Membre
    octobre 2008 modifié #10
    GENIAL !!!
    Merci beaucoup pour ces infos.

    Nouvelle question concernant le debug d'un programme via les messages de la Console.
    J'ai un message du type :

    "2008-10-11 13:01:42.347 PROGTEST[622:20b] *** Terminating app due to uncaught exception 'NSRangeException'..."

    Comment puis-je savoir où le problème se situe dans mon code ? Est-ce que je suis obligé de faire du pas à  pas jusqu'à  l'erreur ?

    Amicalement,

    Julien
  • LeChatNoirLeChatNoir Membre, Modérateur
    12:03 modifié #11
    vu que tu utilises pas mal de tableaux, ca ressemble à  un index qui va trop loin... Genre t'as un tableau de 3 éléments et tu essayes d'accéder à  objectAtIndex:3 qui n'existe pas (puisqu'on commence à  0).
    Donc essaye de voir où ton algo peut pêcher (regarde les bornes de tes boucles) et si tu trouves pas, effectivement, pas à  pas...


  • plusdegoplusdego Membre
    12:03 modifié #12
    dans 1223726016:

    vu que tu utilises pas mal de tableaux, ca ressemble à  un index qui va trop loin... Genre t'as un tableau de 3 éléments et tu essayes d'accéder à  objectAtIndex:3 qui n'existe pas (puisqu'on commence à  0).
    Donc essaye de voir où ton algo peut pêcher (regarde les bornes de tes boucles) et si tu trouves pas, effectivement, pas à  pas...



    Il n'y a pas de moyen de savoir quel ligne du programme renvoie l'erreur à  partir de la console ?????
    :o :o
  • Philippe49Philippe49 Membre
    12:03 modifié #13
    dans 1223727401:

    Il n'y a pas de moyen de savoir quel ligne du programme renvoie l'erreur à  partir de la console ?????
    :o :o

    Utilises le débogueur.
    • Tu mets un breakpoint sur la méthode suspecte (clic dans la goutière)
    • Tu ouvres la fenêtre Debuggerr (menu Run > Debugger)
    • Tu lances en mode Debug ( Run > Debug)
    • Tu peux observer pas à  pas l'exécution de ton code
  • AliGatorAliGator Membre, Modérateur
    12:03 modifié #14
    Oui.

    Ou alors autre possibilité pour déboguer, tu mets des messages un peu partout dans ton code (autour du code suspect) avec des NSLog. Ca revient un peu au même que d'avancer pas à  pas mais ça t'évite d'appuyer sur une touche à  chaque fois pour avancer d'une instruction... et tu verras bien quand ton appli plantera quels messages/NSLogs tu as eu le temps d'avoir et ceux que tu n'as pas eus. Ca te permettra de resserrer le problème.

    Maintenant le mieux c'est une combinaison un peu des deux peut-être : mettre des NSLogs (soit t'affichant un texte basique te permettant de repérer où il est dans le code au moment de l'exécution, mais tant qu'à  faire en profiter pour afficher quelques informations comme le nombre d'éléments du tableau que tu es en train de parcourir et l'index auquel tu veux accéder, etc) dans un premier temps pour voir à  peu près à  quel endroit est le problème, et ensuite s'ils ne t'ont pas suffi à  comprendre ton erreur, faire du pas à  pas autour de cette zone où ça crash pour en profiter pour "inspecter" les éléments dans le débogueur.
  • fouffouf Membre
    12:03 modifié #15
    sinon tu peux aussi mettre un breakpoint sur [NSException raise] (je crois avoir déjà  poster ce truc mais je ne le retrouve pas).

    Pour cela, il suffit d'afficher la fenêtre des breakpoints puis de rajouter [NSException raise] comme breakpoint (en entrant le texte a la place de "Double-click for symbol").
  • schlumschlum Membre
    12:03 modifié #16
    dans 1223765187:

    sinon tu peux aussi mettre un breakpoint sur [NSException raise] (je crois avoir déjà  poster ce truc mais je ne le retrouve pas).

    Pour cela, il suffit d'afficher la fenêtre des breakpoints puis de rajouter [NSException raise] comme breakpoint (en entrant le texte a la place de "Double-click for symbol").


    Oui, ça c'est la meilleure solution...
  • plusdegoplusdego Membre
    12:03 modifié #17
    Merci pour tous vos bons conseils. Je suis confronté à  un eproblème un peu débile je suppose mais je ne trouve pas la solution.

    J'ai besoin de faire passer une valeur d'une classe à  une autre et je ne sais pas comment faire... Quand je déclare un NSString dans une classe, je le perd dans la deuxième classe... Pouvez-vous m'aiguiller ??

    Amicalement,

    Julien
  • Philippe49Philippe49 Membre
    12:03 modifié #18
    Il y a beaucoup de possibilités ... précise un peu.
    • La NSString correspond-elle à  une variable d'instance de l'une ou/et de l'autre des classes ?
    • La NSString sert-elle pour exécuter une méthode de l'une des classes ?
    • La NSString est-elle une constante dans ton programme
    ...
  • plusdegoplusdego Membre
    12:03 modifié #19
    dans 1224778837:

    Il y a beaucoup de possibilités ... précise un peu.
    • La NSString correspond-elle à  une variable d'instance de l'une ou/et de l'autre des classes ?
    • La NSString sert-elle pour exécuter une méthode de l'une des classes ?
    • La NSString est-elle une constante dans ton programme


    En gros, j'ai une classe qui affecte une valeur à  une variable. Je souhaiterais récupérer cette valeur dans une autre classe (ou plusieurs).
    Amicalement,

    Julien
  • Philippe49Philippe49 Membre
    octobre 2008 modifié #20
    Première solution

    Il suffit que l'instance de la classe A qui veut connaà®tre la valeur de la NSString dans l'instance de la classe B ait une variable qui pointe sur cette B-instance

    @class Class B;
    @interface ClassA : .. {
        ClassB * objetB;
    }
    ..
    @end

    ========================================

    @interface ClassB : .. {
        NSString * string;
    }

    @end

    ========================================
    @implementation ClassA

    {
        ....
         NSString * stringInB=[objetB valueForKey:@string];
        ....

    }

    @end



    Naturellement, il faut que objetB soit quelque part initialisée en pointant sur l'instance de la classe B en question.

Connectez-vous ou Inscrivez-vous pour répondre.