Ver Mensaje Individual
  #3  
Antiguo 30-06-2010
TecnoBestia TecnoBestia is offline
Miembro
 
Registrado: jun 2010
Posts: 35
Reputación: 0
TecnoBestia Va por buen camino
Aclaración

Hola ecfisa gracias por responder tan pronto.

PadreDominante y PadreRecesivo son de tipo TVector;

donde TVector es un tipo definido por la instrucción:
type
TVector = array of Double;
TMatriz = array of TVector;

Instancias es una matriz de tipo TMatriz, estos tipos son declarados en forma pública en una Unit denominada Declaraciones, en donde se define Pública tambien la matriz Instancias.

Las variables PadreDominante y PadreRecesivo son declaradas privadas dentro de un procedure, estas variables serán filas tomadas aleatoriamente de la matriz Instancias que debo manipular sin modificar las filas originales de la matriz.

El problema que tengo es le siguiente:
PadreDominante:=Instancias[P1];
PadreRecesivo:=Instancias[P2];
(note que solo estoy colocando una corredenada P1 y P2, eso lo indica a Delphi que tome la fila P1 para el padre dominante y la fila P2 para el padre recesivo, es toda la fila no un valor).

Cuando modifico las variables anteriores PadreRecesivo, por ejemplo, este también modifica la fila P2 de la matriz Instancia, y esto es lo que no quiero. Quiero poder modificar PadreRecesivo sin modificar la fila P2 de Instanicas.

Lo que está pasando es que PadreRecesivo apunta al mismo espacio de memoria que tiene la fila P2. Por lo que al modificar una modifico la otra.

Necesito saber si hay alguna forma de evitar esto y hacer una copia independiente de la fila P1 y P2 de forma que al modificar estas copias no se altere las filas originales.

Solucione el problema copiando entrada por entrada (elemento por elemento) las filas de la matriz con la siguiente funición:

function Copiar(V:TVector):TVector;
var
VV:TVector;
Len,i:Integer;
begin
Len:=Length(V);
SetLength(VV,Len);
for i:=0 to Len-1 do begin
VV[i]:=V[i];
end;
Result:=VV;
end;

Sin embargo, esto no es óptimo, el programa que estoy haciendo debe poder trabajar con matriz muy grandes 18000 filas aproximadamente y el proceso que realizará durará varias horas, incloso podría durar días, es por esto que requiero hacer las cosas con la mejor implementación posible, utilizando punteros en los casos que se puedan. En este caso requiero hacer una copia.

Espero haber sido lo suficiente explícito.

Gracias por su preciado tiempo y disculpe cualquier molestia.

Última edición por TecnoBestia fecha: 30-06-2010 a las 15:49:03.
Responder Con Cita