Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Un array loco por paso de parámetros de referencia (https://www.clubdelphi.com/foros/showthread.php?t=76174)

ManiacPC 14-10-2011 00:16:32

Un array loco por paso de parámetros de referencia
 
Buenas,

Me he topado con lo siguiente en mi programación... Busqué y tiene algo que ver con los arrays dinámicos, pero estoy algo enredado
Trataré de explicar la situación a ver si a alguien le ha ocurrido:

1) Tengo una clase

Código Delphi [-]
Type
  TClaseCualquiera = Class
    private
      UnArrayDinamico : Array Of Integer;
      OtroArrayDinamico : Array Of Integer;
    published
      constructor Create;
      procedure LimpiarArray(var MiArray: Array of Integer);
    end;

2) Quiero usar un array dinámico que guarde datos enteros (en este caso, p.ej: UnArrayDinamico y OtroArrayDinamico), y resetearlo a 0 cada vez que sea necesario... Por ende, limpiar el array
por lo que usé la función LimpiarArray que es una que encontré en el mismo foro de ClubDelphi


Código Delphi [-]
{procedimiento para limpiar un array por referencia}
procedure TClaseCualquiera.LimpiarArray(var MiArray: Array Of Integer);
Var
  x: Byte;
Begin
   SetLength(MiArray,10);  //redimencionas el arreglo a tamaño 10
   for x:=0 to High(MiArray) do
    MiArray[x]:=x;
   {...}
    SetLength(MiArray,0);//redimencionas el arreglo a tamaño 0
End;

3) El error, va en el SetLength (¿raro no?), dice explícitamente:
[DCC Error] E2008 Incompatible types

Justo en la línea de:
Código Delphi [-]
   SetLength(MiArray,10);  //redimencionas el arreglo a tamaño 10

Y en todas las que tengan el SetLength...
¿Alguna idea?
Leí estos sitios, pero estoy algo enredado :S
http://rvelthuis.de/articles/articles-openarr.html
http://stackoverflow.com/questions/1...ray-of-tobject

Un cálido saludo
Un seguidor de hace años de ClubDelphi
Enrique P.

ecfisa 14-10-2011 00:35:42

Hola.

El problema se debe a que tenés una confusión entre el concepto de array dinámico y el de vectores abiertos.

Un array dinámico es un tipo de datos y se tiene que declarar como tál, es un verdadero arreglo. En cambio un vector abierto es sólo una manera de pasar argumentos a un procedimiento o función.

Para ejemplificar lo que te comento:
Código Delphi [-]
...
type
  TArrayInteger = array of Integer;

procedure Test1(Vec: TArrayInteger);
begin
  SetLength(Vec,10);
  SetLength(Vec,0);
end;

procedure Test2(Vec : array of Integer);
begin
  SetLength(Vec,10);  // error no se le puede asignar tamaño
  SetLength(Vec,0);   //  idem
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  V: TArrayInteger;
begin
  Test1(V);    // el argumento es un array dinámico
  Test2([1,2,3,4]); // el argumento es un array abierto
end;
...
Ejemplo de uso de un array abierto
Código Delphi [-]
...
procedure CerrarDataSets(VDataset: array of TDataSet);
var
  i: Integer;
begin
  for i:= Low(VDataSet) to High(VDataSet) do
    TDataSet(VDataSet[i]).Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   CerrarDataSets([DataSet1, DataSet2, DataSet3,...]);
end;
...

Es decir que tu código inicial debería ser algo como:
Código Delphi [-]
Type
  VDinamico = array of Integer;
  TClaseCualquiera = Class
    private
      UnArrayDinamico : VDinamico;
      OtroArrayDinamico : VDinamico;
    published
      constructor Create;
      procedure LimpiarArray(var MiArray: VDinamico);
    end;

Espero me haya explicado bíen.

Un saludo.

ManiacPC 14-10-2011 01:00:28

Grande
 
Worked like a charm!
¡El último caso que me pusiste pasó sin vaselina!

Se te agradece che, eres un extraterrestre. jaja
Un saludo
Enrique P.


La franja horaria es GMT +2. Ahora son las 21:18:18.

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