Declares y C estndar

Hola, he abierto un hilo en la seccin de SDK pero mi ingls no es muy bueno, por lo que voy a probar aqu resolver un par de dudas que tengo.
He logrado avanzar un poco pero estoy parado en un paso final. Os expongo el caso. Tengo un cdigo fuente en C estndar con el que genero una DLL (por ahora slo windows) y hasta aqu todo correcto. La DLL se genera bien y accedo a las funciones internas.

Pongo un esqueleto.

sample.h

[code]typedef double (*genann_actfun) (double a);

typedef struct genann {
int inputs, hidden_layers, hidden, outputs;
genann_actfun activation_hidden;
genann_actfun activation_output;
int total_weights;
int total_neurons;
double *weight;
double *output;
double *delta;
} genann;

extern __declspec(dllexport) int32_t DoubleValue(int32_t x); //dummy test…
extern __declspec(dllexport) const char *genann_version(void);
extern __declspec(dllexport) genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
extern __declspec(dllexport) genann *genann_read(FILE *in);
extern __declspec(dllexport) void genann_randomize(genann *ann);[/code]

sample.c

const char *test_version(void) {
	return "0.0.0";
}

testxojo *test_init(int x, int y, int z, double *delta) {
	return NULL; 
}

testxojo *test_read(FILE *file){
	return NULL;
}

FILE *test_open(const char *filename) {
    return NULL;
}

int test_write(const char *filename) {
	return 0;
}

int test_close(FILE *file) {
	return 0;
}

int test_free(testxojo *test) {
	return 0;
}[/code]

Puntualizar que las funciones no hacen nada pero devuelven el tipo correcto.
... Y he logrado conectar con esta DLL en Xojo...

[code]Soft Declare Function test_version Lib "genann.dll"  As CString
Soft Declare Function test_read Lib "genann.dll" (file As Ptr) As Ptr
Soft Declare Function test_open Lib "genann.dll" (name As CString) As Ptr
Soft Declare Function test_write Lib "genann.dll" (name As CString) As Ptr
Soft Declare Function test_close Lib "genann.dll" (file as Ptr) As Int32

Label1.Text = test_version()
Dim p As Ptr = test_open("C:\\XOJO\\FastMath\\data.txt")
Dim q As Ptr = test_read(p) 

//------------------------------------------------
Dim g As testStruct = q.testStruct //<--- Is it correct or do I have to use a MemoryBlock ???
//------------------------------------------------

TextArea1.Text = Str(g.x) + "-" + Str(g.y) + "-" + Str(g.z)

Dim clos as Integer
clos = test_close(p)

He definido una estructura en Xojo de la forma:

x as integer y as integer z as integer delta as Prt

Mi duda…
Es mas correcto gestionar la memoria en la parte de C (es decir, con malloc, por ejemplo) o es mejor gestionarla en la parte de Xojo?

Si es ms conveniente gestionar la memoria en la parte de Xojo entiendo que tengo que utilizar la clase MemoryBlock, correcto?

En ese caso cmo debo hacerlo? supongo que debo calcular la cantidad de memoria necesaria para gestionar la estructura y dimensionar el MemoryBlock pero cmo hago a partir de ah?

Hola,

Tu cdigo de C (la librera) debe de encargarse de realizar la gestin de memoria en los procesos que lleve a cabo… y en la part de Xojo ser el propio framework quien haga lo propio con el uso de sus tipos e instancias de objeto.

Quiz no llego a ver la relacin en el uso de un MemoryBlock en la parte de Xojo… si las funciones de tu librera devuelven punteros y tipos de datos primitivos (double, entero…) no has de preocuparte sobre la gestin de memoria; pero ya te digo que igual me estoy perdiendo algo de lo que quieres hacer…

Javier

Hola Javier;
Muchas gracias por tu respuesta. Tienes razn, no lo haba pensado mucho.

El asunto es que lo que necesito es realmente un frontal para una DLL, la cual es la “responsable” de gestionar los datos, de leer y de escribir ficheros de informacin tabulada, tal como est implementada ahora. Entiendo que si necesito que Xojo realice alguna operacin s necesito reservar memoria y trabajar sobre ella.

Lo que pretendo es que desde el frontal de Xojo presentarle por ejemplo los ficheros que necesita leer o escribir la librera (las rutas), proporcionarle los datos que necesita la estructura para que pueda operar internamente y luego recoger los datos que se hayan calculado internamente en la DLL para poderlos presentar en la interfaz del usuario (hecha en Xojo). Es aqu donde tengo ms dudas…

As, supongamos que necesito proporcionar a la siguiente estructura todos sus datos a travs de Xojo.

typedef struct genann { int inputs, hidden_layers, hidden, outputs; genann_actfun activation_hidden; genann_actfun activation_output; int total_weights; int total_neurons; double *weight; double *output; double *delta; } genann;

Entiendo que tengo que tener la estructura “simtrica” en la parte de Xojo y tenerla almacenada en memoria (new Memoryblock?) para luego pasarle un puntero a C (o es mejor pasar dato a dato a la estructura y olvidarme de reservar memoria?).

Luego utilizar las funciones implementadas en la DLL para realizar clculos (aqu suponemos tambin que podemos dar rutas de accesos a ficheros de datos a travs de Xojo) pero llamadas desde Xojo.

Y por ltimo, recibir un resultado (que es un puntero a una estructura C) para mostrar en la interfaz Xojo (entiendo que aqu si necesitase hacer post-operaciones en Xojo s debera reservar memoria) Estoy en lo cierto o me estoy liando?