Mon nouveau programme : Leet translator

prepa75prepa75 Membre
18:40 modifié dans Vos applications #1
Bonjour à  tous,

j'ai fini de passer les écrits de mes concours et je me suis dit pourquoi ne pas faire une nouvelle application  ::)

je vous la présente : elle s'appelle Leet translator et permet comme son nom l'indique : de transformer une phrase choisi par l'utilisateur en leet.je voudrai (une fois qu'elle sera terminée...) pouvoir cliqué sur le bouton copier et cela copiera automatiquement la phrase en leet.

Mais mes problèmes sont beaucoup plus basique : je n'arrive pas à  trouver la méthode qui permet de prendre caractères par caractères et comparer avec les strings qui contiennent la traduction leet.

je vous met un bout de code :
-(IBAction)generer:(id)sender<br />{<br />	NSString *texte , *actuel;<br />	texte = [phrase stringValue];<br />	taille = [texte length];<br />	<br />	printf(&quot;taille : %d caractères&#092;n&quot; , taille);<br />	<br />	<br />	actuel = [texte characterAtIndex:1];


il se peut que ce ne soit pas la bonne méthode mais dans la doc je n'ai pas trouvé ce que je cherchais...

merci à  tous par avance !  :D

Réponses

  • wiskywisky Membre
    18:40 modifié #2
    Utlise un NSRange pour parcourir caractère par caractère la NSString ou - (unichar)characterAtIndex:(NSUInteger)index pour avoir le caractères en UNICHAR ;)
  • prepa75prepa75 Membre
    18:40 modifié #3
    je sais pas si c'est moi qui suis bête mais je n'arrive pas à  trouver les explications de la doc technique du NSRange.  :(

    pour cette méthode :  - (unichar)characterAtIndex:(NSUInteger)index

    il y a le paramètre index et la doc nous dit gentiment :

    The index of the character to retrieve. The index value must not lie outside the bounds of the receiver.

    ma question,qui devais être posée depuis longtemps est qu'est-ce qu'un integer ? parsque dans mon code je fait une boucle de 1 jusqu'au nombre de caractères (avec lenght) et je part du principe que c'est un int.j'ai juste ?
  • CéroceCéroce Membre, Modérateur
    mai 2010 modifié #4
    dans 1273490079:

    je sais pas si c'est moi qui suis bête mais je n'arrive pas à  trouver les explications de la doc technique du NSRange.  :(


    NSRange n'est pas une classe mais une structure. Tu trouveras les infos  dans la doc Foundation Data Types Reference.
  • CéroceCéroce Membre, Modérateur
    18:40 modifié #5
    dans 1273490079:

    ma question,qui devais être posée depuis longtemps est qu'est-ce qu'un integer ? parsque dans mon code je fait une boucle de 1 jusqu'au nombre de caractères (avec lenght) et je part du principe que c'est un int.j'ai juste ?


    Un int est un entier signé. Sa taille dépend de l'implémentation (du type de processeur, du système d'exploitation, etc.), c'est pourquoi on déconseille de l'utiliser. Mais sous Mac OS X, il mesure 32 bits (donc, des valeurs de -2^31 à  +2^31 -1).

    Si tu regardes la définition de NSUInteger, tu verras qu'il correspond à  un unsigned long. La taille du long dépend théoriquement elle-aussi de l'implémentation, mais en pratique, il mesure 32 bits (donc des valeurs de 0 à  2^32-1).
    À cause du bit de signe, NSUInteger et int ne sont pas interchangeables.

    En conclusion: utilise NSUInteger, n'utilise jamais de int.
  • prepa75prepa75 Membre
    18:40 modifié #6
    dans 1273495596:


    En conclusion: utilise NSUInteger, n'utilise jamais de int.


    Ok merci Céroce j'ai compris la différence...mais on peut initialisé une variable de la même manière qu'un int en mettant NSUInteger *variable; ?

    en regardant la doc Foundation Data Types Reference,j'ai trouvé ce code et je l'ai adapté à  mon cas :

    typedef struct NSRange {<br />						NSUInteger location;<br />						NSUInteger length;<br />				actuel = [texte characterAtIndex:location];// actuel est une NSString qui contient le n-1 caractère si n = location<br />							location++;<br />							}NSRange;<br />
    


    je cré une structure NSRange et dedans il y a 2 variable NSUInteger,je souhaite que length corresponde à  la valeur max et location corresponde à  la valeur actuelle. je fait une boucle qui va de 0 à  6(si il y a par ex 6 caractères)

    bien évidemment ça ne marche pas  :) me suis-je trompé quelque part?

    a au fait c'est quoi la différence entre NSUInteger et NSInteger ? le premier est un nombre positif et le 2eme sert à  quoi ?
    jsuis un peu perdu là ...
  • AliGatorAliGator Membre, Modérateur
    18:40 modifié #7
    Alors

    NSUInteger est un typedef vers unsigned long
    NSInteger est un typdef vers signed long

    Donc ça s'utilise comme ces types primitifs en C, ça s'utilise comme un int d'ailleurs.
    Sauf que "int" a une taille qui dépend de l'architecture de la machine. C'est pour cela qu'ont été créés les types NSInteger et NSUInteger, grâce à  tout plein de #ifdef qui vont bien dans les headers d'Apple, selon l'architecture sur laquelle tu compiles etc, ça va être remplacé par le bon type, de sorte que NSUInteger et NSInteger auront toujours la même taille.
    Mais à  part ça, ça s'utilise comme des types C standard genre int ou long.

    Ensuite NSRange est une structure C (et non une Classe Objective-C). Ca s'utilise comme n'importe quelle structure C (j'espère que tu as des bases de programmation en C, non ?)
    Du coup ton code ne veut rien dire (tu fais un typedef dans lequel tu mets... du code, avec un appel à  characterAtIndex... du grand n'importe quoi).
    Pour créer un NSRange, soit tu déclares une variable de type NSRange, puis tu affectes ses différents membres un à  un ([tt]NSRange r;[/tt] puis [tt]r.location = ...;[/tt] et [tt]r.length = ...;[/tt] ), soit tu utilises la fonction inline NSMakeRange() définie dans Foundation (cf la doc sus-citée par Céroce), fonction C qui te permet de construire un NSRange plus simplement.

    De toute façon characterAtIndex n'a aucunement besoin d'un NSRange, puisqu'il ne demande qu'un index ; NSRange est utile pour les méthodes qui nécessitent... un range (intervalle), genre substringWithCharactersInRange ou du genre, pas une position unique.
  • prepa75prepa75 Membre
    18:40 modifié #8
    dans 1273502152:

    Alors
    NSUInteger est un typedef vers unsigned long
    NSInteger est un typdef vers signed long


    donc si j'ai bien compris, un NSUInteger est un nombre positif et un NSInteger est un nombre +/- , et un NSUInteger a une capacité 2X plus grande qu'un NSInteger.

    dans 1273502152:


    Ensuite NSRange est une structure C (et non une Classe Objective-C). Ca s'utilise comme n'importe quelle structure C (j'espère que tu as des bases de programmation en C, non ?)



    en fait j'ai suivi aucune formation en programmation et je me balade de tuto en tuto en prenant pour référence "La prog sous MacOsX" et je suis passé à  coté de la gestion et utilisation d'une structure  :( je vais remédier à  ça tout de suite  :P

    dans 1273502152:


    Du coup ton code ne veut rien dire (tu fais un typedef dans lequel tu mets... du code, avec un appel à  characterAtIndex... du grand n'importe quoi).
    Pour créer un NSRange, soit tu déclares une variable de type NSRange, puis tu affectes ses différents membres un à  un ([tt]NSRange r;[/tt] puis [tt]r.location = ...;[/tt] et [tt]r.length = ...;[/tt] ), soit tu utilises la fonction inline NSMakeRange() définie dans Foundation (cf la doc sus-citée par Céroce), fonction C qui te permet de construire un NSRange plus simplement.


    je vais potasser tout ça et je vous renvoit mon code corrigé.  merci pour tes lumières Ali  ;)

  • CéroceCéroce Membre, Modérateur
    18:40 modifié #9
    Oui, apprend ce qu'est une structure et cherche aussi comment on fait une soustraction en binaire ("complément à  deux"), tu vas beaucoup mieux comprendre ces histoires d'entiers signés et non-signés, et quelles sont les gammes de valeurs qu'ils peuvent contenir.
  • prepa75prepa75 Membre
    18:40 modifié #10
    dans 1273504813:

    Oui, apprend ce qu'est une structure et cherche aussi comment on fait une soustraction en binaire ("complément à  deux"), tu vas beaucoup mieux comprendre ces histoires d'entiers signés et non-signés, et quelles sont les gammes de valeurs qu'ils peuvent contenir.


    oki je vais jeter un coup d'oeil au complément à  deux. 
  • prepa75prepa75 Membre
    18:40 modifié #11
    c'est bon j'ai bien compris comment fonctionne une structure  et comme le dit Ali en effet j'en ai pas vraiment l'utilité dans mon programme actuellement.

    voici mon code (voir photo...) et j'ai un warning  :( pourtant la variable carac (qui récupère le caractère à  l'index "actuel" ) est un NSString et la méthode CharacterAtIndex renvoie une chaine donc à  ce niveau là  c'est bon non? et lorsque j'enlève "carac" il n'y a plus de warning ! je ne vois pas trop où est mon erreur...
  • AliGatorAliGator Membre, Modérateur
    18:40 modifié #12
    dans 1273507417:
    pourtant la variable carac (qui récupère le caractère à  l'index "actuel" ) est un NSString et la méthode CharacterAtIndex renvoie une chaine
    Ah bon ?!? T'es sûr ?
  • prepa75prepa75 Membre
    18:40 modifié #13
    dans 1273510177:


    je croyais  :( il faut donc que je mette un unichar... je croyais naà¯vement que unichar = NSString... maintenant ça marche...aller je continue jusqu'au prochain problème...  ;)
  • AliGatorAliGator Membre, Modérateur
    mai 2010 modifié #14
    En pomme-double-cliquant sur le mot unichar ds le code tu peux voir que :
    typedef unsigned short unichar;
    

    Donc unichar, ça n'a rien à  voir avec un NSString*.

    Non seulement NSString est un NSObject, c'est un objet Cocoa (le "NS" et le "*" derrière doivent te mettre la puce à  l'oreille), alors que unichar est un type de donnée C, d'ailleurs y'a pas de "*" derrière contrairement à  tous les objets Objective-C... (le type C unichar est utilisé entre autres pour stocker des caractères Unicodes " d'où le nom de "unichar" " dont les codepoints pour le plane 0 tiennent sur 2 octets " valeurs de 0 à  2^16 " donc un type "short")
    Mais en plus la fonction s'appelle characterAtIndex, pas stringAtIndex. Donc c'est normal vu son nom qu'elle retourne un caractère et pas du tout une NSString.

    Donc entre la doc et les conventions de nommage, tout aurait dû te mettre sur la piste :D
  • prepa75prepa75 Membre
    18:40 modifié #15
    dans 1273530804:


    Donc entre la doc et les conventions de nommage, tout aurait dû te mettre sur la piste :D


    En effet,je suis allé un peu vite...je regarderai plus attentivement les petits détails  je vais essayer d'utiliser le copier-coller comme un grand sans votre aide pour voir si je sais lire  :P
  • prepa75prepa75 Membre
    18:40 modifié #16
    bon je crois que je pourrais jamais me séparer du forum... B)

    lorsque je compile ce code,je n'ai pas de message d'erreur et pourtant quand je copie ce qui est dans le presse-papier je n'ai pas la NSString "fini"...

    -(IBAction)copiertexte:(id)sender<br />{<br />	pb = [NSPasteboard generalPasteboard];<br />	[self copierpp:pb];<br />}<br /><br /><br />-(void)copierpp:(id)sender<br />{<br />	[pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];<br />	[pb setString:fini forType:NSStringPboardType];<br />}
    


    quelqu'un aurai une idée ?
Connectez-vous ou Inscrivez-vous pour répondre.