es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dart FFI mantiene el puntero a una estructura.

Estoy tratando de llamar a una biblioteca en C desde Dart. El código en C tiene un método generador como este:

a_struc create_struct(void);

y luego tiene métodos que reciben un puntero a la estructura, como este:

const char *get_info(const a_struc *s);

He creado el enlace en Dart usando ffigen y tengo lo siguiente:

class a_struct extends ffi.Struct {
}

a_struct create_struct() {
    return create_struct();
}

late final create_structPtr =
   _lookup<><a_struct function()="">>(
       'create_struct');
late final create_struct =
   create_structPtr.asFunction<a_struct function()="">();

y

ffi.Pointer<ffi.int8> get_info(
    ffi.Pointer<a_struct> a_struct,
  ) {
    return get_info(
      a_struct,
    );
}

late final get_infoPtr = _lookup<
    ffi.NativeFunction<><ffi.int8> Function(
        ffi.Pointer<a_struct>)>>('get_info');
late final get_info =
    get_infoPtr.asFunction<
        ffi.Pointer<ffi.int8> Function(ffi.Pointer<a_struct>)>();

Mi problema es que no sé cómo llamar al método get_info desde la clase a_struct generada por create_struct. De hecho, get_info espera un ffi.Pointer<a_struct>, pero solo genero un a_struct sin el puntero. Dado que Dart ha marcado como obsoleto el método .addressOf, ¿cómo puedo obtener un ffi.Pointer<a_struct> a partir de create_struct?</ffi.int8></ffi.int8></ffi.int8>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener un ffi.Pointer<a_struct> de create_struct, puedes utilizar el método allocate de ffi para asignar la memoria para la instancia de a_struct, luego utilizar el método addressOf en la instancia asignada para obtener el puntero. Aquí tienes un ejemplo:

    a_struct create_struct() {
      return create_struct();
    }
    
    ffi.Pointer<a_struct> create_struct_pointer() {
      final structPointer = ffi.allocate<a_struct>();
      final structInstance = create_struct();
      structPointer.ref = structInstance;
      return structPointer.addressOf;
    }
    
    ffi.Pointer<ffi.int8> get_info(ffi.Pointer<a_struct> a_struct) {
      return get_info(a_struct);
    }
    
    // Ejemplo de uso
    void main() {
      final structPointer = create_struct_pointer();
      final infoPointer = get_info(structPointer);
      // Hacer algo con infoPointer
    }
    

    En este ejemplo, el método create_struct_pointer primero asigna memoria para la instancia de a_struct utilizando ffi.allocate. Luego llama a create_struct() para obtener una instancia de a_struct, y asigna esa instancia a la memoria apuntada por structPointer. Finalmente, devuelve el Pointer<a_struct> obtenido utilizando addressOf en structPointer.

    Para llamar a get_info, puedes pasar structPointer obtenido de create_struct_pointer.</ffi.int8>

Comments are closed.