FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
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:
Saludongos. |
#5
|
|||
|
|||
Agradecimientos.
Muchas gracias Lord Delfos, tu apoyo fue de mucha utilidad. Me funcionó perfecto.
Saludos... |
|
|
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 |
|