Cuestión Sobre Método De Una Clase.Borra El Array Original


Objetivo: Cuestión Sobre Método De Una Clase.Borra El Array Original
Hola Comunidad!.

Tengo una clase llamada baraja, la cual tiene un método llamado Cortar.
A este método le paso una array de cadena que contiene la baraja y el lugar por donde corto la baraja.

barajatemp1 contiene el contenido del array que se le ha pasado al método o función.
barajatemp2 es la baraja cortada que es la que devuelve el método.

Bien, hasta ahí todo correcto. Hasta ahora la aplicación me funciona dentro de lo que hice.
Mi cuestión va orientada a esto. El array que yo le paso también se "borra" y me ha
dejado un poco desconcertado, creía que era una copia (valor) con lo que trabaja y no el original.(referencia)

No es que sea un problema para la aplicación, pero si como duda.

Public Function CortarBaraja(otrabaraja As String[], lugar As Integer) As String[]

Dim barajatemp1 As New String[]
Dim barajatemp2 As New String[]
Dim x As Integer

barajatemp1 = otrabaraja

For x = lugar + 1 To barajatemp1.Count - 1
barajatemp2.Add(barajatemp1[x])
Next
barajatemp1.Remove((lugar + 1), (barajatemp1.Count - 1) - lugar)
For x = 0 To barajatemp1.Count - 1
barajatemp2.Add(barajatemp1[x])
Next
barajatemp1.Clear
Return barajatemp2

End


Creo que el problema esta en usar New.

Saludos

última edición por Shell el Lunes, 25 Febrero 2013, 12:17; editado 2 veces
Objetivo: Re: Cuestión Sobre Método De Una Clase.Borra El Array Original
Shell:
Podias poner la linea en el que llames al método y como esta definida la cadena que le pasas (con una propiedad, o public ... as string[] )


Saludos

Objetivo: Re: Cuestión Sobre Método De Una Clase.Borra El Array Original
Julio:

Ok.
Esto se encuentra en el formulario principal:

Private mibaraja As New ClaseBaraja
Private aunabaraja As New String[]
Private abarajamezclada As New String[]
Private abarajacortada As New String[]

Private mispuntos As Float

Public Sub _new()

End

Public Sub Form_Open()

aunabaraja = mibaraja.CrearMazo()
abarajamezclada = mibaraja.Barajar(aunabaraja)
abarajacortada = mibaraja.CortarBaraja(abarajamezclada, 5)

mispuntos = 0

End


Esto es en la clase Baraja:

Public obaraja As New ClaseCarta



Y el método ya lo conoces.

Aquí tienes la clase carta.

Private spalo As String[]
Private snomcarta As String[]
Private svalorcarta As Float[]

Property palo As String[]
Property nomcarta As String[]
Property valorcarta As Float[]



Private Function palo_Read() As String[]
Return spalo
End

Private Sub palo_Write(Value As String[])
spalo = Value
End

Private Function nomcarta_Read() As String[]
Return snomcarta
End

Private Sub nomcarta_Write(Value As String[])
snomcarta = Value
End

Private Function valorcarta_Read() As Float[]
Return svalorcarta
End

Private Sub valorcarta_Write(Value As Float[])
svalorcarta = Value
End


Uso en la clase Baraja un constructor, tal que así:

Public Sub _new()

obaraja.palo = ["OROS", "COPAS", "ESPADAS", "BASTOS"]
obaraja.nomcarta = ["AS", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "SOTA", "CABALLO", "REY"]
obaraja.valorcarta = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 0.5, 0.5, 0.5]

End


Saludos.

última edición por Shell el Lunes, 25 Febrero 2013, 13:04; editado 1 vez
Objetivo: Re: Cuestión Sobre Método De Una Clase.Borra El Array Original
Los arrays siempre se pasan por referencia. Si quieres pasar por valor utiliza el método .copy que llevan de por sí...

array2=arrayuno.copy()

o

mifuncion(miarray.copy())


Con esto último lo pasas por valor.

Saludos

Perfil MP  
Objetivo: Re: Cuestión Sobre Método De Una Clase.Borra El Array Original
Gracias Shordi,

Lo intentare como cuentas.

He enviado un privado a Jesús, no tengo ni idea que habrá ocurrido.
Pero fue muy extraño, cuando le di a enviar, algo había cambiado en la variable lugar, el tipo de esta variable se escribió mal.

Saludos.

Objetivo: Re: Cuestión Sobre Método De Una Clase.Borra El Array Original
Shell:

Puedes encontrar un motón de métodos interesantes para trabajar con arrays de cadenas en este enlace:

http://gambasdoc.org/help/comp/gb/string[]?es

Saludos

Nota:
En enlace copialo y pegalo completo en el navegador, ya que no sale bien en el foro

última edición por jsbsan el Lunes, 25 Febrero 2013, 13:24; editado 1 vez
Objetivo: Re: Cuestión Sobre Método De Una Clase.Borra El Array Original
Gracias Julio.

Shordi:

Antes,Gambas2 solo pasaba por valor.Con la entrada de Gambas3 ya se pudo pasar por referencia.
Hice en su día un ejemplo en el blog, para el paso por referencia a un procedimiento.

PUBLIC SUB Form_Open()

Dim sNombre AS String

sNombre=”Jose Luis”

'Llamamos al procedimiento, pasándole como parámetro la variable sNombre

VerNombre(ByRef sNombre)

'Al salir del procedimiento ,mostramos el valor de la variable sNombre,
'comprobando que ha cambiado.

Message.info(“El valor del nombre es: “ & sNombre)

End


PUBLIC SUB VerNombre(ByRef sNom AS STRING)

'Vemos su valor original.

Message.info( “El valor original del parámetro es: “ & sNom)

'Cambiamos su valor y lo mostramos.

sNom=”Jose María”

Message.info(“El valor del parámetro se cambia a: “ & SNom)

END


Pero claro, se esta usando una sentencia añadida ByRef

Al final funciono como tu dijiste:
abarajamezclada = mibaraja.Barajar(aunabaraja.Copy())


Normal que se borrase el contenido del array.

Saludos.

Objetivo: Re: Cuestión Sobre Método De Una Clase.Borra El Array Original
shordi escribió: [Ver mensaje]
Los arrays siempre se pasan por referencia.


No solo los arrays, cualquier objeto SIEMPRE es pasado por referencia, ya que el argumento (la variable pasada) es un puntero a la memoria del objeto y no el objeto en si. Es por eso que cuando el argumento es un objeto, el ByRef no es necesario.

Perfil MP  
Objetivo: Re: Cuestión Sobre Método De Una Clase.Borra El Array Original
Efectivamente Sebikul, más razón que un santo.

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1834s (PHP: 6% SQL: 94%)
Consultas SQL: 26 - Debug off - GZIP Activado