Ver Mensaje Individual
  #1  
Antiguo 15-11-2007
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Punteros a ARRAY

Bueno gente, necesito vuestro consejo. Aquí hablo del lenguaje C, pero no os asustéis porque la pregunta no va por ahí.

Tengo una librería DLL escrita en C que tiene varias funciones que utilizan o devuelven una lista (ARRAY). C utiliza punteros para estos casos, así que hice algo como:
Código Delphi [-]
PROGRAM ejemplo;
TYPE
  TLISTAptr = ^TLISTA;
  TLISTA = RECORD
    Campo: INTEGER;
    Otro: INTEGER;
  END;

FUNCTION obtiene_lista: TLISTAptr; CDECL; EXTERNAL 'libreria.dll';

VAR
  LaLista: TLISTAptr;
BEGIN
{ En un momento dado cojo y digo: }
  LaLista := obtiene_lista;
  WriteLn (LaLista[0]);
END.
Esto compila y funciona perfectamente con Free Pascal, pero me han dicho que falla en Delphi. Así que lo cambié por esto, pensando que iba a funcionar:
Código Delphi [-]
PROGRAM ejemplo;
TYPE
  TLISTAOBJptr = ^TLISTA;
  TLISTAOBJ = RECORD
    Campo: INTEGER;
    Otro: INTEGER;
  END;

  TLISTAptr = ^TLISTA;
  TLISTA = ARRAY OF TLISTAOBJ;
  

FUNCTION obtiene_lista: TLISTAptr; CDECL; EXTERNAL 'libreria.dll';

VAR
  LaLista: TLISTAptr;
BEGIN
{ En un momento dado cojo y digo: }
  LaLista := obtiene_lista;
  WriteLn (LaLista^[0]);
END.
Esto compila en Free Pascal pero me da un error 216 en tiempo de ejecución.

Sin embargo, el siguiente código parece funcionar en ambos entornos:
Código Delphi [-]
PROGRAM ejemplo;
TYPE
  TLISTAOBJptr = ^TLISTA;
  TLISTAOBJ = RECORD
    Campo: INTEGER;
    Otro: INTEGER;
  END;

  TLISTAptr = ^TLISTA;
  TLISTA = ARRAY [0..80] OF TLISTAOBJ;
  

FUNCTION obtiene_lista: TLISTAptr; CDECL; EXTERNAL 'libreria.dll';

VAR
  LaLista: TLISTAptr;
BEGIN
{ En un momento dado cojo y digo: }
  LaLista := obtiene_lista;
  WriteLn (LaLista^[0]);
END.
Pero esto no me interesa porque la lista puede tener tamaños muy variados y no es conveniente ponerle un tamaño predeterminado.

Lo que estoy pensando es utilizar dos definiciones distintas, una para Delphi y otra para Free Pascal. Para este último lo tengo claro, pero para Delphi no ¿Alguna idea de cómo trabajar con un puntero a una lista de tamaño variable que funcione en Delphi?

Gracias.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 15-11-2007 a las 15:21:08.
Responder Con Cita