OVH Cloud OVH Cloud

[objC]concatenation de deux NSString

24 réponses
Avatar
pere.noel
comme je n'arrive pas à convertir des Boolean de FSIsAliasFile (c'est du
Carbon ???) en BOOL je les tranforme en chaine de caratère par un test.

j'ai besoin de retourner simultanément deux Booleans :
Boolean aliasFileFlag; et :
Boolean folderFlag;

par un test j'attribue, par exemple, à une NSString la valeur "1" ou "0"
suivant le test et, pour sotir les deux valeurs simultanément, je fais
une concaténation (je sois être compatible avec Ruby) :

NSLog(@"%@%@", aliasFileFlagStr, folderFlagStr);
NSString *outStr = [NSString stringWithFormat:@"%@%@", aliasFileFlagStr,
folderFlagStr];
NSLog(@"concatenation %@%@", aliasFileFlagStr);

le premier NSLog me retourne "10" ce qui est correct, par contre le
debuger s'arrête à la ligne "NSString *outStr =..."

si je click au niveau du deebugger sur "Continue" j'ai droit à un
"EXC_BAD_ACCESS", que je ne pige pas...

si au lieu de concaténé je ne dais que retourner une des deux valeurs
(aliasFileFlagStr ou folderFlagStr) ça passe impec...

je ne vois pas ce qui pose pb dans la ligne :


NSString *outStr = [NSString stringWithFormat:@"%@%@", aliasFileFlagStr,
folderFlagStr];

j'ai essayé aussi par un append... : même tableau )))

--
une bévue

10 réponses

1 2 3
Avatar
pere.noel
Luc Heinrich wrote:

en gros est-ce simple de traduire ma class ObjC en C ???


Oui, très.


apparemment gcc "sait le faire" ?
--
une bévue


Avatar
luc
Une bévue wrote:

apparemment gcc "sait le faire" ?


gcc compile. Il ne sait rien faire d'autre.

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:

gcc compile. Il ne sait rien faire d'autre.


ouais mais "dans le temps" pour compiler de l'ObjC il y avait une étape
en C...
--
une bévue

Avatar
luc
Une bévue wrote:

ouais mais "dans le temps" pour compiler de l'ObjC il y avait une étape
en C...


Je ne vois pas le rapport, je pense que tu es encore en train de tout
mélanger.

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:


Je ne vois pas le rapport, je pense que tu es encore en train de tout
mélanger.


ben non, je ne mélange pas tout, en googelisant et en cherchant un
translation ObjC -> C (que je n'ai pas trouvée, mais je vais m'n passer)
,
j'ai trouvé des infos là-dessus, disant qu'une première étape de la
compil (donc "dans le temps") pour ObjC était de traduire en C.

mais bon, je me familiarise avec C est son usage avec ruby, je suis le
pickaxe je suis parvenu à faire tourner Test...

j'en suis à CDJukeboxe et la sa couine au test :
dyld: NSLinkModule() error
dyld: Symbol not found: _CDPlayerSeek
Referenced from: ./Jukebox/cdjukebox.bundle
Expected in: flat namespace

apparemment, c'est un message courant sur MacOS X, mais j'ai testé qq
solutions sans succès. je pense que le pb est au MakeFile et donc le
extconf.rb particuliérement simple...
--
une bévue

Avatar
luc
Une bévue wrote:

j'en suis à CDJukeboxe et la sa couine au test :

dyld: NSLinkModule() error
dyld: Symbol not found: _CDPlayerSeek
Referenced from: ./Jukebox/cdjukebox.bundle
Expected in: flat namespace


Heu, le code du PickAxe est un **exemple** de wrapping d'une librairie
**hypothétique** dont il te faudrait le code pour que tout fonctionne
correctement. Le message d'erreur est tout à fait normal dans le mesure
où tu n'as pas pu linker ton bundle avec l'implémentation de cette
librairie, puisqu'elle n'existe pas :)

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:


Heu, le code du PickAxe est un **exemple** de wrapping d'une librairie
**hypothétique** dont il te faudrait le code pour que tout fonctionne
correctement. Le message d'erreur est tout à fait normal dans le mesure
où tu n'as pas pu linker ton bundle avec l'implémentation de cette
librairie, puisqu'elle n'existe pas :)


ah m@&de ! je savais que la librairie était "hypothétique" mais je
pensais que elle la simulait, que l'exemple était "running" parce que
j'ai suivi le "même" exemple en ObjC "The RubyCocoa Jukebox"
<http://www.rubycocoa.com/ruby-extensions-with-rubycocoa/2> et là ça
roule...

mais je ne suis pas satisfait du code côté Ruby avec cette version ObjC,
d'après ce que j'ai compris une version C permettrait d'accéder plus
simplement à ce Module/class...
--
une bévue

