You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pylucene-dev@lucene.apache.org by Petrus Hyvönen <pe...@gmail.com> on 2012/01/28 18:15:32 UTC

Typecasting in JCC (i think..)

Hi all,

I have a problem which I think is due to typecasting,

I have wrapped a function that has following input types:

TLE(jint, jchar, jint, jint, const ::java::lang::String &, jint, jint,
const ::org::orekit::time::AbsoluteDate &, jdouble, jdouble, jdouble,
jdouble, jdouble, jdouble, jdouble, jdouble, jint, jdouble);

I have been trying all kind of stuff to call it from python, but get

InvalidArgsError: (<type 'TLE'>, '__init__', (5555, JArray<char>u'U',
2000, 1, 'A', 0, 1, <AbsoluteDate: 2012-01-26T11:00:00.000>,
0.0011421088155377755, 1.5670255537196003e-12, 0.0, 0.0,
0.7059490305174144, 5.583519461969352, 4.184206970170655,
0.7002697291314248, 0, 0.0007279))

(in different kind of fashion depending on how far my tests has gone)

My feeling now is that there is something with the input type jchar
and java String. Both are actually single characters that I want to
send, but in python I use (as a start) 'A' syntax for both. Do I need
to typecast it to a jchar? I tried in the example above to cast it
using JArray_char but no success.

How does JCC differ between when i want to send 'A' as a char and as a
string? or does it try it as both?

Many thanks for any comment,
Best regards
/Petrus

Re: Typecasting in JCC (i think..)

Posted by Andi Vajda <va...@apache.org>.
On Sat, 28 Jan 2012, Petrus Hyvönen wrote:

> Hi Andi,
>
> Many many thanks for your answer, using the u'A' worked perfectly! I 
> wouldn't have figured that out myself.

"Use the source, Luke"
/me ducks

Andi..

>
> Big thanks.
>
> Regards
> /Petrus
>
>
>
>
>
>
> On Jan 28, 2012, at 11:05 PM, Andi Vajda wrote:
>
>>
>> Hi Petrus,
>>
>> On Sat, 28 Jan 2012, Petrus Hyvönen wrote:
>>
>>> Thanks for the prompt reply,
>>>
>>> Yes, no difference, it treats it as an int in that case.
>>>
>>> "InvalidArgsError: (<type 'TLE'>, '__init__', (5555, 65, 2000, 1, 'A', 0, 1,..."
>>>
>>> In the error message, it seems like int,float,string are printed
>>> without a type but others are printed with a <type>?
>>
>> According to the source code of _parseArgs in functions.cpp, a char must be passed with one-character unicode string:
>>
>>          case 'C':           /* char */
>>          {
>>              if (array)
>>              {
>>                  if (arg == Py_None)
>>                      break;
>>                  if (PyObject_TypeCheck(arg, PY_TYPE(JArrayChar)))
>>                      break;
>>              }
>>              else if (PyUnicode_Check(arg) && PyUnicode_GET_SIZE(arg) == 1)
>>                  break;
>>              return -1;
>>          }
>>
>> Please, try passing u'A' instead of just 'A' to see if that works.
>>
>> I can't think of a reason right now why this was written that way but it was intentional as the part that extracts the character also expects a one-character unicode string and has no code to support a plain string.
>>
>> The reasoning was probably that a jchar is a unicode character and thus a unicode string must be required but I don't see why it couldn't be extended to supporting also a one-character byte string (a plain str in python 2.x).
>>
>> Andi..
>>
>>
>>>
>>> Regards
>>> /Petrus
>>>
>>>
>>> On Sat, Jan 28, 2012 at 6:26 PM, Andi Vajda <va...@apache.org> wrote:
>>>>
>>>> On Jan 28, 2012, at 9:15, Petrus Hyvönen <pe...@gmail.com> wrote:
>>>>
>>>>> Hi all,
>>>>>
>>>>> I have a problem which I think is due to typecasting,
>>>>>
>>>>> I have wrapped a function that has following input types:
>>>>>
>>>>> TLE(jint, jchar, jint, jint, const ::java::lang::String &, jint, jint,
>>>>> const ::org::orekit::time::AbsoluteDate &, jdouble, jdouble, jdouble,
>>>>> jdouble, jdouble, jdouble, jdouble, jdouble, jint, jdouble);
>>>>>
>>>>> I have been trying all kind of stuff to call it from python, but get
>>>>>
>>>>> InvalidArgsError: (<type 'TLE'>, '__init__', (5555, JArray<char>u'U',
>>>>> 2000, 1, 'A', 0, 1, <AbsoluteDate: 2012-01-26T11:00:00.000>,
>>>>> 0.0011421088155377755, 1.5670255537196003e-12, 0.0, 0.0,
>>>>> 0.7059490305174144, 5.583519461969352, 4.184206970170655,
>>>>> 0.7002697291314248, 0, 0.0007279))
>>>>>
>>>>> (in different kind of fashion depending on how far my tests has gone)
>>>>>
>>>>> My feeling now is that there is something with the input type jchar
>>>>> and java String. Both are actually single characters that I want to
>>>>> send, but in python I use (as a start) 'A' syntax for both. Do I need
>>>>> to typecast it to a jchar? I tried in the example above to cast it
>>>>> using JArray_char but no success.
>>>>>
>>>>> How does JCC differ between when i want to send 'A' as a char and as a
>>>>> string? or does it try it as both?
>>>>
>>>> Have you tried sending 'A' as 65, its ascii code ? ord('A').
>>>>
>>>> Andi..
>>>>
>>>>>
>>>>> Many thanks for any comment,
>>>>> Best regards
>>>>> /Petrus
>>>
>>>
>>>
>>> --
>>> _____________________________________________
>>> Petrus Hyvönen, Uppsala, Sweden
>>> Mobile Phone/SMS:+46 73 803 19 00
>
> _____________________________________________
> Petrus Hyvönen, Space Engineer, Uppsala, Sweden
> Mobile Phone/SMS:+46 73 803 1900
>
>
>
>

