de NSTectField vers char *
boubou
Membre
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
cela vient du [20] en effet lorsque je ne le met pas cela marche ....
merci a ceux qui répondront.
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 /> const char* mon_char[20];<br /><br /> NSString *ma_string = [mon_NSTextField stringValue] ;<br /> mon_char = [ma_string UTF8String]; //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.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
"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
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
Qu'est-ce que ça donne au debug ? (il plante sur quoi ?)
alors dans l'ordre :
oui 20 est une taille suffisante, et au debug il plante sur strcpy, je voit pas pourquoi
cela plante avant le fopen, sur le strcpy, donc ca ne doit pas influencer sur le plantage.
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 * .
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.
Et effectivement, pas besoin de recopier ici si c'est juste pour écrire dans un fichier.
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...
De toute façon le cas ici c'est du grand n'importe...
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 ...
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
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.
Tu te trompes d'interlocuteur. Là encore c'est un problème d'adresse :adios!:
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
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