[Résolu] Quel type ? NSEnumerator NSArray

ancrouancrou Membre
avril 2008 modifié dans API AppKit #1
Bonjour,
Je ne sais pas quel type utiliser.

Alors j'ai des blocs qui possèdent :
  - un identifiant de 2 octets
  - une taille de 8 octets
  - une adresse de début du bloc de 8 octets

Exemple:
   0x0001  0x00A8  0x0007
   0x0002  0x0100  0x00A8
   0x00A1  0x0020  0x01A8


J'ai pensé faire une classe nommé Bloc, puis de faire un NSEnumerator de Bloc.
J'aurai besoin de lire ma collection, élément par élément, pas besoin (normalement) de faire des recherches.

C'est une bonne solution ? :-\\
NSEnumerator est il un bon type ? :-\\

Après pour faire ma classe Bloc c'est une autre histoire pour un débutant  :o


Merci

Réponses

  • schlumschlum Membre
    15:06 modifié #2
    J'ai pas trop compris, mais NSEnumerator n'est pas fait pour ça en tout cas...

    D'une c'est une classe abstraite, et de deux elle est faite comme son nom l'indique pour énumérer  :P
    C'est un objet temporaire qu'on utilise pour parcourir un NSArray ou un NSDictionary, voire un NSSet.
  • AliGatorAliGator Membre, Modérateur
    15:06 modifié #3
    Oui pas tout tout compris non plus (tu parles de 2 puis 8 puis 8 octets, alors que dans ton exemple donné en dessous c'est 2,2,2...) mais le plus simple pour ce genre de truc plutôt algorithmique ou lecture de données bas niveau c'est d'en revenir au C
    typedef struct _bloc_ {<br />&nbsp; unsigned short id; // unsigned short --&gt; 2 octets<br />&nbsp; long long int blockSize; // long long --&gt; 8 octets<br />&nbsp; long long int startAddr; // long long --&gt; 8 octets<br />} sBlock;
    
    Ensuite tu lis d'un coup ton ensemble de blocs (s'ils sont tous les uns derrière les autres dans la mémoire :
    [tt][idBloc1] [tailleBloc1] [adresseDebutBloc1] [idBloc2] [tailleBloc2] [adresseDebutBloc2] [idBloc3] ...[/tt]
    il suffit d'allouer un tableau de N structures sBlock et de copier le contenu de ta zone mémoire directement dedans... voire si tu as déjà  ton buffer en mémoire et que tu ne veux pas le copier, simplement pointer dessus.

    Par exemple si tu as déjà  un buffer avec toutes tes données (tous tes blocs à  la queue-leu-leu) à  l'adresse ptr (de type void*), il suffit de faire
    sBlock* tabBlocks = (sBlock*)ptr; // on cast le pointeur pour le manipuler sous forme de tableau de sBlocks<br />long long s = tabBlocs[5].blockSize; // retournera la taille du 6e bloc (n°5 = le 6e car le premier est tabBlocs[0])
    


    Par contre si c'est plutôt du genre :
    [tt][idBloc1] [tailleBloc1] [donnéesBloc1 occupant tailleBloc1 octets] [idBloc2] [tailleBloc2] [donnéesBloc2 occupant tailleBloc2 octets donc pas forcément autant que le précédent] [idBloc3] ...[/tt] alors là  c'est une autre paire de manches, il va falloir boucler dessus un par un avec une boucle for.

    En tout cas pour ce genre de lecture de données, à  voir plus exactement la tête de ta structure car là  c'est pas très clair, mais je pense qu'un accès en C est plus approprié. Quitte à  le "wrapper" dans une méthode d'accès en Objective-C pour que ça soit transparent :)
  • schlumschlum Membre
    15:06 modifié #4
    Et si tu as besoin de lire élément par élément, je te conseille une liste chaà®née ; c'est fait pour ça et bien moins lourd qu'un objet.
  • ancrouancrou Membre
    15:06 modifié #5
    merci 

    Désolé de ne pas avoir été claire.  :o

    Mais nous avons résolu mon problème.
  • Philippe49Philippe49 Membre
    avril 2008 modifié #6
    a
Connectez-vous ou Inscrivez-vous pour répondre.