Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-06-2010
TecnoBestia TecnoBestia is offline
Miembro
 
Registrado: jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 30-06-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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 ?
( TPadres es solo un ejemplo, por darle un nombre )

¿Cuál es la matríz involucrada ?


Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 30-06-2010 a las 02:36:53.
Responder Con Cita
  #3  
Antiguo 30-06-2010
TecnoBestia TecnoBestia is offline
Miembro
 
Registrado: jun 2010
Posts: 35
Poder: 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
  #4  
Antiguo 30-06-2010
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 30-06-2010
TecnoBestia TecnoBestia is offline
Miembro
 
Registrado: jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
Agradecimientos.

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

Saludos...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas con duplicacion de datos mentor Conexión con bases de datos 3 22-12-2009 13:07:07
Ayuda con Consulta, Declarar Variables look Firebird e Interbase 3 02-12-2008 15:18:19
Duplicación en MSDE. Delphiboy MS SQL Server 0 30-05-2006 01:57:08
Problema en consulta SQL con variables y format ilichhernandez SQL 6 14-11-2005 20:08:54
Duplicación Cabanyaler MS SQL Server 1 20-10-2003 11:32:10


La franja horaria es GMT +2. Ahora son las 05:01:56.


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