2008-09-19 15 views
2

Je me moque de la fonction ffi de plt-scheme et j'ai une fonction C qui retourne un char ** (tableau de chaînes). Si je déclare ma fonction comme (_fun _pointer -> _pointer), comment puis-je convertir le résultat en une liste de chaînes dans le schéma?Comment accéder à un char ** via ffi dans plt-scheme?

Voici les C-déclarations pertinentes:

typedef char **MYSQL_ROW; /* return data as array of strings */ 
// ... 
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result); 

Répondre

1

I pense que ce que vous voulez est le cvector:

http://docs.plt-scheme.org/foreign/Derived_Utilities.html#(part._foreign~3acvector)

A cvector de _string/utf-8 ou selon ce que vous avez besoin encodage semble reasanable.

Mais c'est à partir d'une rapide enquête sur les docs - je n'ai pas essayé moi-même. S'il vous plaît laissez-moi savoir si cela fonctionne!

+0

Je pense que vous avez raison, mais je n'ai pas vraiment compris comment l'appliquer en pratique. – troelskn

0

Je sais que ce n'est pas exactement ce que vous cherchez, mais il pourrait aider un peu. J'ai fait un peu de travail sur une base de Gambit Scheme FFI pour MySQL. Je ne sais pas comment PLT Scheme et Gambit diffèrent en termes de mise en œuvre de FFI (je me risquerais avec « assez »), mais vous pouvez peut-être obtenir quelque chose hors de lui:

http://bunny.jonnay.net/zengarden/trunk/lib/mysql/mysql-ffi.scm

0

Aha, je l'ai compris moi-même.

-je utiliser la procédure _cpointer, décrite à la page qui mike liée à:

(_fun _pointer -> (_cpointer/null 'mysql-row (make-ctype _pointer #f #f))) 

Il semble également que someone already beat me à créer un ffi à mysqlclient. Ne pas s'inquiéter; Mon objectif principal est de comprendre le ffi api, et ça continue.