• Publicidad

Problema o duda con objetos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema o duda con objetos

Notapor nemest » 2009-11-07 23:30 @021

Hola.
Tengo una duda de cómo Perl maneja los objetos.

Tengo una clase Nodo (Nodo.pm), la cual tiene dos atributos: el nombre y una matriz nXn.

En el programa que usa la clase Nodo.pm, creo una matriz nXn llena de 0.
Creo varios objetos: objeto1, objeto2,...

Le asigno un nombre a cada objeto y le asigno la matriz, con una pequeña modificación en un campo.

Cuando imprimo cada matriz de cada objeto, resulta que todas contienen la misma matriz.

No estoy seguro, pero creo que todas apuntan a una referencia de la matriz original.

Gracias por cualquier ayuda. Uso Perl v5.10.

Aquí un fragmento del código

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$nodoA = Nodo->new;
$nodoB = Nodo->new;
$nodoC = Nodo->new;

$tablero[1][1]=1;
$nodoA->nombre("raiz");
$nodoA->tablero(@tablero);

$tablero[1][1]=2;
$nodoB->nombre("1");
$nodoB->tablero(@tablero);

$tablero[1][1]=3;
$nodoC->nombre("2");
$nodoC->tablero(@tablero);

$tablero[1][1]=4;

imprimirTablero($nodoA->tablero());
imprimirTablero($nodoB->tablero());
imprimirTablero($nodoC->tablero());
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo que me retorna es esto (con una matriz 2x2)
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0 0
0 4
0 0
0 4
0 0
0 4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Fragmento del constructor
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub new {
        my $this=shift;
        my $class = ref($this) || $this;
        my $self={};
        $self ->{NOMBRE} = undef;
        $self ->{TABLERO} = [];
        bless $self, $class;
        return ($self);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
nemest
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2009-09-18 21:25 @934

Publicidad

Re: Problema o duda con objetos

Notapor explorer » 2009-11-08 11:18 @512

El problema seguro que está en el método tablero(). Cuando haces esto

$nodoA->tablero(@tablero);

estás pasando al método una lista de valores (los elementos del arreglo @tablero). Y, cada uno de esos elementos son referencias a otros arreglos (que contienen las "columnas" de cada "fila").

Pues bien, es muy posible que el método que usa el método ;) para crear la representación interna no copie bien los elementos de @tablero al {TABLERO} interno. Y como los elementos de las "filas" son referencias, pues entonces vas arrastrando referencias a los mismos elementos.

Una forma de hacer copias de estructuras de datos complejas, como la del @tablero, es con el módulo Clone:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Clone qw(clone);
my $self->{TABLERO} = clone(\@tablero);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y así te aseguras de que has creado una copia del @tablero que el usuario pasó como argumento al método.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema o duda con objetos

Notapor nemest » 2009-11-08 11:50 @535

Gracias por esa ayuda tan grande.

Así quedó el método tablero de la clase Nodo.pm
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub tablero{
        my $self = shift;
        if (@_) { @{ $self->{TABLERO} } = clone(\@_) }
        return @{ $self->{TABLERO} };
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora tengo otro problema.

Ahora al darle
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
imprimirTablero($nodoA->tablero());
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que me está imprimiendo son direcciones de memoria
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ARRAY(0x1afbb00) ARRAY(0x1afbbc0) ARRAY(0x1afbc80) ARRAY(0x1afbd40) ARRAY(0x1afbe00) ARRAY(0x1afbec0)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Al imprimir todas las direcciones de memoria se ve que cada matriz es distinta de otra, entonces sí se solucionó el problema anterior.

Si hago una copia
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@tablero = $nodoA->tablero()
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y la imprimo, pasa lo mismo.

No tengo ni idea de qué está haciendo.

Gracias por cualquier ayuda.
Avatar de Usuario
nemest
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2009-09-18 21:25 @934

Re: Problema o duda con objetos

Notapor explorer » 2009-11-08 12:57 @581

Donde estoy ahora no puedo probarlo, pero según la documentación del módulo debería ser así

@{ $self->{TABLERO} } = @{ clone(\@_) }

o así

$self->{TABLERO} = clone(\@_)

Recuerda: Data::Dumper es tu amigo.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema o duda con objetos

Notapor nemest » 2009-11-08 13:17 @595

Muchísimas gracias por la ayuda.

Sí, es como dijiste:
@{ $self->{TABLERO} } = @{ clone(\@_) }

Ahora el método quedó así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub tablero{
        my $self = shift;
        if (@_) { @{ $self->{TABLERO} } = @{ clone(\@_) } }
        return @{ $self->{TABLERO} };
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora sí imprime la matriz como debe ser, y cada objeto tiene su matriz independiente de la otra.

Lo de Data::Dumper no lo conozco, apenas estoy leyendo sobre eso.

De nuevo muchísimas gracias, porque no sabía cómo buscar en Internet sobre mi error en el momento de crear los objetos.
Avatar de Usuario
nemest
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2009-09-18 21:25 @934


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 32 invitados