Miki,

I believe that's a side-effect of the cgocheck pointer rules.

if you add another testcase just before the call to lib.Div(1.2,2.3) such
as:
r = lib.Div(1,0)

you'll see:
Div called: x=1.000000, y=0.000000
panic: runtime error: cgo result has Go pointer

goroutine 17 [running, locked to thread]:
main._cgoexpwrap_129de112d50d_Div.func1(0xc420038ea8)
command-line-arguments/_obj/_cgo_gotypes.go:46 +0x42
main._cgoexpwrap_129de112d50d_Div(0x3ff0000000000000, 0x0, 0x0,
0x7faa00edd020, 0xc420012290)
command-line-arguments/_obj/_cgo_gotypes.go:48 +0xaa
Aborted (core dumped)

ie: when the error is not nil, the panic is different.

if you run like so:
$> GODEBUG=cgocheck=0 python ./gmath.py
Div called: x=1.000000, y=0.000000
Div called: x=1.200000, y=2.300000

FYI, if you were to use github.com/go-python/gopy, you could do:

$> cat > pkg.go
package gmath
import "fmt"

func Div(x,y float64) (float64, error) { ... }

$> gopy bind .
$> GODEBUG=cgocheck=0 python2
py2> import gmath
py2> gmath.Div(1,0)
Div called: x=1.000000, y=0.000000
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: ZeroDivisionError
py2> gmath.Div(1.2,2.3)
Div called: x=1.200000, y=2.300000
0.5217391304347826

</shameless-plug>

hth,
-s

On Thu, Mar 9, 2017 at 4:00 PM, Miki Tebeka <miki.teb...@gmail.com> wrote:

> Hi There,
>
> (Originally posted on StackOverflow
> <http://stackoverflow.com/questions/42689133/invalid-memory-address-when-calling-go-from-python>,
> trying my luck here as well).
>
> I'm trying to extend the code in Calling Go Functions from Other
> Languages. I'd like see how a function returning an error can be handled.
> See the code below, I get "panic: runtime error: invalid memory address or
> nil pointer dereference" when running the Python code. Any ideas on how to
> fix this?
>
> gmath.go
>
> package main
>
>
> import (
>     "fmt"
> )
>
>
> import "C"
>
>
> //export Div
> func Div(x, y float64) (float64, error) {
>     fmt.Printf("Div called: x=%f, y=%f\n", x, y)
>     if y == 0 {
>         return 0, fmt.Errorf("ZeroDivisionError")
>     }
>     return x / y, nil
> }
>
>
> func main() {}
>
>
> gmath.py
>
> import ctypes
>
>
>
>
> class GoInterface(ctypes.Structure):
>     _fields_ = [
>         ('t', ctypes.c_void_p),
>         ('v', ctypes.c_void_p),
>     ]
>
>
>
>
> class DivRet(ctypes.Structure):
>     _fields_ = [
>         ('result', ctypes.c_float),
>         ('error', GoInterface),
>     ]
>
>
>
>
> lib = ctypes.cdll.LoadLibrary('./gmath.so')
> lib.Div.argtypes = [ctypes.c_double, ctypes.c_double]
> lib.Div.restype = DivRet
>
>
> r = lib.Div(1.2, 2.3)
>
> Example run
>
> $ make
> go build -o gmath.so -buildmode=c-shared gmath.go
> $ python gmath.py
> Div called: x=1.200000, y=2.300000
> panic: runtime error: invalid memory address or nil pointer dereference
> [signal SIGSEGV: segmentation violation code=0x1 addr=0x17 pc=
> 0x7fbe5fda928d]
>
>
> goroutine 17 [running, locked to thread]:
> main._cgoexpwrap_448ea9090bef_Div.func1(0xc42003cea8)
>     command-line-arguments/_obj/_cgo_gotypes.go:46 +0x42
> main._cgoexpwrap_448ea9090bef_Div(0x3ff3333333333333, 0x4002666666666666,
> 0x3fe0b21642c8590b, 0x0, 0x0)
>
>
>     command-line-arguments/_obj/_cgo_gotypes.go:48 +0xaa
> [1]    29009 abort (core dumped)  python gmath.py
>
> I've tried calling the Go code directly from C - with same results.
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to