PDA

Ver la Versión Completa : Pasar como argumento solo una dimension de un array bidimensional


paquechu
10-11-2013, 11:48:10
Buenos días,
Tengo un problema a la hora de pasar como argumento una dimension de un array bidimensional que no se como solucionar.
Queria ver si me podeis echar una mano con esto.

Tengo una función calcular(numeros: array of byte).

Tengo un array bidimensional declarado de esta forma:

bidimensional: array of array of byte;

La segunda dimension de esta variable coincide en tamaño con el de la variable numeros y contienen el mismo tipo de datos, pero no se, si es que es posible, como pasarlo. He probado varias formas pero siempre obtengo errores en la compilación:

Calcular(bidimensional[1]) -> da error: Incompatible types: Array and dynamic array
Calcular(bidimensional[1,0]) -> da error: Incompatible types array and byte..

Se puede conseguir?
Saludos

dec
10-11-2013, 14:11:32
Hola,

Tal vez puedas hacer algo parecido a esto. Nota que, por claridad, he usado "strings" en lugar de "bytes". Primero declaramos dos tipos de array, de una y de dos dimensiones:


type
TOneDimensionalArray = array of string;
TTwoDimensionalArray = array of array of string;


A continuación nuestro procedimiento "Calculate", que, recibe como argumento un array de una dimensión:


procedure Calculate( anArray : TOneDimensionalArray );
begin
ShowMessage( anArray[ 0 ] );
end;


El siguiente es el código en que hacemos uso de lo anterior:


var
// Vamos a trabajar con un array de dos dimensiones
tda : TTwoDimensionalArray;
begin

// Añadimos un elemento al array de dos dimensiones
SetLength( tda, 1 );

// Y el correspondiente elemento en el de una dimensión
SetLength( tda[ 0 ], 1 );

// Establecemos el valor del elemento
tda[ 0 ][ 0 ] := 'Hello world!';

// Y por último lo pasamos al procedimiento, como ves
// indicando que lo que pasamos es un array de una dimensión,
// es decir, tal como el procedimiento "Calculate" espera
Calculate( TOneDimensionalArray( tda[ 0 ] ) );
end;


Todo el código junto en una unidad/formulario:


unit UMainForm;

interface

uses
Forms, Classes, Controls, StdCtrls;

type
TMainForm = class(TForm)
SampleButton: TButton;
procedure SampleButtonClick(Sender: TObject);
end;

var
MainForm: TMainForm;

implementation

{$R *.dfm}

uses
Dialogs;

type
TOneDimensionalArray = array of string;
TTwoDimensionalArray = array of array of string;

procedure Calculate( anArray : TOneDimensionalArray );
begin
ShowMessage( anArray[ 0 ] ); // Mostrará "Hello world!"
end;

procedure TMainForm.SampleButtonClick(Sender: TObject);
var
// Vamos a trabajar con un array de dos dimensiones
tda : TTwoDimensionalArray;
begin

// Añadimos un elemento al array de dos dimensiones
SetLength( tda, 1 );

// Y el correspondiente elemento en el de una dimensión
SetLength( tda[ 0 ], 1 );

// Establecemos el valor del elemento
tda[ 0 ][ 0 ] := 'Hello world!';

// Y por último lo pasamos al procedimiento, como ves
// indicando que lo que pasamos es un array de una dimensión,
// es decir, tal como el procedimiento "Calculate" espera
Calculate( TOneDimensionalArray( tda[ 0 ] ) );
end;

end.



Nota que sería bien cambiar el nombre de los tipos de array a unos más descriptivos.

paquechu
10-11-2013, 18:13:51
Muchas gracias.
Muy bien detallado :-)
Un abrazo.

nlsgarcia
10-11-2013, 19:51:16
paquechu,


...Pasar como argumento solo una dimensión de un array bidimensional...¿Se puede conseguir?...


Revisa este código:

procedure TForm1.Button1Click(Sender: TObject);
const
LimMax = 10;
var
i,j : Integer;
A1 : Array[1..LimMax] of Integer;
A2 : Array[1..LimMax,1..LimMax] of Integer;

// Muestra los elementos de un arreglo pasado como parámetro
procedure ShowArray(A3 : Array of Integer);
var
i : Integer;
begin
for i := Low(A3) to High(A3) do
ShowMessage(IntToStr(A3));
end;

begin
// Inicializa los arreglos A1 y A2 : Coloca un 0 en cada elemento
FillChar(A1,SizeOf(A1),0);
FillChar(A2,SizeOf(A2),0);

// Carga en cada elemento del arreglo A2 el valor de la dimensión
for i := 1 to LimMax do
for j := 1 to LimMax do
A2[i,j] := i;

// Mueve la dimensión 5 (Quinto elemento de un arreglo de 2 dimensiones) a un arreglo de una sola dimensión
Move(A2[5],A1,SizeOf(A1));

// Mueve la dimensión 7 (Séptimo elemento de un arreglo de 2 dimensiones) a un procedimiento como parámetro
ShowArray(A2[7]);
end;

El código anterior [I]define un arreglo de dos dimensiones y pasa solo la dimensión que desea manipular en un momento dado a un arreglo de una dimensión y a un procedimiento como parámetro del mismo.

Espero sea útil :)

Nelson.

paquechu
10-11-2013, 21:03:16
Pues también me vale ;-)
Saludos.