Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consulta con la duplicación de variables (https://www.clubdelphi.com/foros/showthread.php?t=68684)

TecnoBestia 30-06-2010 01:48:17

Consulta con la duplicación de variables
 
Hola, querida cominidad.

Estoy haciendo un proyecto con Delphi 7 y tengo el siguiente problema:
Ver Código

PadreDominante:=Instancias[P1];
PadreRecesivo:=Instancias[P2];


El detalle es que cuando modifico los valores de PadreDominante o PadreRecesivo se me cambian los valores de la matriz original, es decir, las variables PadreDominante y PadreRecesivo apuntan al mismo espacio de memoria en donde se encuentran las filas de la matriz Instancias.

Probé algunas opciones, como por ejemplo, implementé una función

function Copiar(V:Vector):Vector;
begin
Result:=V;
end;


con la cual envío la fila por valor esperando realizar una copia de las variables para poderlas modifircar sin alteración de Instancias, pero no funcionó.

¿Existe alguna forma de copiar en nuevo espacio de memoria una variable? de manera que ésta sea independiente de la original.

Gracias por su preciado tiempo.

ecfisa 30-06-2010 02:28:58

Hola Tecno.

Me faltan algunos datos para entenderte mejor.

¿ Podrías aclararme como esta declarada la clase con que instancias a
PadreDominante y PadreRecesivo?

Pareciera que "Instancias" es un arreglo de Tipo "TPadres" o no ?:confused:
( TPadres es solo un ejemplo, por darle un nombre )

¿Cuál es la matríz involucrada ? :confused:


Saludos.

TecnoBestia 30-06-2010 15:44:41

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.

Lord Delfos 30-06-2010 16:11:22

El problema está en el uso de los arreglos dinámicos. Estos arreglos, a diferencia de uno normal, no son copiados enteros cuando uno usa ":=". Solamente se copia el puntero hacia el arreglo. Por eso, cuando hacés esas asignaciones PadreDominante termina *apuntando* al arreglo Instnacias[P1]. No es una copia, es el mismo arreglo.

Para copiar arreglos dinámicos podés usar la función copy:

Código Delphi [-]
PadreDominante:= copy(Instancias[P1], 0, Length(Instancias[P1]));

Saludongos.

TecnoBestia 30-06-2010 16:49:52

Agradecimientos.
 
Muchas gracias Lord Delfos, tu apoyo fue de mucha utilidad. Me funcionó perfecto.

Saludos...


La franja horaria es GMT +2. Ahora son las 01:54:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi