[Pyrex] error: conversion to non-scalar type requested
Lenard Lindstrom
len-l at telus.net
Thu Apr 10 23:40:55 CEST 2008
Sven Berkvens-Matthijsse wrote:
>> Now I've not the code to try this, but I think it doesn't solve the
>> problem. func function needs a struct in_addr, not a pointer to
>> struct in_addr, so the cast is correct. Maybe the problem is in the
>> generated C code. I'll post the original pyrex (and C generated)
>> code that originate this error very soon to give you more details.
>>
>
> No, what Lenard said is correct, the cast binds stronger than the []
> operator. What you said:
>
> tmp = <in_addr>tmpinPtr[0]
>
> actually reads as:
>
> tmp = (<in_addr>tmpinPtr)[0]
>
> which of course does not work. What Lenard says reads as:
>
> tmp = (<in_addr *>tmpinPtr)[0]
>
> which is correct. Of course, you can write it your way, just be sure
> to use parentheses in that case, like this:
>
> tmp = <in_addr>(tmpinPtr[0])
>
>
Actually, if I understood the original question correctly, the function
getIstance() returns a pointer as a C long. So first the long must be
recast as a pointer:
<in_addr *>tmpinPtr
Then the pointer must be dereferenced to get an in_addr value:
(<in_addr *>tmpinPtr)[0]
The parenthesis are required. When looking up operator precedence I
confused the cast operator with the function call. Also tmpinPtr must be
declared as long. The following Pyrex module compiles and runs.
++++++++++++++++++++++++++++++++++++++++
ctypedef struct in_addr:
int i
double d
cdef in_addr instance
cdef in_addr tmp
cdef long tmpinPtr
instance.i = 1
instance.d = 3.14
def getInstance():
return <long>&instance
cdef func(in_addr tmp):
print tmp.i, tmp.d
tmpinPtr = getInstance()
tmp = (<in_addr *>tmpinPtr)[0]
func(tmp)
++++++++++++++++++++++++++++++++++++++++
--
Lenard Lindstrom
<len-l at telus.net>
More information about the Pyrex
mailing list