Redéfinir les types (struct) de bases D'Obj-c entraine t'il des imcopatibilités
Genose
Membre
Bonjour,
cela fait déja quelques jours que je tente désespérement de faire un NSString sur un type Struct-C.
mais voila sans rien obtenir de stable, enfin jusqu"a cette idée tout a l'heure.
le truc surgissa de l'ombre méandrien de m'caboche et la tel EDF (et la lumiere fut), mes bouqin de C++ me scribé tel un fantome vers mon ouie : " ecris une fonction membre, écris une fonction membre !!".
NSrect deviendrai facile a questionner et pareil pour tout les autres types structs que j"ai besoin.
seduisante idée m esclafais je; mais voila que ce passera t'il quand mon Controleur appelera une struct qui elle n'a pas été compilé avec mon bouquet garnis, comme dans cette exemple :
recherche_type_et_Stat_NSString:(id) plugins
{
NSString *Type_de_struct = plugins->Function_Stat_membre();
return Type_de_struct;
}
//.......
[self recherche_type_et_Stat_NSString : plugins-struct-sans-fonction-membre];
//......
Ben je me dit que ca va planter !! et hélas je ne trouve rien de comparable a Obj-c comme:
[obj respondToSelector: @selector( Function_Stat_membre:)];
Mais alors que faire ???
le suspense de ce premier chapitre devient vite une film d'epouvante.
Merci d'avance de votre aide.
cela fait déja quelques jours que je tente désespérement de faire un NSString sur un type Struct-C.
mais voila sans rien obtenir de stable, enfin jusqu"a cette idée tout a l'heure.
le truc surgissa de l'ombre méandrien de m'caboche et la tel EDF (et la lumiere fut), mes bouqin de C++ me scribé tel un fantome vers mon ouie : " ecris une fonction membre, écris une fonction membre !!".
NSrect deviendrai facile a questionner et pareil pour tout les autres types structs que j"ai besoin.
seduisante idée m esclafais je; mais voila que ce passera t'il quand mon Controleur appelera une struct qui elle n'a pas été compilé avec mon bouquet garnis, comme dans cette exemple :
recherche_type_et_Stat_NSString:(id) plugins
{
NSString *Type_de_struct = plugins->Function_Stat_membre();
return Type_de_struct;
}
//.......
[self recherche_type_et_Stat_NSString : plugins-struct-sans-fonction-membre];
//......
Ben je me dit que ca va planter !! et hélas je ne trouve rien de comparable a Obj-c comme:
[obj respondToSelector: @selector( Function_Stat_membre:)];
Mais alors que faire ???
le suspense de ce premier chapitre devient vite une film d'epouvante.
Merci d'avance de votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais là , je n'ai rien compris à ton post.
L'âge peut-être...
.
Tous, connaisez les types Struct que sont NSRect, NSSize, et autre struct de base du language.
ces types de données ne sont pas directement transformable vers un chaine de caractere; le seul faite d'ecrire :
NSlog(@" contenu de la structure : \n %@",NSMakeRect(10, 15, 120, 80) );
plantera le programme (du moins c'est que j'ai comme resultat en affichant un type Struct)
Alors le truc pour l'afficher comme un NSString est de rajouter à chaque struct une fonction membre qui revoie une chaine de caractere.
mais voila quand vous chargerais un plugins qui n'est pas le votre et qui ne possede pas cette fameuse fonction membre, lorsque le programme interrogera la premiere Struct du plugins avec :
plugins->struct-sansfonction-Nstring->String-de-la-struct();
ben le programme va planter.
Mais alors,
Comment faire pour palier a cela, ace plantage predicable ?!
Comment faire pour créer un NSString sur un type Struct ?
Comment faire pour savoir si oui ou non la fonction est présente dans la struct (peut on retrouver le pointer vers une fonction qui n'existe pas ? ou trouver un similaire de RespondToSelector pour les type struct ?)
Comment faire pour que le programme ne plante pas quand il rencontre une Struct qui n'a pas été compiler avec ses Headers ?
Voila.
T'as pas cherché bien loin...
.
mais je cherche un moyen de construire une fonction universel qui me donnera des info sur le type de donnees ciblé avec le choix d'afficher le nom du type et les donnees qu'elle contienne.
transmettre un pointeur a une fonction sans savoir a lavance si c un NSSize ou NSRect et que cette fonction me dise ce que c'est.
et deuxime question, par la meme occasion savoir comment tu peux tester si une fonction est presente dans les fonction memebre d'une struct.
que propose tu ?
Ces informations ne se trouvent même pas dans le run-time C !
(On trouve de l'information dans le runtime Objective-C sur la signature des méthodes par contre).
Ce que tu demandes est absolument impossible ???
- les struct en C ne sont que des aggrégations de variables, on ne peux pas y intégrer des fonctions membres, contrairement aux classes
- il n'y a qu'en C++ où le mot clé "struct" est synonyme de "class" (à ceci près que les membres sont par défaut publics au lieu d'être privés)
Donc en Objective-C, vu que basiquement c'est du C, les struct sont des structures C, et elles ne suivent donc pas la logique objet : pas de méthodes membre, pas d'héritage ou de polymorphisme, donc pas de possibilité de savoir le type de struct que c'est.
De toute façon comme cela vient d'être dit, si tu passes un pointeur pur à une fonction (un void*), ce n'est pas sécurisé du tout : il faut que celui qui envoie les données (quand tu appelles la fonction) et celui qui les traite (à l'intérieur de l'implémentation de la fonction) sachent tous les deux ce qu'ils attendent.
Par exemple le compilateur ne t'interdira pas de passer un char* et de l'interpréter comme si c'était un int*, par contre à l'execution ça risque de faire quelques catastrophes...
Alors que si on utilise des objets, on a moyen de savoir si l'objet implémente un protocole, répond à une méthode donnée, de quelle nature il est, etc.
Mais les structs étant des types de base du C, ils ne s'intègrent pas dans le concept objet, donc ce dont tu parles n'est pas envisageable.
Après tu peux toujours encapsuler des structs dans des objets, pour ensuite savoir de quel type il s'agit, te faire des méthodes [tt](NSString*)description[/tt], etc, mais évidemment si tu communiques avec les méthodes classiques de Cocoa ou d'autres libs qui utilisent des structs directement, il faudra les dés-encapsuler... donc finalement ça ne t'avance pas à grand chose.
C'est parce que les "class" sont des "struct" un peu "habillées" en fait