Re: Typecasting in JCC (i think..)

Posted by Petrus Hyvönen <pe...@gmail.com>.
Hi Andi,

Many many thanks for your answer, using the u'A' worked perfectly! I wouldn't have figured that out myself.

Big thanks.

Regards
/Petrus






On Jan 28, 2012, at 11:05 PM, Andi Vajda wrote:

> 
> Hi Petrus,
> 
> On Sat, 28 Jan 2012, Petrus Hyvönen wrote:
> 
>> Thanks for the prompt reply,
>> 
>> Yes, no difference, it treats it as an int in that case.
>> 
>> "InvalidArgsError: (<type 'TLE'>, '__init__', (5555, 65, 2000, 1, 'A', 0, 1,..."
>> 
>> In the error message, it seems like int,float,string are printed
>> without a type but others are printed with a <type>?
> 
> According to the source code of _parseArgs in functions.cpp, a char must be passed with one-character unicode string:
> 
>          case 'C':           /* char */
>          {
>              if (array)
>              {
>                  if (arg == Py_None)
>                      break;
>                  if (PyObject_TypeCheck(arg, PY_TYPE(JArrayChar)))
>                      break;
>              }
>              else if (PyUnicode_Check(arg) && PyUnicode_GET_SIZE(arg) == 1)
>                  break;
>              return -1;
>          }
> 
> Please, try passing u'A' instead of just 'A' to see if that works.
> 
> I can't think of a reason right now why this was written that way but it was intentional as the part that extracts the character also expects a one-character unicode string and has no code to support a plain string.
> 
> The reasoning was probably that a jchar is a unicode character and thus a unicode string must be required but I don't see why it couldn't be extended to supporting also a one-character byte string (a plain str in python 2.x).
> 
> Andi..
> 
> 
>> 
>> Regards
>> /Petrus
>> 
>> 
>> On Sat, Jan 28, 2012 at 6:26 PM, Andi Vajda <va...@apache.org> wrote:
>>> 
>>> On Jan 28, 2012, at 9:15, Petrus Hyvönen <pe...@gmail.com> wrote:
>>> 
>>>> Hi all,
>>>> 
>>>> I have a problem which I think is due to typecasting,
>>>> 
>>>> I have wrapped a function that has following input types:
>>>> 
>>>> TLE(jint, jchar, jint, jint, const ::java::lang::String &, jint, jint,
>>>> const ::org::orekit::time::AbsoluteDate &, jdouble, jdouble, jdouble,
>>>> jdouble, jdouble, jdouble, jdouble, jdouble, jint, jdouble);
>>>> 
>>>> I have been trying all kind of stuff to call it from python, but get
>>>> 
>>>> InvalidArgsError: (<type 'TLE'>, '__init__', (5555, JArray<char>u'U',
>>>> 2000, 1, 'A', 0, 1, <AbsoluteDate: 2012-01-26T11:00:00.000>,
>>>> 0.0011421088155377755, 1.5670255537196003e-12, 0.0, 0.0,
>>>> 0.7059490305174144, 5.583519461969352, 4.184206970170655,
>>>> 0.7002697291314248, 0, 0.0007279))
>>>> 
>>>> (in different kind of fashion depending on how far my tests has gone)
>>>> 
>>>> My feeling now is that there is something with the input type jchar
>>>> and java String. Both are actually single characters that I want to
>>>> send, but in python I use (as a start) 'A' syntax for both. Do I need
>>>> to typecast it to a jchar? I tried in the example above to cast it
>>>> using JArray_char but no success.
>>>> 
>>>> How does JCC differ between when i want to send 'A' as a char and as a
>>>> string? or does it try it as both?
>>> 
>>> Have you tried sending 'A' as 65, its ascii code ? ord('A').
>>> 
>>> Andi..
>>> 
>>>> 
>>>> Many thanks for any comment,
>>>> Best regards
>>>> /Petrus
>> 
>> 
>> 
>> -- 
>> _____________________________________________
>> Petrus Hyvönen, Uppsala, Sweden
>> Mobile Phone/SMS:+46 73 803 19 00

