[C ext to Ruby] variable args length and rb_class_new_instance

U

unbewusst

i did a first try calling rb_class_new_instance with variable args
length :

rosxutils.c: In function m_rfile_wo:
rosxutils.c:1870: error: parse error before [ token

1867 VALUE m_rfile_wo ( VALUE self, VALUE file, VALUE options )
1868 {
1869 char *cfile = StringValuePtr ( file );
1870 VALUE[2] args;
1871 //VALUE args[2];
1872 args[0] = file;
1873 args[1] = options;
1874 return rb_class_new_instance ( 2, &args, rb_path2class
( "RFile" ) );
1875 }

HERE i don't see where is the parse error ???


rosxutils.c: In function m_rfile_wo:
rosxutils.c:1874: warning: passing argument 2 of rb_class_new_instance
from incompatible pointer type

1867 VALUE m_rfile_wo ( VALUE self, VALUE file, VALUE options )
1868 {
1869 char *cfile = StringValuePtr ( file );
1870 //VALUE [2] args;
1871 VALUE args[2];
1872 args[0] = file;
1873 args[1] = options;
1874 return rb_class_new_instance ( 2, &args, rb_path2class
( "RFile" ) );
1875 }

AND HERE why the pointer is incompatible, because of the "&" ???

Yvon
 
T

Tim Hunter

unbewusst said:
i did a first try calling rb_class_new_instance with variable args
length :

rosxutils.c: In function m_rfile_wo:
rosxutils.c:1870: error: parse error before [ token

1867 VALUE m_rfile_wo ( VALUE self, VALUE file, VALUE options )
1868 {
1869 char *cfile = StringValuePtr ( file );
1870 VALUE[2] args;
1871 //VALUE args[2];
1872 args[0] = file;
1873 args[1] = options;
1874 return rb_class_new_instance ( 2, &args, rb_path2class
( "RFile" ) );
1875 }

HERE i don't see where is the parse error ???

"VALUE[2] args;" is not valid C.
You need to use VALUE args[2];

rosxutils.c: In function m_rfile_wo:
rosxutils.c:1874: warning: passing argument 2 of rb_class_new_instance
from incompatible pointer type

1867 VALUE m_rfile_wo ( VALUE self, VALUE file, VALUE options )
1868 {
1869 char *cfile = StringValuePtr ( file );
1870 //VALUE [2] args;
1871 VALUE args[2];
1872 args[0] = file;
1873 args[1] = options;
1874 return rb_class_new_instance ( 2, &args, rb_path2class
( "RFile" ) );
1875 }

AND HERE why the pointer is incompatible, because of the "&" ???

Yes. In this context, "args" is a pointer to a VALUE, or "VALUE *".
&args is then a pointer to a pointer to a VALUE, or "VALUE **".
 
T

Tim Pease

1867 VALUE m_rfile_wo ( VALUE self, VALUE file, VALUE options )
1868 {
1869 char *cfile = StringValuePtr ( file );
1870 VALUE[2] args;
1871 //VALUE args[2];
1872 args[0] = file;
1873 args[1] = options;
1874 return rb_class_new_instance ( 2, &args, rb_path2class
( "RFile" ) );
1875 }

return rb_class_new_instance( 2, args, rb_path2class( "RFile" ) );

Blessings,
TwP
 
N

Nobuyoshi Nakada

Hi,

At Wed, 22 Aug 2007 01:29:57 +0900,
Tim Hunter wrote in [ruby-talk:265676]:
&args is then a pointer to a pointer to a VALUE, or "VALUE **".

VALUE (*)[2] which is different from VALUE **.
 
U

unbewusst

Hi,

At Wed, 22 Aug 2007 01:29:57 +0900,
Tim Hunter wrote in [ruby-talk:265676]:
&args is then a pointer to a pointer to a VALUE, or "VALUE **".

VALUE (*)[2] which is different from VALUE **.

ok thanks to all of you, i've found it bu myself

Yvon
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top