Mon nouveau programme : Leet translator
prepa75
Membre
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 :
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 !
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("taille : %d caractères\n" , 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 !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 ?
NSRange n'est pas une classe mais une structure. Tu trouveras les infos dans la doc Foundation Data Types Reference.
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.
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 :
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à ...
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.
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.
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
je vais potasser tout ça et je vous renvoit mon code corrigé. merci pour tes lumières Ali
oki je vais jeter un coup d'oeil au complément à deux.
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...
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...
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
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
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"...
quelqu'un aurai une idée ?