Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

¿ Cuándo se produce una violación de segmento en Gambas ?
#1

Buenas!.

Estoy ejecutando un test y me devuelve violación de segmento rápidamente. A ver como se depura eso.
Es un error en tiempo de ejecución.

Os adjunto el código. Lo primero que se me ocurre es que el array crece y crece.

GAMBAS
  1. Public Sub btnSelectDir_Click()
  2.     
  3.   ObtenerNomArchivos(ruta)
  4.  
  5.  
  6. Public Sub ObtenerNomArchivos(directorio As String)
  7.  
  8.   Dim archivos As String[]
  9.  
  10.   archivos = Dir(directorio, "*.*", gb.File)
  11.   If archivos.Length = 0 Then
  12.     Return
  13.   Else
  14.     TestBenchMark("ObtenerExtensiones", archivos)
  15.     TestBenchMark("ObtenerExtensiones2", archivos)    
  16.   Endif   
  17.  
  18.  
  19. Public Sub TestBenchMark(nombrefuncion As String, aelementos As String[])
  20.  
  21.   Dim i, t As Float
  22.   Dim ob As Object
  23.  
  24.   ob = Me
  25.  
  26.   t = Timer
  27.  
  28.   For i = 1 To 10 ^ 6
  29.     Object.Call(ob, nombrefuncion, aelementos)
  30.   Next
  31.  
  32.   Print "Tiempo para 10^6 repeticiones, método: " & nombrefuncion & " = " & "\t"; Format(Timer - t, "0.######") & "s" & "\t"
  33.  
  34.  
  35. Public Sub ObtenerExtensiones(aarchivos As String[]) As String[]
  36.  
  37.   Dim aextensiones As New String[]
  38.   Dim nombref As String
  39.   Dim extension As String
  40.  
  41.   Dim pos As Integer
  42.  
  43.   For Each nombref In aarchivos
  44.     pos = RInStr(nombref, ".")
  45.     extension = Mid(nombref, pos + 1)    
  46.     If Not aextensiones.Exist(extension) Then
  47.       aextensiones.Add(extension)
  48.     Endif
  49.   Next
  50.   Return aextensiones
  51.  
  52.  
  53. Public Sub ObtenerExtensiones2(aarchivos As String[]) As String[]
  54.  
  55.   Dim aextensiones As New String[]
  56.   Dim nombref As String
  57.   Dim extension As String
  58.  
  59.   For Each nombref In aarchivos
  60.     extension = File.Ext(nombref)
  61.     If Not aextensiones.Exist(extension) Then aextensiones.Add(extension)      
  62.   Next  
  63.   Return aextensiones
  64.  



En la primera función no uso el componente gb.util y en el siguiente si. Casi me da igual en resultado por eso lo del test.
Por otra parte nadie recibe el valor devuelto por la función. Que podría ser un procedimiento que no devuelva valor.
 

De un post explicado que es y con el lenguaje "C"..yikes! ..es broma. Wink

¿Qué significa Violacion de Segmento?

Algo común: Se produce cuando...
Cita:- Intentar acceder una variable que ya fue liberada.
- Intentar escribir sobre una variable de solo lectura. ( No se da el caso , no es una propiedad ).
 

El error se produce en Object.Call desde la primera vez.

"El buen perfume en frasco pequeño se vende"
    ¡Gracias!
#2

El problema es:

- Se debe asignar el valor devuelto por Object.Call a una variable.

Y la forma de llamarse.

GAMBAS
  1. Public Sub TestBenchMark(nombrefuncion As String, aelementos As String[])
  2.  
  3.   Dim i, t As Float
  4.   Dim ob As Object
  5.   Dim valores As String[]
  6.  
  7.   ob = Me
  8.  
  9.   t = Timer
  10.  
  11.   For i = 1 To 10
  12.     valores = Object.Call(ob, nombrefuncion, [aelementos])
  13.   Next
  14.  
  15.   Print "Tiempo para 10^6 repeticiones, método: " & nombrefuncion & " = " & "\t"; Format(Timer - t, "0.######") & "s" & "\t"
  16.  



Pero lo cierto es que aelementos ya es un array. Huh

Al final he dejado la función TestBenchmark de esta forma:

GAMBAS
  1. Public Sub TestBenchMark(nombrefuncion As String, aelementos As String[])
  2.  
  3.   Dim i, t As Float
  4.   Dim ob As Object
  5.   Dim valores As String[]
  6.   Dim maximo As Integer
  7.  
  8.   maximo = 1000
  9.  
  10.   ob = Me
  11.  
  12.   t = Timer
  13.  
  14.   For i = 1 To maximo
  15.     valores = Object.Call(ob, nombrefuncion, [aelementos])
  16.   Next
  17.  
  18.   Print "Tiempo para " & Str(maximo) & " repeticiones, sobre " & Str(aelementos.Length) & " elementos. Usando " & "método: " & nombrefuncion & " = " & "\t"; Format(Timer - t, "0.######") & "s" & "\t"
  19.  



Es que tantas iteraciones eran demasiadas.

La respuesta fue:
 
Cita: 
Tiempo para 1000 repeticiones, sobre 9970 elementos. Usando método: ObtenerExtensiones =        1,041783s
Tiempo para 1000 repeticiones, sobre 9970 elementos. Usando método: ObtenerExtensiones2 =       1,360042s

Vamos, que es mejor usar el método que he definido que el que usa gb.Util para este método concreto.

Si tenéis una ruta con tropecientos archivos y distintas extensiones os funcionará.
Si son pocos igual. Mi problema es que de esos 9970 por lo menos existían 19 extensiones.

"El buen perfume en frasco pequeño se vende"
[-] Los siguientes 1 usuarios dice gracias a Shell por este post:
  • Shordi
    ¡Gracias!
#3

(10-10-2022, 16:16)Shell escribió:  Pero lo cierto es que aelementos ya es un array. Huh

...en efecto el 3° parámetro formal aún quiere que el tipo de dato u objeto pasado se reduzca a un array.
Por lo tanto, si se pasa un array, tendrá que ser en este caso un array de... array.

"Los horizontes perdidos nunca regresan. " (F. Battiato, La stagione dell'amore, 1983)

"Las ondas nunca regresan. " (Genesis: Ripples - A trick of the tail, 1976)
[-] Los siguientes 1 usuarios dice gracias a vuott por este post:
  • Shell
    ¡Gracias!
#4

(10-10-2022, 20:47)vuott escribió:  en este caso un array de... array

En efecto... mira este ejemplo:
GAMBAS
  1. Public Sub Main()
  2.  
  3.   Dim bb As Byte[] = [1, 2, 3, 4]
  4.   Dim c As New Byte[][]
  5. '                  ↑ ↑   bidimensional
  6.   c = [bb]
  7.   
  8.   i = Object.Call(Me, "Mediterraneo", c)
  9.  
  10.   Print i
  11.   
  12.  
  13. Public Function Mediterraneo(a As Byte[]) As Integer
  14.   
  15.  
  16.   i = a[2] * 10000
  17.  
  18.   Return i
  19.  



"Los horizontes perdidos nunca regresan. " (F. Battiato, La stagione dell'amore, 1983)

"Las ondas nunca regresan. " (Genesis: Ripples - A trick of the tail, 1976)
    ¡Gracias!
#5

(10-10-2022, 23:04)vuott escribió:  En efecto... mira este ejemplo:

Gracias, en el ejemplo se ve mejor.

"El buen perfume en frasco pequeño se vende"
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)