Obective-C et bibliothèque C++

GeenuXGeenuX Membre
17:50 modifié dans API AppKit #1
Malgré les différentes lectures que j'ai pu faire, je n'ai pas trouver la réponse à  la question suivante :
Est ce qu'il est possible d'appeler des fonctions d'une bibliothèque en C++ dans du du code objective-C ?
Est ce que l'on pert en performance ? Est ce que c'est compliqué à  faire sous XCode ?
Et surtout la question la plus compliqué ... Comment est ce que l'on fait ?

Merci beaucoup ...

Réponses

  • 17:50 modifié #2
    Bienvenue ;)

    Ce n'est pas difficile. Il suffit d'importer tes headers comme tu le ferais en C++. Tu dois par contre mettre l'extension .mm à  tes fichiers. Mais tu ne peux pas accéder à  des objets C++ à  partir d'objets Obj-C et vice-versa. Les seuls types possibles "d'échanges" entre ces deux familles sont ceux permis par l'ancêtre commun: le C.
  • nucleusnucleus Membre
    17:50 modifié #3
    dans 1099871755:
    Mais tu ne peux pas accéder à  des objets C++ à  partir d'objets Obj-C et vice-versa. Les seuls types possibles "d'échanges" entre ces deux familles sont ceux permis par l'ancêtre commun: le C.


    Ben normalement tu peut mélanger les deux depuis la Mà J du SDK de Novembre 2001 (il ont appelé ca l'[url=http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/LanguageOverview/chapter_3_section_10.html<br />]Objective-C++[/url])..

    Ceci dit j'ai jamais expérimenté..
    On nous aurai menti?

  • Joseph PapierJoseph Papier Membre
    17:50 modifié #4
    déterrage de topic, salut tout le monde!

    alors voilà , j'ai un code C pour piloter un afficheur LCD, que j'ai fait pour Linux il y a un an. je viens de l'adapter, il marche nickel avec mon mac.

    mais comment ça se passe pour mélanger le C (ANSI/POSIX) et l'ObjC? en l'occurence je veux récupérer le titre de la chanson en cours sur iTunes (AppleScript) et l'afficher sur mon afficheur VFD. j'ai déjà  les deux morceaux de soft (l'autre est un tuto nommé "Recent Tunes" que j'ai récupéré il y a un moment).

    dois-je faire des fichiers différents, ou est ce que je peux mettre u code C en plein milieu d'un fichier ObjC?

    merci d'avance,

    joPap
  • muqaddarmuqaddar Administrateur
    17:50 modifié #5
    Je crois que tu peux mettre du code C au milieu du code objective-C, en incluant les librairies C en haut du fichier : stdlib.h...etc.
  • BruBru Membre
    17:50 modifié #6
    dans 1107048299:

    mais comment ça se passe pour mélanger le C (ANSI/POSIX) et l'ObjC? dois-je faire des fichiers différents, ou est ce que je peux mettre u code C en plein milieu d'un fichier ObjC?


    Tu peux mélanger C et Objective-C dans les mêmes fichiers. Je le fais constamment, et ça ne pose aucun problème.

    Par exemple, voici l'aspect d'un fichier .h :
    <br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />// section en Objective-C<br />@interface MaClasse : NSObject<br />{<br />    int var1;<br />    NSString *var2;<br />}<br />- (void)setVar2;<br />- (int)var1;<br />@end<br /><br />// section en C<br />void ComputeOneThing(int parm1, NSString *parm2);<br />int GetIntValueFromOneString(NSString *parm3);<br />
    


    et celui du .m :
    <br />#import &quot;MaClasse.h&quot;<br /><br />// déclaration d&#39;une fonction C qui doit restée &quot;privée&quot; (cachée)<br />float FonctionPrivee();<br /><br />// section en Objective-C<br />@implementation MaClasse<br />- (void)setVar2;<br />{<br />    // code en Obective-C<br />    return;<br />}<br />- (int)var1<br />{<br />    // code en Obective-C<br />   return var1;<br />}<br />@end<br /><br />// section en C<br />void ComputeOneThing(int parm1, NSString *parm2)<br />{<br />    // code en C...<br />   return;<br />}<br /><br />int GetIntValueFromOneString(NSString *parm3)<br />{<br />    // code en C...<br />   return 123;<br />}<br /><br />float FonctionPrivee()<br />{<br />    // code en C...<br />   return 123.45;<br />}<br />
    


    Dans ces exemples, tu vois qu'on peut même mixer de l'objective-C au sein du code écrit en C.

    .
  • Joseph PapierJoseph Papier Membre
    17:50 modifié #7
    super, merci! je vais tester ça très vite.

    mais j'ai encore un soucis avec mon code C, si je vire une des deux lignes "inutiles" (l. 8), ça ne marche plus! je comprend vraiment pas, je pense avoir initialisé toutes mes variables...

    #include &quot;joPap-LCD.h&quot;<br /><br />int main (void) {<br />	int iRS232Lcd = 0;<br />	int iPos = 0;<br />	struct termios termios_RS232;<br />	<br />	// deux lignes inutiles mais indispensables!!!<br />	char strData[255];<br />	char strMemEtat[255];<br />	<br />	//Initialisation RS232<br />	iRS232Lcd = open(ADR_LCD, O_WRONLY);<br />	cfmakeraw(&amp;termios_RS232);           // 8N1 ???<br />	cfsetospeed(&amp;termios_RS232, B19200);  // 19200 baud<br />	// 19200 baud, 8 bits de donnees, parite EVEN, 1 bit de stop<br />	termios_RS232.c_cflag = B19200 | CS8 | PARENB;<br />	tcsetattr(iRS232Lcd, TCSANOW, &amp;termios_RS232);<br />	<br />	//Initialisation LCD<br />	lcd_set(iRS232Lcd,CURSOR_OFF);<br />	lcd_set_lum(iRS232Lcd, 0x00);<br /><br />	for(iPos=0; iPos&lt;80; iPos++) {<br />		lcd_put (iRS232Lcd,iPos,&quot;On dirait bien que ca marche!&quot;);<br />		usleep(PERIODE_LCD);<br />		lcd_set(iRS232Lcd, CLEAR_DISP);<br />		//usleep(PERIODE_LCD/10);<br />	}<br /><br />	(void)close(iRS232Lcd);<br />}<br /><br />int lcd_put(int iRS232Lcd, char cPos, char* strInfo){<br />	int iResult = 0;<br />   	int bytes_written = 0;<br /><br />	lcd_set_pos(iRS232Lcd, cPos);<br />	<br />	do {<br />        	iResult = write(iRS232Lcd ,  strInfo, strlen(strInfo));<br />        	bytes_written = iResult + bytes_written;<br />        } while (bytes_written &lt; strlen(strInfo));<br />	return bytes_written;<br />}<br /><br />int lcd_set(int iRS232Lcd, char cData) {<br />	int iResult = 0;<br />	iResult = write(iRS232Lcd, &amp;cData, 1);<br />	return iResult;<br />}<br /><br />int lcd_set_pos(int iRS232Lcd, char cPos) {<br />	lcd_set(iRS232Lcd, &#39;&#092;x1B&#39;);<br />	lcd_set(iRS232Lcd, &#39;&#092;x48&#39;);<br />	lcd_set(iRS232Lcd, cPos);<br />}<br />	<br />int lcd_set_lum(int iRS232Lcd, int iLum) {<br />	int iResult = 0;<br />   	int bytes_written = 0;<br />	char strData[10];<br />	<br />	sprintf(strData,&quot;&#092;x1B&#092;x4C%c&quot;,iLum);<br />	do {<br />		iResult = write(iRS232Lcd ,  strData, strlen(strData));<br />		bytes_written = iResult + bytes_written;<br />	} while (bytes_written &lt; strlen(strData));<br />	<br />	return bytes_written;<br />}
    
  • fouffouf Membre
    17:50 modifié #8
    Ptet bien qu'il faut que tu changes le nom de la variable strData dans la fonction setLum();

    Tu pourrais nous passer le message du compilo, ca serait plus facile  ;)
  • Joseph PapierJoseph Papier Membre
    17:50 modifié #9
    le compilo il aime, il compile sans broncher :)
  • fouffouf Membre
    17:50 modifié #10
    Il est possible que tu detruises deux fois le meme objet ou alors que tu detruises un objet qui n'est pas cree.

    dans 1107125520:

    le compilo il aime, il compile sans broncher :)

    ??? Ouais, ca doit etre un truc de memoire.

    Quid de la console ? Elle doit bien retourner un message qui dit qu'il y a un probleme.

    Et si tu nous envoyait ton code ?? Le projet lui-meme m'interesse.
  • Joseph PapierJoseph Papier Membre
    17:50 modifié #11
    ben là  je suis en C de base, donc pas d'objet, tu as tout le code sous les yeux! :)

    dans le .h j'ai juste les prototypes, les symboles et les #includes de bibliothèques. c'est un miniprog de test que j'ai fait, je ne veux pas l'inclure dans du Cocoa tant que j'ai pas compris où est la merdouille...

    d'autre part je pense pas que la console dise quoi que ce soit: le prog ne plante pas, simplement soit il affiche n'importe quoi, soit il affiche rien du tout!

    je veux compreeeendre  :'(
  • fouffouf Membre
    17:50 modifié #12
    En fait, je dois avouer que j'ai de gros problemes avec ton code :
    - ou est definie la structure termios ?
    - a quoi correspondent les fonctions cfmakeraw(), cfsetospeed(), tcsetattr() et usleep() ?

    En fait, ca serait vachement sympa de mettre a notre dispo le fichier .h STP ::)
    Je suis pas sur de te rendre service, j'ai deja a creer un objet qui gere les matrices, mpergand va m'engueuler si je fais queqchose d'autre en meme temps  :'( >:)
    ;)

    Dans un mois, j'ai de la place dans mon agenda  :)
  • Joseph PapierJoseph Papier Membre
    17:50 modifié #13
    /* Inclusions bibliotheques C */<br />#include &lt;stdio.h&gt;   /* Standard input/output definitions */ <br />#include &lt;string.h&gt;  /* String function definitions */ <br />#include &lt;unistd.h&gt;  /* UNIX standard function definitions */ <br />#include &lt;fcntl.h&gt;   /* File control definitions */ <br />#include &lt;errno.h&gt;   /* Error number definitions */ <br />#include &lt;termios.h&gt; /* POSIX terminal control definitions */ <br /><br />/* Symboles generaux */<br />#define PERIODE_LCD 500000<br />#define ADR_LCD &quot;/dev/tty.usbserial-181&quot;<br /><br />/* Symboles des commandes systeme pour le LCD */<br />#define BACKSPACE &#39;&#092;x08&#39;<br />#define HORIZONTAL_TAB &#39;&#092;x09&#39;<br />#define LINE_FEED &#39;&#092;x0A&#39;<br />#define FORM_FEED &#39;&#092;x0C&#39;<br />#define CARR_RETURN &#39;&#092;0Dx&#39;<br />#define CLEAR_DISP &#39;&#092;x0E&#39;<br />#define INCR_WR_MODE &#39;&#092;x11&#39;<br />#define VERT_SCROLL_MODE &#39;&#092;x12&#39;<br />#define UNDERLINE_CURSOR &#39;&#092;x14&#39;<br />#define BLOCK_CURSOR &#39;&#092;x15&#39;<br />#define CURSOR_OFF &#39;&#092;x16&#39;<br />#define SOFT_RESET &#39;&#092;x49&#39;<br />#define LUMINANCE &#39;&#092;4C&#39;<br /><br />/* Prototypes */<br />int lcd_put(int iRS232Lcd, char cPos, char* strInfo);<br />int lcd_set(int iRS232Lcd, char cData);<br />int lcd_set_pos(int iRS232Lcd, char cPos);<br />int lcd_set_lum(int iRS232Lcd, int iLum);<br />
    


    termios et compagnie sont dans termios.h je crois... tout ça je l'ai appris dans un PDF qui s'appelle POSIX Serial Programming. en tout cas je les ai pas inventées :D

    usleep() c'est un sleep en microsecondes, c'est une fonction de base du C non?
  • Joseph PapierJoseph Papier Membre
    17:50 modifié #14
    ça marche enfin!
    voici le code:
    joPap-LCD.h
    joPap-LCD.c

    demain, je passe à  l'intégration de ce code à  ByteController.
    ciao ;)
  • Joseph PapierJoseph Papier Membre
    février 2005 modifié #15
    Help me!

    j'ai bien intégré mon code C au projet Xcode.
    mais comment appeler mes fonctions C depuis le code ObjC???

    je suis joignable sur iChat (josephpapier) et MSN si c'est lourd à  expliquer comme ça.

    Merci d'avance,

    joPap

    [edit]
    ça marche!
    merci à  WIMP pour son aide ;)
    VFD_song.jpg
    prochaine étape, l'intégrer non pas au tutorial RecentTunes, mais carrément à  ByteController.
    :)

    [edit2]
    la suite de mon projet ici:
    http://www.objective-cocoa.org/forum/index.php?topic=604.0
Connectez-vous ou Inscrivez-vous pour répondre.