Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Punteros a ARRAY (https://www.clubdelphi.com/foros/showthread.php?t=50360)

Ñuño Martínez 15-11-2007 15:18:34

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.

Mick 15-11-2007 15:37:08

La ultima forma es como se hace en delphi, pero el array se define con el tamaño mayor posible, po ejemplo:

Código Delphi [-]
TLISTA = ARRAY [0..MaxInt div sizeof(TListaObjectPTR)-1] OF TLISTAOBJ;
TLISTAptr = ^TLISTA;

Con esto en un S.O. de 32 bits estas definiendo un array TLista de 500 millones de elementos, lo maximo posible, pero no importa que el tipo de variable TLista que defines sea muchisimo mas grande que el que uses en realidad, porque nunca crearas un array de ese tamaño, ya que vas a utilizar punteros. Se utiliza esta definicion simplemente para poder usar la sintaxis ListP^[Indice] y te seguras asi de que el indice pueda utilizarse con cualquier tamaño de array al que apunte el puntero.

Saludos

ixMike 15-11-2007 15:51:02

En Trucomanía la respuesta.

Ñuño Martínez 15-11-2007 15:53:40

La solución me parece lógica, y más si me decís que es la práctica oficial de Delphi. Casi me avergüenzo de no haberlo pensado yo mismo (total, un puntero siempre es un puntero aunque el ARRAY sea de millones de elementos). Creo que va a ser esa la solución.

Gracias a los dos.


La franja horaria es GMT +2. Ahora son las 06:39:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi