• Sábado 21 de Diciembre de 2024, 16:51

Autor Tema:  consulta sobre funciones!!!  (Leído 3221 veces)

la mole p

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
consulta sobre funciones!!!
« en: Martes 3 de Febrero de 2009, 00:20 »
0
hola a todos!

necesito crear una funcion en VB6.0 de un filtro espacial, este es el codigo que quiero trabajar en una funcion:

Código: Visual Basic
  1. For j = 2 To H - 1
  2.     For i = 2 To W - 1
  3.         M3(j, i) = (4 * M2(j, i) + M2(j - 1, i - 1) + 2 * M2(j - 1, i) + 2 * M2(j, i - 1) + 2 * M2(j + 1, i) + 2 * M2(j, i + 1) + M2(j + 1, i + 1) + M2(j + 1, i - 1) + M2(j - 1, i + 1)) / 16
  4.         If M3(j, i) > 128 Then
  5.             M3(j, i) = 255
  6.         Else
  7.             M3(j, i) = 0
  8.         End If
  9.     Next i
  10. Next j
  11.  

alguien que me puedo ayudar con la sintaxis, quedaria muy agradecido!!

Slds.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: consulta sobre funciones!!!
« Respuesta #1 en: Martes 3 de Febrero de 2009, 13:35 »
0
No entiendo cuál es la pregunta o duda... La sintaxis es correcta.

la mole p

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: consulta sobre funciones!!!
« Respuesta #2 en: Martes 3 de Febrero de 2009, 14:03 »
0
Cita de: "m0skit0"
No entiendo cuál es la pregunta o duda... La sintaxis es correcta.

mosquito me referia a como seria la sintaxis de la funcion que tengo q crear, mira te doy un ejemplo de uno de mis intentos fallidos:

Código: Visual Basic
  1. Function filtro(M As Integer, N As Integer)
  2. For j = 2 To H - 1
  3.     For i = 2 To W - 1
  4.         N(j, i) = (4 * M(j, i) + M(j - 1, i - 1) + 2 * M(j - 1, i) + 2 * M(j, i - 1) + 2 * M(j + 1, i) + 2 * M(j, i + 1) + M(j + 1, i + 1) + M(j + 1, i - 1) + M(j - 1, i + 1)) / 16
  5.         If N(j, i) > 128 Then
  6.             N(j, i) = 255
  7.         Else
  8.             N(j, i) = 0
  9.         End If
  10.     Next i
  11. Next j
  12. End Function
  13.  

y para usarla:

Código: Visual Basic
  1. Private Sub Command1_Click()
  2. Picture3.Cls
  3. M3 = filtro(M2)
  4. End Sub
  5.  

y me sale un mensaje q dice "tipo de aurgmento byref no coincide"

help me please!!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: consulta sobre funciones!!!
« Respuesta #3 en: Martes 3 de Febrero de 2009, 21:47 »
0
Ah, bueno, esto es otra cosa, mole_p. Si lo hubieras formulado desde un principio así...

Primero, declaras la función como:

Código: Visual Basic
  1. Function filtro(M As Integer, N As Integer)
  2.  
Pero luego la llamas como:

Código: Visual Basic
  1. M3 = filtro(M2)
  2.  

Pero debería ser, acorde con la cabecera de la función, algo como:

Código: Visual Basic
  1. filtro(M2, M3)
  2.  
De todas formas, deberías usar un Sub y no una Function ya que no devuelves ningún valor.

la mole p

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: consulta sobre funciones!!!
« Respuesta #4 en: Miércoles 4 de Febrero de 2009, 05:20 »
0
mosquito hice lo que me dijiste, pero creo que no sustente bien mi idea, lo que yo quiero hacer es una funcion la cual pueda utilizar para la matriz que yo quiera pasarle el filtro sin tener que escribir todo el codigo de nuevo, por ejemplo:
 
 1. Function filtro(la matriz que voy a ingresar(M) As Integer, la matriz resultado(N) As Integer)
   2. For j = 2 To H - 1
   3.     For i = 2 To W - 1
   4.         N(j, i) = (4 * M(j, i) + M(j - 1, i - 1) + 2 * M(j - 1, i) + 2 * M(j, i - 1) + 2 * M(j + 1, i) + 2 * M(j, i + 1) + M(j + 1, i + 1) + M(j + 1, i - 1) + M(j - 1, i + 1)) / 16
   5.         If N(j, i) > 128 Then
   6.             N(j, i) = 255
   7.         Else
   8.             N(j, i) = 0
   9.         End If
  10.     Next i
  11. Next j
  12. End Function

entonces supongamos que yo quiero usarla para 2 matrices en distintas partes de mi codigo solo haria algo asi:

matriz1_filtrada=filtro(matriz1)
matriz2_filtrada=filtro(matriz2)

mi duda es si se pued y como lo puedo hacer?????

gracias y slds!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: consulta sobre funciones!!!
« Respuesta #5 en: Miércoles 4 de Febrero de 2009, 13:13 »
0
Hola de nuevo querido la mole p  ;)

Cita de: "la mole p"
mosquito hice lo que me dijiste
Bueno, yo tampoco te he dicho que hicieras nada, sino simplemente que estaba mal planteado.

Cita de: "la mole p"
entonces supongamos que yo quiero usarla para 2 matrices en distintas partes de mi codigo solo haria algo asi:

matriz1_filtrada=filtro(matriz1)
matriz2_filtrada=filtro(matriz2)

mi duda es si se pued y como lo puedo hacer?????
Lo siento, tal y como lo pones en VB6 no se puede hacer porque las funciones no pueden devolver vectores. En tu ejemplo pones que filtro() devuelve un vector, cosa que no se puede hacer en VB.

¿Cómo puedes mandar un vector a una función y que te lo modifique? Usando una subrutina y pasando el vector por referencia, esto es:

Código: Visual Basic
  1. Sub filtro(M() As Integer, ByRef N() As Integer)
  2.  
y llamando a la subrutina tal que así:

Código: Visual Basic
  1. filtro(matriz1, matriz1_filtrada)
  2.  
Saludos y te aconsejo que estudies un poco más las especificidades de VB6, veo que estás muy verde. ¡A darle caña!  ^_^

la mole p

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: consulta sobre funciones!!!
« Respuesta #6 en: Miércoles 4 de Febrero de 2009, 17:59 »
0
si lo se mosquito, soy tu dolor de cabeza jijiji :P

gracias por la ayuda, si la verdad que si estoy verde, en mi especialidad no nos enseñan mucho sobre programacion, se que me falta mucho todavia por aprende,por eso toy q leo y leo tutoriales y sobre todo xq me gusta mucho y de esto quiero vivir  :comp:  :) .Te pregunte lo de funciones con arrays xq en ninguno de los tutotiales q lei antes de pensar en molestarte de nuevo :unsure:  en ninguna parte me decian que una funcion nunca podria devolver un array, bueno de todas maneras gracias por el dato :good: .

arigato gosaimashita!!!!

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: consulta sobre funciones!!!
« Respuesta #7 en: Miércoles 4 de Febrero de 2009, 19:06 »
0
Cita de: "m0skit0"
Cita de: "la mole p"
entonces supongamos que yo quiero usarla para 2 matrices en distintas partes de mi codigo solo haria algo asi:

matriz1_filtrada=filtro(matriz1)
matriz2_filtrada=filtro(matriz2)

mi duda es si se pued y como lo puedo hacer?????
Lo siento, tal y como lo pones en VB6 no se puede hacer porque las funciones no pueden devolver vectores. [/size]En tu ejemplo pones que filtro() devuelve un vector, cosa que no se puede hacer en VB.

¿Cómo puedes mandar un vector a una función y que te lo modifique? Usando una subrutina y pasando el vector por referencia, esto es:

Esto es erróneo, una función puede recibir y devolver matrices sin ningún tipo de problemas...
para demostrarlo un pequeño ejemplo:
Código: Visual Basic
  1.  
  2. Dim A2() As Integer
  3. Dim A3() As Integer
  4.  
  5.  
  6. Private Sub Command1_Click()
  7.     Dim k As Integer, t As Integer
  8.     Dim s As String
  9.    
  10.     '=======================
  11.     A3 = sumarMatriz(A2, 50)    ' aquí se llama a una función, envía una matriz y recibe una matriz....
  12.     '=======================
  13.     For k = 0 To 2
  14.         For t = 0 To 3
  15.             s = s & CStr(A3(k, t)) & " , "
  16.         Next
  17.     Next
  18.     MsgBox s
  19. End Sub
  20.  
  21. Private Sub Form_Load()
  22.     Dim k As Integer, t As Integer
  23.     ReDim A2(0 To 2, 0 To 3)
  24.     For k = 0 To 2
  25.         For t = 0 To 3
  26.             A2(k, t) = n
  27.             n = n + 1
  28.         Next
  29.     Next
  30. End Sub
  31.  
  32.  
  33. Private Function sumarMatriz(ByRef m() As Integer, ByVal incremento As Integer) As Integer()
  34.     Dim k As Integer, t As Integer
  35.     Dim tmp() As Integer
  36.    
  37.     ReDim tmp(0 To 2, 0 To 3)
  38.     For k = 0 To 2
  39.         For t = 0 To 3
  40.             tmp(k, t) = m(k, t) + incremento
  41.         Next
  42.     Next
  43.     sumarMatriz = tmp
  44. End Function
  45.  
  46.  

en el ejemplo  los elementos de la matriz A2  toma valores 0,1,2.... cuando pulsamos el botón que invoca la función suma 50 a cada valor y lo recibe de vuelta, en ningún momento existe un error por ello, llevo demasiados años usando matrices como devolución de funciones... No sé que versión usas de VB6... pero a mi nunca me ha dado error en inguna versión de las que he usado.
«Ma non troppo»
----> ModoVacaciones = False<----

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: consulta sobre funciones!!!
« Respuesta #8 en: Jueves 5 de Febrero de 2009, 11:14 »
0
Bueno...

Tu funcion da error por que no estas recibiendo los parametros como arreglos (te faltan los parentesis a los parametros)

Código: Visual Basic
  1.  
  2. Function filtro(M As Integer, N As Integer)
  3.  
  4.  

Esto es

Código: Visual Basic
  1.  
  2. Function filtro(M() as Integer, N() as Integer)
  3.  
  4.  

Ahora tu funcion no hace nada porque no realiza ninguna iteracion ya que el valor hasta (H) en el for no esta inicializada
al igual que W en el for interior

Ademas de que tu funcion no realiza el "return"


Código: Visual Basic
  1.  
  2. Function filtro(M() as Integer, N() as Integer)
  3.     ...
  4.     filtro = N
  5.     ...
  6. End function
  7.  
  8.  

Como dijo m0skit0, puedes usar un SUB y modificar los arreglos por referencia, y lo que te recomendo no fue igual a lo que hiciste

Cita de: "m0skit0"
Pero debería ser, acorde con la cabecera de la función, algo como:

Código: Visual Basic
  1.  
  2.   filtro(M2, M3)
  3.  
  4.  


Cita de: "la mole p"
...mosquito hice lo que me dijiste, pero creo que no sustente bien mi idea...

al parecer no porque seguiste intentando devolver resultado

Código: Visual Basic
  1.  
  2.     matriz1_filtrada=filtro(matriz1)
  3.     matriz2_filtrada=filtro(matriz2)
  4.  
  5.  

Y como bien apunta Nebire es muy facil y sin problemas devolver un arreglo o matriz en VB, en mi caso lo he usado comunmente como ejemplo que se me ocurre de momento  la funcion Split


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: consulta sobre funciones!!!
« Respuesta #9 en: Viernes 6 de Febrero de 2009, 17:45 »
0
Cita de: "m0skit0"
en VB6 no se puede hacer porque las funciones no pueden devolver vectores
:bad:  :bad:  :bad:

Lamentable... Pues juraría que lo intenté y no me funcionó... En fin, me queda el consuelo de que de mi manera también funciona...  :(  :(

 :hola:

la mole p

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: consulta sobre funciones!!!
« Respuesta #10 en: Miércoles 25 de Marzo de 2009, 20:30 »
0
holassssss!!!!, sorry por no haber respondido antes, estuve fuera de mi pais y alejado un poco de la programacion, segui el consejo de nebire y me resulto, gracias nebire.....gracias muchachos, estoy muy agradecido, este foro es lo MAXIMO!!!! :good:  :good:  :good: