NSArray

macvelottemacvelotte Membre
23:36 modifié dans API AppKit #1
Pour un premier programme cocoa, j'ai réalisé une calculette (notation polonaise inverse, 4 registres dans la pile, un registre mémoire, fonctions scientifiques "basiques").

Je souhaite rendre la (ou les) mémoire permanente, donc enregistrer les nombres contenus dans la pile et la mémoire.

En C, c'est trivial ! En objectiveC, j'avoue que je n'arrive à  rien, et j'ai parfois la tentation d'abandonner, en ayant assez des messages du compilateur.

Ma question : comment déclarer un tableau (NSArray), y copier cinq nombres, l'nregistrer dans un fichier, et relire ce fichier automatiquement à  l'ouverture de l'application ?javascript:replaceText('%20:-////',%20document.postmodify.message);

Réponses

  • BruBru Membre
    23:36 modifié #2
    Utilise plutôt les userDefault (les préférences en français), c'est plus simple d'emploi.

    Par exemple, supposons que ton NSArray qui contient tes 5 nombres se nomme memArray.

    Pour enregistrer ce tableau, fais ceci (à  chaque fois que tu le modifies) :
    [[NSUserDefaults standardUserDefaults] setObject:memArray forKey:@"memArray"];
    


    Et pour relire ce tableau (à  l'ouverture de ton appli), fais ceci :
    memArray=[[NSUserDefaults standardUserDefaults] arrayForKey:@"memArray"];
    


    Ton tableau sera stocké dans le fichier des préférences de ton appli.

    .
  • 23:36 modifié #3
    C'est du détail mais [NSUserDefaults standardUserDefaults] arrayForKey:@memArray]; va dire nil si la valeur n'existe pas, genre au premier lancement.

    [NSArray arrayWithArray:[NSUserDefaults standardUserDefaults] arrayForKey:@memArray]];
  • macvelottemacvelotte Membre
    23:36 modifié #4
    OK pour NSUserDefaults ...

    MAis je ne comprends pas comment inscrire une donnée dans le tableau (en l'occurence un "double".

    J'ai de trop vieilles habitudes de pascal et de C !
  • 23:36 modifié #5
    Tu dois utiliser un object NSNumber

    Donc, tu ajoutes à  l'array : [array addObject:[NSNumber numberWithDouble:d]]

    NSNumber *n=[array lastObject];
    double d = [n doubleValue];

    ou :
    double d = [[array lastObject] doubleValue];
  • macvelottemacvelotte Membre
    23:36 modifié #6
    J'ai essayé [array addObject ...]
    réponse du compilateur : NSArray may not respond to -addObject ...

    ???

  • Eddy58Eddy58 Membre
    23:36 modifié #7
    dans 1103107765:

    J'ai essayé [array addObject ...]
    réponse du compilateur : NSArray may not respond to -addObject ...

    ???


    Pour faire un array modifiable, tu utilises NSMutableArray... :)
  • macvelottemacvelotte Membre
    23:36 modifié #8
    Rien ne va plus !

    Tous essais négatifs.

    En pascal ou C on aurait quelquechose du genre :

    montableau:array[0..4] of double;
    .../...

    remplissage :
    montableau[0]=X;
    montableau[1]=Y;

    etc ..

    lecture :
    X=montableau[0];
    Y=montableau[1];
    ...

    en cocoa, on peut faire la même chose simplement ?

  • VeillardVeillard Membre
    23:36 modifié #9
    Salut

    montableau:array[0..4] of double;


    Tu peux faire quelque chose du style :
    NSMutableArray *monTableau = [[NSMutableArray alloc] initWithObjects:[NSNumber numberWithDouble:0.0], [NSNumber numberWithDouble:0.0], [NSNumber numberWithDouble:0.0], [NSNumber numberWithDouble:0.0], [NSNumber numberWithDouble:0.0], nil]];
    


    puis tu modifies tes objets en fonction de leur place dans le tableau (index) :
    [monTableau replaceObjectAtIndex:index withObject: maValeur];
    

    maValeur étant un NSNumber...

    Pour la lecture :
    valeur = [(NSNumber *)[monTableau objectAtIndex:index] doubleValue];<br />
    


    Tout ça de tête, essaie si ça marche.

    Voilà 

    A+
  • BruBru Membre
    23:36 modifié #10
    montableau:array[0..4] of double;

    donne :
    NSMutableArray *montableau;<br />montableau=[[NSMutableArray alloc] initWithCapacity:5];
    


    montableau[ 0 ]=X;
    montableau[ 1 ]=Y;

    donne :
    [montableau insertObject:[NSNumber numberWithFloat:X] atIndex:0];<br />[montableau insertObject:[NSNumber numberWithFloat:Y] atIndex:1];
    


    X=montableau[ 0 ];
    Y=montableau[ 1 ];

    donne :
    X=[[montableau objectAtIndex:0] floatValue];<br />Y=[[montableau objectAtIndex:1] floatValue];
    


    .
  • macvelottemacvelotte Membre
    23:36 modifié #11
    Désolé : rien de marche !

    Je crois que je vais dire adieu à  cocoa : c'est trop bordelique.
  • Eddy58Eddy58 Membre
    23:36 modifié #12
    dans 1103195118:

    Désolé : rien de marche !

    Je crois que je vais dire adieu à  cocoa : c'est trop bordelique.

    Je ne sais pas si tu as déjà  des connaissances en programmation objet, mais si tu veux te mettre à  Cocoa, il faut déjà  lire des tutoriaux.
    Tu peux aller ici :
    http://www.projectomega.org/main.php?lg=fr
    Tu as des tutoriaux qui t'apprendront l'Objective-C et Cocoa.
    Tu verras, une fois les bases compries, c'est autre chose.... :)
  • BruBru Membre
    décembre 2004 modifié #13
    dans 1103195118:

    Désolé : rien de marche !
    Je crois que je vais dire adieu à  cocoa : c'est trop bordelique.


    Je te trouve sévère !

    Objective-C et cocoa, de par leur aspect objet, sont 1000 fois moins bordéliques que C (ou que PASCAL).

    .
  • VeillardVeillard Membre
    23:36 modifié #14
    Je confirme ! Je viens d'un environnement Carbon en C  et crois-moi, c'est plus bordélique ou du moins plus complexe pour faire quelquechose de simple.  :crackboom:-

    Depuis que je me suis mis à  Cocoa, je suis entré dans un nouvel univers  :o que je ne veux plus quitter. D'ailleurs, j'ai totalement abandonné Carbon  >:D

    Cocoa n'est pas si complexe que ça pour les projets pas trop ambitieux bien sûr comme dans n'importe quel langage de programmation.  8)
  • macvelottemacvelotte Membre
    23:36 modifié #15
    OK les gars, je vais bosser ...

    Dans mon passé professionnel, j'ai enseigné la programmation en pascal ...

    Etant entré dans ma huitième décade, mes neurones sont un peu plus lents ; il va fallooir que je les excite un peu.

    Merci pour les réponses : j'aurai d'autres questions à  poser. :-\\javascript:replaceText('%20:-////',%20document.postmodify.message);
  • ClicCoolClicCool Membre
    décembre 2004 modifié #16
    dans 1103215218:

    Etant entré dans ma huitième décade, mes neurones sont un peu plus lents


    Mauvaise excuse macvelotte ;)

    Je connais des programmeurs dans le neuvième décades et qui me décoiffent régulièrement par leur ingéniosité et réactivité !

    Cocoa est parfait pour un esprit cartésien et ordonné. (même si nous ne sommes pas tous ici très ordonnés ;) )
    Ceci dit le passage de C ou C++ à  Cocoa mérite largement quelques efforts ... et nous tâcherons d'être là  pour te soutenir si tu le veux bien et si nous le pouvons.

    P.S. puisque tu as laché une indiscrétion sur ton âge, pourquoi ne pas compléter ton profil ? et pourquoi ne pas te présenter ICI (JE LE DIS FORT EN CAS DE PRESBYACOUSIE) ? nous en serions forts heureux ! ::)
    P.P.S. Fais le pour moi, j'en ai marre d'être le doyen sur ce site de jeunots :o

    [edit Renaud: lien qui ne marchait plus suite à  l'ajout du message de macvelotte]
  • 23:36 modifié #17
    dans 1103240346:

    P.P.S. Fais le pour moi, j'en ai marre d'être le doyen sur ce site de jeunots :o


    Non non ClicCool, tu es irremplaçable dans ce rôle ;)
  • 23:36 modifié #18
    dans 1103240346:

    P.S. puisque tu as laché une indiscrétion sur ton âge, pourquoi ne pas compléter ton profil ? et pourquoi ne pas te présenter ICI (JE LE DIS FORT EN CAS DE PRESBYACOUSIE) ? nous en serions forts heureux ! ::)


    Tu ne l'a visiblement pas dis assez fort ;).

    Macvelotte: J'ai mis le post à  sa place (voir le lien de cliccol), ne t'étonne pas si tu ne le vois plus ici.
  • Eddy58Eddy58 Membre
    23:36 modifié #19
    dans 1103284249:

    dans 1103240346:

    P.P.S. Fais le pour moi, j'en ai marre d'être le doyen sur ce site de jeunots :o

    Non non ClicCool, tu es irremplaçable dans ce rôle ;)


    Tout le monde ici sait que tu fais partie des meubles ClicCool ! ::) ;)
  • WIMPWIMP Membre
    23:36 modifié #20
    Il ne faut pas oublier que Objective-C est une extension du C, et supporte toute la librairie standard. Tu peux donc continuer à  faire beaucoup de choses en C standard, tout en profitant de la facilité de Cocoa pour créer un inteface graphique.
    Je te recommande un bon tutorial de calculette: le projet "Calculator" dans le livre "Building Cocoa Applications" de S.Garfinkel chez O'Reilly. On peut télécharger le code sur oreilly.com/catalog/buildcocoa.
    C'est d'ailleurs le meilleur livre d'apprentissage que j'ai trouvé à  ce jour.
    Ne te décourage pas, perso j'ai appris plusieurs environnements de programmation et à  chaque fois j'ai 3 mois de galère avant d'être un peu à  l'aise.
Connectez-vous ou Inscrivez-vous pour répondre.