From: Ben Giddings Date: 2005-02-02T11:14:58+09:00 Subject: Ruby/DL and functions that modify a pointer I just started using Ruby/DL and am amazed at what it can do. I've almost got a really impressive demo to show off to my cow-orkers, but I have one cow left to ork... er... I have one thing left to figure out. Given some C code like this: typdef struct { int status; int results[16]; } foo_t; int get_results(handle_t the_handle, foo_t *results_ptr) { results_ptr->status = 0; results_ptr->results[0] = 0xFF; return 0; } How do I interface to that code in Ruby/DL? I already have functions that take handles, I just treat it as a pointer and everything works great: require 'dl/import' module LIBMYAPI extend DL::Importable dlload "./libmyapi.so.1.0.1" typealias("size_t", "unsigned int") typealias("id_t", "int") extern "void *open_handle(char *)" extern "char *get_version(void *)" extern "int close_handle(void *)" end if __FILE__ == $0 hostname = 'foo' handle = LIBMYAPI.open_handle("m4-c0050c") result = LIBMYAPI.get_version(handle) puts result LIBM4API.close_handle(handle) end I just don't know how to tell Ruby/DL that get_results takes a pointer, then changes it. While I'm at it, what's the proper way to deal with a structure containing an array, if you want to access things by name? Something like this works for the 'timeval' struct, but I don't know how to use it with structs containing arrays. ptr = DL.malloc(DL.sizeof('LL')) ptr.struct!('LL', :tv_sec, :tv_usec) ptr[:tv_sec] = 10 ptr[:tv_usec] = 100 sec = ptr[:tv_sec] usec = ptr[:tv_usec] Thanks! Ben