FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Cómo modificar una instancia dentro de un procedimiento asociado a esta.
Hola foreros.
Tengo una duda que me trabado y no he podido encontrar nada al respecto. Supongo que para muchos de ustedes es algo muy sencillo. Por lo que les pido su ayuda. Tengo una instancia que perteneces a una clase creada por mí denominada TParticula. Luego tengo un vector llamado VEnjambre lleno de instancias del tipo TParticula. Para la clase TParticula se le programó un procedimiento que dependiendo del resultado modifica la instancia, sin embargo este cambio no se hace. Veamoslo en Código: Código:
for i:=0 to Tamano_Del_Enjambre-1 do begin VEnjambre[i].AplicarBusquedaTabu; if VEnjambre[IndiceDeLaMejorParticulaDeLaHistoria].ValorInerciaEnMejorPosicion<VEnjambre[i].ValorInerciaEnMejorPosicion then begin IndiceDeLaMejorParticulaDeLaHistoria:=i; end; end; Código:
procedure TParticula.AplicarBusquedaTabu(); var i,IteraBT:Integer; begin IteraBT:=0; SetLength(Self.ListaTabu,2,TamaMaxListaTabu); while IteraBT<MaxIteraSinMejorasBT do begin IteraBT:=IteraBT+1; Self.BTCrearVecino(BTTamaVecindario); if Self.SeGeneroElVecino then begin Self:=VecinoParticula.Clon; //Aquí 1 FreeAndNil(VecinoParticula); if Self.ValorDeLaInerciaActual<Self.ValorInerciaEnMejorPosicion then begin IteraBT:=0; Self.ValorInerciaEnMejorPosicion:=Self.ValorDeLaInerciaActual; //Aquí 2 Self.VCoordenadasMejorPosicion:=Copy(Self.VCoordenadasActual); //Aquí 3 end; end; end; end; Es decir, valor que sale de procedimiento AplicarBusquedaTabu es el mismo que entró y los cambios que se hacen dentro del procedimiento no se aplican fuera. Es como si el self fuera una copia de la instancia y no una referencia a la instancia dada. Agradezco cualquier ayuda. Saludos... |
#2
|
||||
|
||||
Cita:
Creo que deber revisar tus apuntes sobre Programación Orientada a Objetos. |
#3
|
|||
|
|||
Hola, entiendo que self es una referencia a un objeto, pero no entiendo por que no puede cambiarse, en otros lugares he usado la instrucción
Código:
VecinoParticula:=VecinoAux9.Clon; Código:
VecinoAux9:=Self.Clon; El procedimiento correspondiente es: Código:
function clsParticula.Clon():clsParticula; var i:Integer; {Esta función realiza un clon independiete, elimina el uso de punteros en las instancias} begin Result:=clsParticula.Create; Result.VClasificacion:=Copy(Self.VClasificacion); Result.VCoordenadasActual:=Copy(Self.VCoordenadasActual); Result.VCoordenasPosicionAnterior:=Copy(Self.VCoordenasPosicionAnterior); Result.VCoordenadasMejorPosicion:=Copy(Self.VCoordenadasMejorPosicion); Result.VDistancias:=Copy(Self.VDistancias); Result.ValorDeLaInerciaActual:=Self.ValorDeLaInerciaActual; Result.ValorInerciaEnMejorPosicion:=Self.ValorInerciaEnMejorPosicion; Result.VCardinalidades:=Copy(Self.VCardinalidades); Result.VVelocidad:=Copy(Self.VVelocidad); //Tabu Result.OperaRealizadaVecino:=Self.OperaRealizadaVecino; Result.PosicionModificadaParaVecino:=Self.PosicionModificadaParaVecino; Result.PosicionAActualizarEnLT:=Self.PosicionAActualizarEnLT; SetLength(Result.ListaTabu,2,TamaMaxListaTabu); Result.ListaTabu[0]:=Copy(Self.ListaTabu[0]); Result.ListaTabu[1]:=Copy(Self.ListaTabu[1]); Result.TamaActualLT:=Self.TamaActualLT; Result.SeGeneroElVecino:=Self.SeGeneroElVecino; end; Saludos... |
#4
|
||||
|
||||
Porque SELF no es una variable, sino una constante. Siempre es la referencia (puntero) al objeto del método que se está ejecutando en ese momento.
Cuando defines un método de una clase, como por ejemplo:
en realidad el compilador lo interpreta como si fuera así:
Y cuando llamas al método:
El compilador lo interpreta como si fuera así:
El caso de RESULT es diferente, ya que sí es una variable cuya posición de memoria se corresponde con la posición de pila donde el llamante tomará el valor devuelto por la función. En cierto modo, una definición como: Se interpreta como si fuera: y si fuera método de una clase...
Última edición por Ñuño Martínez fecha: 18-12-2013 a las 14:20:18. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
??Como modificar una variable externa en un procedimiento?? | jasmad | Lazarus, FreePascal, Kylix, etc. | 6 | 01-12-2011 23:40:38 |
condicionar un procedimiento dentro de otro procedimiento | yossi | Varios | 7 | 17-05-2010 10:47:14 |
Abrir fichero asociado si la aplicacion ya esta activa. | Geta | Varios | 4 | 13-03-2009 01:43:51 |
Como hacer un commit dentro de un procedimiento almacenado | altp | Firebird e Interbase | 6 | 03-11-2005 18:21:32 |
Como modificar valores desde un dbgrid q esta asociado a un QUERY? | fmonte | SQL | 12 | 26-08-2004 22:25:22 |
|