Redéfinir les types (struct) de bases D'Obj-c entraine t'il des imcopatibilités

GenoseGenose Membre
mars 2007 modifié dans API AppKit #1
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.


Réponses

  • BruBru Membre
    01:37 modifié #2
    Bon, certes, il me reste quelques grammes éthyliques dans le sang qui ont des difficultés à  s'évacuer suite à  un week-end un peu (trop) arrosé.

    Mais là , je n'ai rien compris à  ton post.

    L'âge peut-être...

    .
  • schlumschlum Membre
    01:37 modifié #3
    J'ai rien compris non plus  <3 :o
  • AliGatorAliGator Membre, Modérateur
    01:37 modifié #4
    dans 1174584535:
    le suspense de ce premier chapitre devient vite une film d'epouvante.
    A moins que ce ne soit la lecture de ton post qui le devienne ?  :)
  • GenoseGenose Membre
    01:37 modifié #5
    je recommence en iso-latin cette fois.


    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.
  • BruBru Membre
    01:37 modifié #6
    dans 1174653723:

    NSlog(@" contenu de la structure : \n %@",NSMakeRect(10, 15, 120, 80) );


    T'as pas cherché bien loin...
    <br />NSlog(@&quot; contenu de la structure : &#092;n %@&quot;,NSStringFromRect(NSMakeRect(10, 15, 120, 80))) ;<br />
    


    .
  • MalaMala Membre, Modérateur
    01:37 modifié #7
    NSLog pas NSlog car là  oui de toute façon c'est le plantage assuré en debug. ;)
  • GenoseGenose Membre
    mars 2007 modifié #8
    Daccord Bru pour NSStringFromRect()

    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 ?

  • schlumschlum Membre
    mars 2007 modifié #9
    Quand tu passes un pointeur void à  une fonction en interne elle ne sait pas ce que c'est (elle ne connaà®t ni le type, ni même la taille !)...
    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  ???
  • MalaMala Membre, Modérateur
    01:37 modifié #10
    schlum a raison. L'introspection en c pure n'est pas possible. Une structure ne peux te donner son type, c'est à  toi de le connaà®tre. C'est là  qu'on apprécie les languages plus évolués et dynamiques comme Obj-C.
  • AliGatorAliGator Membre, Modérateur
    01:37 modifié #11
    D'ailleurs, petite précision :
    - 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.
  • schlumschlum Membre
    01:37 modifié #12
    dans 1174670869:

    - 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)

    C'est parce que les "class" sont des "struct" un peu "habillées" en fait :)
Connectez-vous ou Inscrivez-vous pour répondre.