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
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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.