Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

compiler du C avec de l'ObjC ???

12 réponses
Avatar
unbewust
je voudrais utiliser un soft =E9crit en ObjC (seticon pour MacOS X) avec
un wrapper de ce soft =E9crit en C pour Ruby (language de script) et
ainsi b=E9n=E9ficier d'une extension Ruby.

j'ai test=E9 mon C (en "squelette") et aussi seticon en ObjC mais je
n'arrive pas =E0 les compiler ensemble, j'obtiens une "t=E9trachi=E9e"
d'erreurs =E0 cause des @ qui sont dans les .h et autres .m d'ObjC.


j'imagine qu'il y a une directive gcc pour permettre ce mixage ???

pour info j'utilise mkmf de Ruby pour g=E9n=E9rer le Makefile.

ou bien, dois-je compiler s=E9par=E9ment est ajouter apr=E8s coup les .o
d'ObjC dans mon .bundle ???

je ne connais pas du tout ce genre de manip...


si vous avez un peu de lumi=E8re...

Yvon

2 réponses

1 2
Avatar
unbewust
On 15 août, 18:15, Pascal Bourguignon wrote:
unbewust writes:
QUELQUES Progrès :

int coutData = MyObj_myMethod ( NULL, cinData );


En effet c'est un peu mieux, mais envoyer des messages à nil ne va pas
faire grand chose...

À un moment ou à un autre, il faudra faire:

myObj=[[MyObj alloc]init];

et passer myObj à MyObj_myMethod...



BON, finalement, voila ce que j'ai fait et qui compile sans pb, en
utilisant extconf.rb + mkmf :

MyObj.h :
+-------+
#import <Foundation/Foundation.h>

@interface MyObj : NSObject
{
@protected
int a;
}
- initWithA: (int) a;
- ( void ) setA : ( int ) newA;
- ( int ) aPlusUn;
@end

int MyObj_myMethod ( int a );

MyObj.m :
+-------+
#import "MyObj.h"

@implementation MyObj : NSObject

- initWithA: ( int ) newA
{
self = [ super init ];
if(self) {
[ self setA: newA ];
}
return self;
}
- ( void ) setA : ( int ) newA
{
a = newA;
}
- ( int ) aPlusUn
{
return a + 1;
}
- (void) dealloc {
//[ a release ];
[ super dealloc ];
}

@end

int MyObj_myMethod( int newA )
{
MyObj *myObj = [ [MyObj alloc] initWithA: newA ];
return [ myObj aPlusUn ];
}

MyRObCj.c : ( la *pseudo* C ext to Ruby using ObjC )
+---------+
#include <stdio.h>
#include <string.h>
#include "ruby.h"

VALUE cMyRObjC;

/*
* Returns the version of this module
*/
VALUE m_roc_version ( VALUE self )
{
char *version = "MyRObjC version 0.0.1";
return rb_str_new2 ( version );
}

/*
* Returns inData + 1
*/
VALUE m_a_plus_un ( VALUE self, VALUE inData )
{
int cinData = FIX2INT ( inData );
int coutData = MyObj_myMethod ( cinData );
return INT2FIX ( coutData );
}

void Init_myrobjc ()
{
cMyRObjC = rb_define_module ( "MyRObjC" );
rb_define_module_function ( cMyRObjC, "version", m_roc_version, 0 );
rb_define_module_function ( cMyRObjC, "plus_un", m_a_plus_un, 1 );
}

sample.rb : ( le test basic )
+---------+
require 'myrobjc'
include MyRObjC

puts "Testing "RObjCC""
puts "+--------------+"
puts "version() = " + version()
# => version() = MyRObjC version 0.0.1
puts "plus_un(1) = " + plus_un( 1 ).to_s
# => plus_un(1) = 2


je parviens donc à faire un test simple 1 + 1 donne 2 ;-)


Avatar
Pascal Bourguignon
unbewust writes:

On 15 août, 18:15, Pascal Bourguignon wrote:
unbewust writes:
QUELQUES Progrès :

int coutData = MyObj_myMethod ( NULL, cinData );


En effet c'est un peu mieux, mais envoyer des messages à nil ne va pas
faire grand chose...

À un moment ou à un autre, il faudra faire:

myObj=[[MyObj alloc]init];

et passer myObj à MyObj_myMethod...


ben ça je devrais pouvoir le faire depuis l'ObjC c'est à dire dans
"MyObj_myMethod"

qui deviendrait qqc comme :

id MyObj_myMethod(int a)
{
printf("in "%s" a = %dn", __func__, a);
myObj=[[MyObj alloc]init];
return [myObj myMethod:a];
}


et donc l'alloc-init se ferait côté ObjC et non côté C, où je ne vois
pas comment faire...


C'est vous qui voyez...

En général, on n'alloue pas un objet pour lui envoyer seulement un
seul message.

Voir /usr/include/objc/objc.h /usr/include/objc/objc-runtime.h etc.
You have there C functions that you could use from Ruby to get the
classes, and send random messages.

Instead of:
id myObj=[[MyObj alloc]init];
[myObj message1:a];
[myObj message2:b with:c];

you could write:

myObj=objc_send(send(objc_get_lookUpClass("MyObj"),"alloc"),"init");
objc_send(myObj,"message1:",a);
objc_send(myObj,"message2:with:",b,c);

etc. So you won't have to write a Ruby plug-in for each class, but
only a single one for the Objective-C runtime you have. (Apple's and
GNU's Objective-C runtimes are slightly different).

--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.



1 2