Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2008
eLYaN eLYaN is offline
Miembro
 
Registrado: abr 2006
Posts: 13
Poder: 0
eLYaN Va por buen camino
Paso de Array Dinamico a Procedimiento por Referencia.

Hola, tengo el siguiente problema y no encuentro solución:
Necesito pasar a un procedimiento un array dinamico y que este me lo devuelva relleno, para ello tengo un array dinamico de registros. El problema es que no se como devolver el array dinamico, dentro del procedure lo relleno bien y lo voy redimensionando pero no logro devolverlo :

Código Delphi [-]
Type TReg=Record
  X, Y: string;
end;

La llamada al procedimiento:

Código Delphi [-]
 
procedure TForm1.Button1Click(Sender: TObject);
var Reg: array of Treg;
begin
  SetLength(Reg, 0);  //0 registros
  MiProcedure(Reg);
  ShowMessage(Reg[0].x+', '+Reg[1].x);  //Aqui salta el error
end;

y el procedimiento seria:

Código Delphi [-]
Procedure TForm1.MiProcedure(var Reg: array of Treg);
var a: array of Treg;
begin
  a := Pointer(@reg);
  SetLength(a, 2);  //2 registros
  a[0].x := '0';
  a[1].x := '1';
end;

Mil Gracias.

Última edición por dec fecha: 07-11-2008 a las 19:10:19. Razón: Añadir etiquetas DELPHI al código fuente
Responder Con Cita
  #2  
Antiguo 07-11-2008
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 19
droguerman Va por buen camino
Has pensado obviar el puntero, es decir trabajar directamente con la variable reg?
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 07-11-2008
eLYaN eLYaN is offline
Miembro
 
Registrado: abr 2006
Posts: 13
Poder: 0
eLYaN Va por buen camino
El problema es que si no me equivoco esa variable es un puntero a la variable, no es la propia variable. Por tanto no puedo redimensionarla con SetLenght me da error de tipo Invalido. Con este codigo obtengo la variable la utilizo pero no se como devolversela al procedimiento que la pasa.

Gracias, de todas maneras.
Responder Con Cita
  #4  
Antiguo 08-11-2008
eLYaN eLYaN is offline
Miembro
 
Registrado: abr 2006
Posts: 13
Poder: 0
eLYaN Va por buen camino
El problema que tengo es que no puedo redimensionar añadiendo nuevos registros con SetLength al array dinamico desde el procedimiento y pasarselo como parametro de salida.

He hecho mil pruebas y no encuentro la solucion si es que existe.

Gracias.
Responder Con Cita
  #5  
Antiguo 08-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola

Código Delphi [-]
type TReg = record
     X,
     Y: string;
end;
type TRegArray = array of TReg;
 
...
 
procedure TForm1.Button1Click(Sender: TObject);
var Reg: TregArray;
begin
  SetLength(Reg, 0);  //0 registros
  MiProcedure(Reg);
  ShowMessage(Reg[0].x+', '+Reg[1].x);  //
end;

procedure TForm1.MiProcedure(var Reg: TRegArray);
begin
  SetLength(Reg, 2);  //2 registros
  Reg[0].x := '0';
  Reg[1].x := '1';
end;

asi funciona. Lei en algun sitio que delphi tiene ciertos inconvenientes al pasar arrays dinamicos como parametros. Quizas deba ser por eso que te fallase tu codigo (en principio no le veia fallo). saludos.

Última edición por coso fecha: 08-11-2008 a las 11:46:34.
Responder Con Cita
  #6  
Antiguo 08-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Delphi es un lenguaje de programación altamente tipificado, esto es, los tipos pasados por parámetros deben coincidir exactamente para que deje compilar.

Esto te obliga a usar buenas prácticas de programación como ha hecho coso
Código Delphi [-]
type TRegArray = array of TReg;

Al crear el tipo de datos en la zona interface, ya puedes usar ese tipo en todos los procedimientos de la unidad, y como el tipo de datos es el mismo, delphi te deja compilar perfectamente.

Incluso te ayuda a no cometer errores, es decir, en un lado del programa defines un array de una forma, y después intentas pasarle un array de otra forma distinta, eso provocaría errores en ejecución. Si delphi fuerza a que declares los tipos iguales, minimiza los errores de tu programa.

En cuanto a punteros y direcciones, debes saber que un array es ya un puntero a la primera posición de tu tabla, igual que tu "Form1" es un puntero a tu ventana TForm1. Delphi usa mucho los punteros, aunque los camufla de una forma elegante .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 08-11-2008
eLYaN eLYaN is offline
Miembro
 
Registrado: abr 2006
Posts: 13
Poder: 0
eLYaN Va por buen camino
Muchisimas gracias, ha funcionado a la perfección.

Saludos.
Responder Con Cita
  #8  
Antiguo 09-11-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola a todos!

Un par de cosas:

No es necesario llamar al procedimiento SetLength con una longitud de 0 cuando la variable de arreglo dinámico todavía no tiene asignación de memoria alguna. Aunque se trate de variables locales, Delphi inicializa en ceros / Nil todas las variables que usan contadores de referencia, como es el caso de las cadenas largas y los arreglos dinámicos.

Por otra parte, también podría definirse la rutina del ejemplo a manera de función en lugar de procedimiento:
Código Delphi [-]
Function TForm1.MiFuncion :TRegArray;
Begin
  SetLength (Result, 2);  //2 registros
  Result [0].X := '0';
  Result [1].X := '1';
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
  Reg :TRegArray;
begin
  Reg := MiFuncion;
  ShowMessage (Reg [0].X + ', ' + Reg [1].X);
end;

Saludos.

Al González.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Funcion Array Dinamico??? franss Varios 4 28-08-2008 22:33:23
Array Dinamico Gizhe JAVA 4 04-07-2008 21:39:46
Array Dinamico VRO Varios 6 14-06-2005 13:40:16
Inicializar array dinamico senpiterno Varios 2 08-09-2004 04:17:34
Array Dinamico senpiterno Varios 4 22-07-2004 19:37:06


La franja horaria es GMT +2. Ahora son las 19:52:50.


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