PDA

Ver la Versión Completa : Cambiar indice inicial de un Array Dinamico


jconnor82
14-02-2009, 00:17:33
Hola a todos, tengo una consulta:

He creado un arreglo dinamico:


type

MatrixArray = array of array of extended;

...

var
Matrix: MatrixArray;
...
// Fijo las dimensiones del arreglo
SetLength(Matrix, 4, 4);
// Ingreso valores
for i:=0 to 3 do
for j:=0 to 3 do
Matrix[i, j] := i + j;
...


Mi consulta: para acceder al primer elemento del arreglo tengo q hacerlo desde el indice 0, hay alguna forma de cambiar el indice con el q se inicia, por ejemplo uno, esto lo quiero de esa forma, porque, como se habran dado cuenta el arreglo es una matriz y el primer elemento tiene que ser Matriz[1, 1].

O almenos tener un arreglo dinamico de una fila que se pueda acceder de la siguiente forma:


var
Fila: array of Extended;
...
SetLength(Fila, 3);

{Rutina q cambia el indice inicial de 0 a 1}

// Para acceder a la fila se haria de la siguiente forma
for i:=1 to 3 do
showmessage(Fila[i]);
...


Otra razon por la que tiene que estar de esa forma es porque es parte de un objeto q estoy creando y da como resultado lo q contiene una fila o columna, y esta tiene q empezar desde la fila 1.

Gracias por las respuestas.

PD: No se si es idea mia, pero, esto ya lo habia visto por el foro, lo he buscado, pero, no he encontrado alguna referencia. Ojala y aparezca en Temas Similares :D

Al González
14-02-2009, 02:22:15
No encuentro que esto sea muy necesario de hacer, porque basta restar 1 o sumar 1 cuando convenga. Pero si de todas formas quieres hacerlo como dices, te doy una forma de aproximarte:


procedure TForm1.Button1Click(Sender: TObject);
Type
TA = Array [1..1000000] Of Extended;
Var
Fila :Array of Extended;
FilaX :^TA Absolute Fila;
I :Integer;
Begin
SetLength (Fila, 3);
Fila [0] := 17;
Fila [1] := 10;
Fila [2] := 1974;

For I := 1 To 3 {Length (Fila)} Do
Showmessage (FloatToStr (FilaX [I]));
end;


En el ejemplo, he declarado la variable FilaX para que ocupe la misma posición de memoria (Absolute) que la variable Fila. Esto funciona gracias a que un arreglo dinámico es en realidad un puntero al primer valor que contiene. Y como a FilaX le hemos dado declaración de puntero (^), ambas variables apuntarán a la misma región de memoria, pero el compilador tomará las referencias a FilaX con el índice base 1 (ya que así está declarado el tipo auxiliar TA).

Saludos.

Al González. :)

jconnor82
14-02-2009, 15:38:35
Hola... tienes razon, al parecer para que se vea mejor y practico tendre q volver privada la propiedad que obtiene una columna o fila, ya q esto lo puedo trabajar de forma oculta... gracias por tu respuesta.