Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #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
Poder: 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
  #2  
Antiguo 15-11-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 15-11-2007
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
En Trucomanía la respuesta.
Responder Con Cita
  #4  
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
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
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:56:25.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
uso de punteros David OOP 19 14-12-2009 09:48:37
Punteros davitcito Varios 2 25-04-2005 22:46:24
Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo morfeo21 Varios 5 17-08-2004 17:39:51
Punteros rafadrover OOP 8 18-09-2003 10:09:47


La franja horaria es GMT +2. Ahora son las 15:11:58.


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
Copyright 1996-2007 Club Delphi