de NSTectField vers char *

boubouboubou Membre
23:05 modifié dans API AppKit #1
Bonjour,
Voila je début en objective-C, et je n'arrive pas a récupérer la valeur d'un NSTextField directement dans un char* , ou même en passant par un NSString
<br />&nbsp; &nbsp; &nbsp; const char* mon_char[20];<br /><br />	NSString *ma_string = [mon_NSTextField stringValue] ;<br />	mon_char = [ma_string UTF8String];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  //ou alors cString à  la place de UTF8String


cela vient du [20] en effet lorsque je ne le met pas cela marche ....

merci a ceux qui répondront.

Réponses

  • schlumschlum Membre
    23:05 modifié #2
    Là  c'est pas un problème d'Objective-C, c'est un problème de C...

    "mon_char" est un char**, [ma_string UTF8String] est un char*

    Faut choisir son camp  :P

    Si tu veux récupérer en mémoire le truc -> char mon_char[20], puis un strcpy
    Sinon -> char *mon_char
  • boubouboubou Membre
    23:05 modifié #3
    Tout d'abord merci de ta réponse.

    En suivant tes conseil je viens d'essayer en faisant cela :

    NSString *ma_string = [mon_NSTextField stringValue] ;
    char mon_char[20];
    FILE* script=NULL;

    strcpy(mon_char,[ma_string UTF8String]); // ou alors strcpy(mon_char,[ma_string cString]);

    script = fopen("script.sh","w+");
    fprintf(script,mon_char);

    fclose(script);

    et lorsque je compile il me dit "mon_prog has exited due to signal 10 (SIGBUS)"

    Je dois absolument récupérer le contenu de mon champ de texte dans une variable de type char*.

    Merci de ton aide
  • schlumschlum Membre
    23:05 modifié #4
    Est-ce que 20 est une taille suffisante ?
    Qu'est-ce que ça donne au debug ? (il plante sur quoi ?)
  • Philippe49Philippe49 Membre
    mai 2007 modifié #5
    dans 1179504144:

    NSString *ma_string = [mon_NSTextField stringValue] ;
    NSLog(ma_string) ;  // ou mon string ?

    char mon_char[20];
    // 20 caractères est-il suffisant ?

    FILE* script=NULL;  // inutile d'intialiser

    strcpy(mon_char,[ma_string UTF8String]); // ou alors strcpy(mon_char,[ma_string cString]);

    script = fopen("script.sh","w+"); // ce n'est pas plutôt "a" que tu veux ?
    if(script) {  // le fichier est-il au bon endroit?
    fprintf(script,mon_char);
    fclose(script);
    }


  • Eddy58Eddy58 Membre
    23:05 modifié #6
    Pourquoi ne pas utiliser la méthode - (const char *)cStringUsingEncoding:(NSStringEncoding)encoding ?? :o
  • boubouboubou Membre
    23:05 modifié #7
    Tout d'abord merci de toute vos réponse !!!
    alors dans l'ordre :

    Est-ce que 20 est une taille suffisante ?
    Qu'est-ce que ça donne au debug ? (il plante sur quoi ?)

    oui 20 est une taille suffisante, et au debug il plante sur strcpy, je voit pas pourquoi  :s 

    script = fopen("script.sh","w+"); // ce n'est pas plutôt "a" que tu veux ?
    if(script) {  // le fichier est-il au bon endroit?
    fprintf(script,mon_char);
    fclose(script);
    }

    cela plante avant le fopen, sur le strcpy, donc ca ne doit pas influencer sur le plantage. ;)

    (const char *)cStringUsingEncoding:(NSStringEncoding)encoding

    le char * est déclarer dans une struture, et ce n'est pas un const char*, (sinon je pourrais pas le réafecter par la suite, donc je ne peux pas utiliser cette méthode).

    Sinon ce n'est pas obligé d'utilser strcpy ou UTF8string, ou cString , si quelqu'un connait une autre technique pour récupérer un NSTextfield dans un char * je suis prenneur, le seul truc c'est que le char * en question est déclarer dans une strucutre donc cela m'empeche d'utiliser les fonctions qui retourneront un const char * (sinon je ne pourrai pas les réafecter).

    Ou autrement mais cela me gènerai un peu ce serait une méthode équivalente a fprintf qui permettrait d'écrire dans un fichier une
    NSString, j'avais trouver une méthode writeToFile mais le seul problème c'est que je n'ai pas réussi à  écrire à  la suite de ce qu'il y avait d'écrit dans le fichier à  chaque fois il éffacait le contenu et réécrivait par dessus.

    Le tuc qui bloque c'est que je suis obligé d'utilisé une structure donc cela m'empeche d'utiliser des const char * :s .
  • mai 2007 modifié #8
    20 suffisant ou pas, pourquoi ne pas faire un cStringLength ?

    T'es certain que le pointeur d'objet ma_string n'est pas égal à  nil ?

    Tu n'as pas une gestion d'erreur assez efficace si tu veux mon avis. A partir du moment où tu as des valeurs en retour qui ne descendent pas d'NSObject je te recommande de tester l'objet sur lequel la méthode se fait, soit ici mon_NSTextField.

    Je serais toi je lirais un coup la doc de NSFileHandle, NSStream.
  • Philippe49Philippe49 Membre
    23:05 modifié #9
    Cela marche très bien ainsi

    <br />#import &lt;Cocoa/Cocoa.h&gt;<br />// compiler dans le terminal avec gcc -Wall -g .pgm.m -o .pgm -framework Cocoa<br /><br />int main (int argc, char *argv&#91;])<br />{<br />	NSAutoreleasePool * pool=[NSAutoreleasePool new];<br />	NSString * aString=[NSString stringWithString:@&quot;Pivoine&quot;];<br />	const char *s=[aString UTF8String];<br />	puts(s);<br />	[pool release];<br />	 return 0;<br />}<br />
    
  • schlumschlum Membre
    23:05 modifié #10
    Si ça plante sur le strcpy, c'est que 20 n'est sans doute pas suffisant...

    Et effectivement, pas besoin de recopier ici si c'est juste pour écrire dans un fichier.
  • 23:05 modifié #11
    dans 1179584872:

    Si ça plante sur le strcpy, c'est que 20 n'est sans doute pas suffisant...

    Ou que le second arguments vaut nil... si qui est plus le cas si ça plante à  chaque fois car dans le cas d'un débordement ça ne plante pas toujours...

    dans 1179584872:

    Et effectivement, pas besoin de recopier ici si c'est juste pour écrire dans un fichier.

    De toute façon le cas ici c'est du grand n'importe...
  • boubouboubou Membre
    mai 2007 modifié #12
    Ouf ca marche !!!!
    je pense qu'il y avait plusieurs chose qui faisait planter le programme,
    tout d'abord le fait de mettre un tableau de char,
    les fonction cString et UTF8String veulent en retour des const char *,
    le fait que la variable soie déclarer dans une structure,
    et quelques erreur de ma part :(

    Par contre ce qui parait bizarre c'est que dans ma struture j'ai donc ce "const char *" de déclaré mais non initialisé, et par la suite dans le programme j'arrive a le redéfinir plusieurs fois.
    Normalement une fois déclaré je dois l'initialisé et en plus je ne peut changer sa valeur par la suite.
    Et si je remplace le "const char *" en "char *" Xcode me prévient en disant "warning: assignment discards qualifiers from pointer target type" lorsque qu'il execute "structure.variable=[aString UTF8String];" mais il arrive quand même a rentre la valeur dans la variable, alors que UTF8String est sensé renvoyer la valeur vers un const char *

    bizarre ... si quelqu'un a une explication ...

    De toute façon le cas ici c'est du grand n'importe...


    Exact Supermic c'est la stricte vérité, mais tu dois surement oublié que avant de faire des chose excellente et parfaite, on passe tous par des phases d'apprentissages ... (je dis cela car je doute que tu n'ais fait cette reflexion dans une bonne intention, même si elle ne reflète que la stricte vérité).

    Merci a tous de votre aide
  • Philippe49Philippe49 Membre
    mai 2007 modifié #13
    dans 1179591093:

    Par contre ce qui parait bizarre c'est que dans ma struture j'ai donc ce "const char *" de déclaré mais non initialisé, et par la suite dans le programme j'arrive a le redéfinir plusieurs fois.
    Normalement une fois déclaré je dois l'initialisé et en plus je ne peut changer sa valeur par la suite.


    const char * pointe sur une chaà®ne dont les caractères sont constants, mais le pointeur est une variable automatique dont la valeur (en l'occurence une adresse ) peut être changée. En gros, il faut lire (const char) *, même si la syntaxe n'est pas acceptée ainsi.

    Un warning signifie : attention. Ce n'est pas en soi une erreur de programmation de mettre un pointeur char * vers une chaà®ne de caractères non transformables, seulement il y a risque que par la suite il soit essayé via ce pointeur de changer la valeur de caractères qui ne devrait pas l'être.


    De toute façon le cas ici c'est du grand n'importe...

    Exact Philippe49 c'est la stricte vérité, ...


    Tu te trompes d'interlocuteur. Là  encore c'est un problème d'adresse  :adios!: ;)


  • boubouboubou Membre
    23:05 modifié #14
    Merci pour l'explication ;)

    Désolé Philippe49  :( je ne sais pas pourquoi j'ai rentenu ton nom sur cette citation ... encore désolé ....
    c'est effectivement encore un problème d'adresse ;D
  • AliGatorAliGator Membre, Modérateur
    23:05 modifié #15
    Hello :)

    Alors effectivement on est tous passés par une phase d'apprentissage.
    Mais l'erreur que tu fais sans doute (je ne connais pas ton code ni son but et les contraintes autour, ceci dit, mais bon) c'est de trop te rattacher au C, que j'imagine tu as déjà  pratiqué avec l'Objective-C.

    - Si tu veux écrire des données dans un fichier, utilise comme l'a mentionné plus haut Supermic les classes Cocoa dédiées (NSFileHandle, NSStream... voire directement la méthode writeToFile de NSString)
    - Si possible, je te conseille fortement d'oublier bien vite les char* et de garder les NSString, plus faciles à  manipuler
    - Evite de faire une structure, même si c'est correct, c'est en général très peu usité en POO comme en Objective-C, et doit être réservé au C pur... ou alors en Obj-C à  des stuctures plutôt simples et contenant de préférences des types simples (int, float, ...). Préfère donc la classe à  la structure ;) Tu pourras en plus ainsi mettre directement ta NSSring* dans ta classe (et ajouter des méthodes à  ta classe si besoin pour lui faire faire des actions spécifiques), plutôt que de mettre un char* dans une structure, char* à  qui il manque pas mal de fonctionnalités et de subtilités (taille non extensible, text encodings, ...)


    Maintenant tu as peut-être tes raisons de passer absolument par un "char*" (appel à  une fonction d'une lib C externe ? si oui ça me parait bizarre qu'elle encapsule un char* dans des structs à  passer en paramètre mais bon), mais si tu peux éviter et passer aux NSString, crois-moi ça va t'éviter bien des soucis :)
Connectez-vous ou Inscrivez-vous pour répondre.