_____________________________________________
Petrus Hyvönen, Space Engineer, Uppsala, Sweden
Mobile Phone/SMS:+46 73 803 1900




Re: Typecasting in JCC (i think..)

Posted by Andi Vajda <va...@apache.org>.
  Hi Petrus,

On Sat, 28 Jan 2012, Petrus Hyvönen wrote:

> Thanks for the prompt reply,
>
> Yes, no difference, it treats it as an int in that case.
>
> "InvalidArgsError: (<type 'TLE'>, '__init__', (5555, 65, 2000, 1, 'A', 0, 1,..."
>
> In the error message, it seems like int,float,string are printed
> without a type but others are printed with a <type>?

According to the source code of _parseArgs in functions.cpp, a char must be 
passed with one-character unicode string:

           case 'C':           /* char */
           {
               if (array)
               {
                   if (arg == Py_None)
                       break;
                   if (PyObject_TypeCheck(arg, PY_TYPE(JArrayChar)))
                       break;
               }
               else if (PyUnicode_Check(arg) && PyUnicode_GET_SIZE(arg) == 1)
                   break;
               return -1;
           }

Please, try passing u'A' instead of just 'A' to see if that works.

I can't think of a reason right now why this was written that way but it was 
intentional as the part that extracts the character also expects a 
one-character unicode string and has no code to support a plain string.

The reasoning was probably that a jchar is a unicode character and thus a 
unicode string must be required but I don't see why it couldn't be extended 
to supporting also a one-character byte string (a plain str in python 2.x).

Andi..


>
> Regards
> /Petrus
>
>
> On Sat, Jan 28, 2012 at 6:26 PM, Andi Vajda <va...@apache.org> wrote:
>>
>> On Jan 28, 2012, at 9:15, Petrus Hyvönen <pe...@gmail.com> wrote:
>>
>>> Hi all,
>>>
>>> I have a problem which I think is due to typecasting,
>>>
>>> I have wrapped a function that has following input types:
>>>
>>> TLE(jint, jchar, jint, jint, const ::java::lang::String &, jint, jint,
>>> const ::org::orekit::time::AbsoluteDate &, jdouble, jdouble, jdouble,
>>> jdouble, jdouble, jdouble, jdouble, jdouble, jint, jdouble);
>>>
>>> I have been trying all kind of stuff to call it from python, but get
>>>
>>> InvalidArgsError: (<type 'TLE'>, '__init__', (5555, JArray<char>u'U',
>>> 2000, 1, 'A', 0, 1, <AbsoluteDate: 2012-01-26T11:00:00.000>,
>>> 0.0011421088155377755, 1.5670255537196003e-12, 0.0, 0.0,
>>> 0.7059490305174144, 5.583519461969352, 4.184206970170655,
>>> 0.7002697291314248, 0, 0.0007279))
>>>
>>> (in different kind of fashion depending on how far my tests has gone)
>>>
>>> My feeling now is that there is something with the input type jchar
>>> and java String. Both are actually single characters that I want to
>>> send, but in python I use (as a start) 'A' syntax for both. Do I need
>>> to typecast it to a jchar? I tried in the example above to cast it
>>> using JArray_char but no success.
>>>
>>> How does JCC differ between when i want to send 'A' as a char and as a
>>> string? or does it try it as both?
>>
>> Have you tried sending 'A' as 65, its ascii code ? ord('A').
>>
>> Andi..
>>
>>>
>>> Many thanks for any comment,
>>> Best regards
>>> /Petrus
>
>
>
> -- 
> _____________________________________________
> Petrus Hyvönen, Uppsala, Sweden
> Mobile Phone/SMS:+46 73 803 19 00
>

Re: Typecasting in JCC (i think..)

Posted by Andi Vajda <va...@apache.org>.
On Tue, 31 Jan 2012, Petrus Hyvönen wrote:

> Is there a way of specifying which java SDK to link to? On my windows
> 7 machine it wants to use Java SDK 1.7 but I would like to keep it at
> SDK 1.6? Is this possible?