Avatar
luc
Une bévue wrote:

mais je ne suis pas satisfait du code côté Ruby avec cette version ObjC,
d'après ce que j'ai compris une version C permettrait d'accéder plus
simplement à ce Module/class...


Pour ce que tu veux faire (une classe ou un module Ruby qui permette de
résoudre des alias), il n'y a absolument pas besoin d'ObjC.

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:


Pour ce que tu veux faire (une classe ou un module Ruby qui permette de
résoudre des alias), il n'y a absolument pas besoin d'ObjC.


ouais d'accord, je "dirais même plus" ObjC est plus lourd à utiliser que
C côté ruby et de plus les fonctions carbon que j'appellerai quand mon
squelette de class compilera )), sont écritent en C...

bon là, j'ai une dummy clas comme "CDPlayer" que j'appelle "RAliasFile",
grosso-modo je n'ai fait qu'un copier-coller de cdjukebox.c et
cdjukebox.h lesquels compilent, et moi j'ai une palanquée d'erreurs au
make :

darwin8.7.0 -I. -O -pipe -I/opt/local/include -c RAliasFile.c
RAliasFile.c: In function 'getOrigPath':
RAliasFile.c:15: error: storage class specified for parameter 'raf_free'
RAliasFile.c:15: error: parse error before '{' token
RAliasFile.c:15: error: old-style parameter declarations in prototyped
function definition
RAliasFile.c:16: error: 'p' undeclared (first use in this function)
RAliasFile.c:16: error: (Each undeclared identifier is reported only
once
RAliasFile.c:16: error: for each function it appears in.)
RAliasFile.c: In function 'raf_new':
RAliasFile.c:51: error: 'raf_free' undeclared (first use in this
function)
RAliasFile.c: In function 'Init_RAliasFile':
RAliasFile.c:59: error: 'cRAliasFile' undeclared (first use in this
function)
make: *** [RAliasFile.o] Error 1

l'erreur que je comprends le moins est :
RAliasFile.c:15: error: parse error before '{' token

laquelle peut entraîner une part des autres...

avec :

--- RAliasFile.h -----------------------------------------------------
#include "ruby.h"

typedef struct _raf {
char *fullAliasPath;
char *orig_path;
int aliasFile;
} RAliasFile;

RAliasFile *RAliasFileNew(char *fullAliasPath);

void RAliasFileDispose(RAliasFile *rec);

VALUE getOrigPath(RAliasFile *rec)
VALUE isAliasFile(RAliasFile *rec);
-----------------------------------------------------------------------
et :
--- RAliasFile.c -----------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include "ruby.h"
#include "RAliasFile.h"

// Defining a space for information and references about
// the module to be stored internally
VALUE cRAliasFile;


static void raf_free(void *p) { // *** LIGNE 15 ***
RAliasFileDispose(p);
}

static VALUE
raf_getOrigPath(VALUE self)
{
RAliasFile *ptr;
Data_Get_Struct(self, RAliasFile, ptr);

char *orig_path = "/Users/yvon/work/Ruby/Native/RubyInline-3.5.0.gem";
return rb_str_new2(orig_path);
}

static VALUE
raf_isAliasFile(VALUE self)
{
RAliasFile *ptr;
Data_Get_Struct(self, RAliasFile, ptr);
int aliasFile = 1;
return INT2FIX(aliasFile);
}


static VALUE
raf_init(VALUE self, VALUE fullAliasPath)
{
rb_iv_set(self, "@fullAliasPath", fullAliasPath);
return self;
}


VALUE raf_new(VALUE class, VALUE fullAliasPath)
{
VALUE argv[1];
RAliasFile *ptr = RAliasFileNew(STR2CSTR(fullAliasPath));
VALUE tdata = Data_Wrap_Struct(class, 0, raf_free, ptr);
argv[0] = fullAliasPath;
rb_obj_call_init(tdata, 1, argv);
return tdata;
}


void Init_RAliasFile() {
cRAliasFile = rb_define_class("RAliasFile", rb_cObject);
rb_define_singleton_method(cRAliasFile, "new", raf_new, 1);
rb_define_method(cRAliasFile, "initialize", raf_init, 1);
rb_define_method(cRAliasFile, "getOrigPath", raf_getOrigPath, 2);
rb_define_method(cRAliasFile, "isAliasFile", raf_isAliasFile, 0);
}
-----------------------------------------------------------------------

--
une bévue

Avatar
luc
Une bévue wrote:

--- RAliasFile.h -----------------------------------------------------
[snip]
VALUE getOrigPath(RAliasFile *rec)
[snip]
^

Il te manque un ';' là..............^

--
Luc Heinrich

1 2 3