From e251ebd1adf6d1fc73cf50af5982373abd49b033 Mon Sep 17 00:00:00 2001 From: Iakov Davydov Date: Tue, 10 May 2016 18:57:04 +0200 Subject: [PATCH] do not pass go pointers to the C code This is a proposed solution for afbarnard/go-lbfgsb#4. --- lbfgsb.go | 14 +++++++------- lbfgsb_go_interface.c | 8 ++++---- lbfgsb_go_interface.h | 6 ++++-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lbfgsb.go b/lbfgsb.go index 53c14fe..9ceaa76 100644 --- a/lbfgsb.go +++ b/lbfgsb.go @@ -292,14 +292,14 @@ func (lbfgsb *Lbfgsb) Minimize( upperBounds := makeCCopySlice_Float(lbfgsb.upperBounds, dim) // Set up callbacks for function, gradient, and logging - callbackData_c := unsafe.Pointer( - &callbackData{objective: objective}) + callbackData_c := uintptr(unsafe.Pointer( + &callbackData{objective: objective})) var doLogging_c C.int // false - var logFunctionCallbackData_c unsafe.Pointer // null + var logFunctionCallbackData_c uintptr // null if lbfgsb.logger != nil { doLogging_c = C.int(1) // true - logFunctionCallbackData_c = unsafe.Pointer( - &logCallbackData{logger: lbfgsb.logger}) + logFunctionCallbackData_c = uintptr(unsafe.Pointer( + &logCallbackData{logger: lbfgsb.logger})) } // Allocate arrays for return value @@ -333,11 +333,11 @@ func (lbfgsb *Lbfgsb) Minimize( // Call the actual L-BFGS-B procedure statusCode_c := C.lbfgsb_minimize_c( - callbackData_c, dim_c, + (C.uintptr_t)(callbackData_c), dim_c, boundsControl_c, lowerBounds_c, upperBounds_c, approximationSize_c, fTolerance_c, gTolerance_c, x0_c, minX_c, minF_c, minG_c, &iters_c, &evals_c, - printControl_c, doLogging_c, logFunctionCallbackData_c, + printControl_c, doLogging_c, (C.uintptr_t)(logFunctionCallbackData_c), statusMessage_c, statusMessageLength_c, ) diff --git a/lbfgsb_go_interface.c b/lbfgsb_go_interface.c index 5f2959e..c7ed395 100644 --- a/lbfgsb_go_interface.c +++ b/lbfgsb_go_interface.c @@ -15,7 +15,7 @@ int lbfgsb_minimize_c ( - void *callback_data, + uintptr_t callback_data, int dim, int *bounds_control, double *lower_bounds, @@ -31,7 +31,7 @@ int lbfgsb_minimize_c int *evals, int fortran_print_control, int do_logging, - void *log_function_callback_data, + uintptr_t log_function_callback_data, char *status_message, int status_message_length ) @@ -47,7 +47,7 @@ int lbfgsb_minimize_c ( go_objective_function_callback, go_objective_gradient_callback, - callback_data, + (void *)callback_data, dim, bounds_control, lower_bounds, @@ -63,7 +63,7 @@ int lbfgsb_minimize_c evals, fortran_print_control, log_function_pointer, - log_function_callback_data, + (void *)log_function_callback_data, status_message, status_message_length ); diff --git a/lbfgsb_go_interface.h b/lbfgsb_go_interface.h index 21e063d..a3e847d 100644 --- a/lbfgsb_go_interface.h +++ b/lbfgsb_go_interface.h @@ -7,9 +7,11 @@ #ifndef __LBFGSB_GO_INTERFACE_H__ #define __LBFGSB_GO_INTERFACE_H__ +#include + int lbfgsb_minimize_c ( - void *callback_data, + uintptr_t callback_data, int dim, int *bounds_control, double *lower_bounds, @@ -25,7 +27,7 @@ int lbfgsb_minimize_c int *evals, int fortran_print_control, int do_logging, - void *log_function_callback_data, + uintptr_t log_function_callback_data, char *status_message, int status_message_length );