When you build jcc, you choose which JDK you compile with and link to 
via the CFLAGS and LFLAGS variables in jcc's setup.py.

Be sure to set your PATH accordingly when you run this executable or the 
executables you build with it.

Andi..

Re: Typecasting in JCC (i think..)

Posted by Petrus Hyvönen <pe...@gmail.com>.
Hi,

Is there a way of specifying which java SDK to link to? On my windows
7 machine it wants to use Java SDK 1.7 but I would like to keep it at
SDK 1.6? Is this possible?

Regards

Re: Typecasting in JCC (i think..)

Posted by Petrus Hyvönen <pe...@gmail.com>.
Thanks for the prompt reply,

Yes, no difference, it treats it as an int in that case.

"InvalidArgsError: (<type 'TLE'>, '__init__', (5555, 65, 2000, 1, 'A', 0, 1,..."

In the error message, it seems like int,float,string are printed
without a type but others are printed with a <type>?

Regards
/Petrus


On Sat, Jan 28, 2012 at 6:26 PM, Andi Vajda <va...@apache.org> wrote:
>
> On Jan 28, 2012, at 9:15, Petrus Hyvönen <pe...@gmail.com> wrote:
>
>> Hi all,
>>
>> I have a problem which I think is due to typecasting,
>>
>> I have wrapped a function that has following input types:
>>
>> TLE(jint, jchar, jint, jint, const ::java::lang::String &, jint, jint,
>> const ::org::orekit::time::AbsoluteDate &, jdouble, jdouble, jdouble,
>> jdouble, jdouble, jdouble, jdouble, jdouble, jint, jdouble);
>>
>> I have been trying all kind of stuff to call it from python, but get
>>
>> InvalidArgsError: (<type 'TLE'>, '__init__', (5555, JArray<char>u'U',
>> 2000, 1, 'A', 0, 1, <AbsoluteDate: 2012-01-26T11:00:00.000>,
>> 0.0011421088155377755, 1.5670255537196003e-12, 0.0, 0.0,
>> 0.7059490305174144, 5.583519461969352, 4.184206970170655,
>> 0.7002697291314248, 0, 0.0007279))
>>
>> (in different kind of fashion depending on how far my tests has gone)
>>
>> My feeling now is that there is something with the input type jchar
>> and java String. Both are actually single characters that I want to
>> send, but in python I use (as a start) 'A' syntax for both. Do I need
>> to typecast it to a jchar? I tried in the example above to cast it
>> using JArray_char but no success.
>>
>> How does JCC differ between when i want to send 'A' as a char and as a
>> string? or does it try it as both?
>
> Have you tried sending 'A' as 65, its ascii code ? ord('A').
>
> Andi..
>
>>
>> Many thanks for any comment,
>> Best regards
>> /Petrus



-- 
_____________________________________________
Petrus Hyvönen, Uppsala, Sweden
Mobile Phone/SMS:+46 73 803 19 00

Re: Typecasting in JCC (i think..)

Posted by Andi Vajda <va...@apache.org>.
On Jan 28, 2012, at 9:15, Petrus Hyvönen <pe...@gmail.com> wrote:

> Hi all,
> 
> I have a problem which I think is due to typecasting,
> 
> I have wrapped a function that has following input types:
> 
> TLE(jint, jchar, jint, jint, const ::java::lang::String &, jint, jint,
> const ::org::orekit::time::AbsoluteDate &, jdouble, jdouble, jdouble,
> jdouble, jdouble, jdouble, jdouble, jdouble, jint, jdouble);
> 
> I have been trying all kind of stuff to call it from python, but get
> 
> InvalidArgsError: (<type 'TLE'>, '__init__', (5555, JArray<char>u'U',
> 2000, 1, 'A', 0, 1, <AbsoluteDate: 2012-01-26T11:00:00.000>,
> 0.0011421088155377755, 1.5670255537196003e-12, 0.0, 0.0,
> 0.7059490305174144, 5.583519461969352, 4.184206970170655,
> 0.7002697291314248, 0, 0.0007279))
> 
> (in different kind of fashion depending on how far my tests has gone)
> 
> My feeling now is that there is something with the input type jchar
> and java String. Both are actually single characters that I want to
> send, but in python I use (as a start) 'A' syntax for both. Do I need
> to typecast it to a jchar? I tried in the example above to cast it
> using JArray_char but no success.
> 
> How does JCC differ between when i want to send 'A' as a char and as a
> string? or does it try it as both?

Have you tried sending 'A' as 65, its ascii code ? ord('A').

Andi..

> 
> Many thanks for any comment,
> Best regards
> /Petrus