Comunidad Gambas-es
¿ Cuándo se produce una violación de segmento en Gambas ? - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: ¿ Cuándo se produce una violación de segmento en Gambas ? (/thread-1059.html)



¿ Cuándo se produce una violación de segmento en Gambas ? - Shell - 10-10-2022

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.

Código:
Public Sub btnSelectDir_Click()
    
  ObtenerNomArchivos(ruta)
 
End

Public Sub ObtenerNomArchivos(directorio As String)
 
  Dim archivos As String[]
 
  archivos = Dir(directorio, "*.*", gb.File)
  If archivos.Length = 0 Then
    Return
  Else
    TestBenchMark("ObtenerExtensiones", archivos)
    TestBenchMark("ObtenerExtensiones2", archivos)    
  Endif   
 
End

Public Sub TestBenchMark(nombrefuncion As String, aelementos As String[])
 
  Dim i, t As Float
  Dim ob As Object
 
  ob = Me
 
  t = Timer
 
  For i = 1 To 10 ^ 6
    Object.Call(ob, nombrefuncion, aelementos)
  Next
 
  Print "Tiempo para 10^6 repeticiones, método: " & nombrefuncion & " = " & "\t"; Format(Timer - t, "0.######") & "s" & "\t"
 
End

Public Sub ObtenerExtensiones(aarchivos As String[]) As String[]
 
  Dim aextensiones As New String[]
  Dim nombref As String
  Dim extension As String
 
  Dim pos As Integer
 
  For Each nombref In aarchivos
    pos = RInStr(nombref, ".")
    extension = Mid(nombref, pos + 1)    
    If Not aextensiones.Exist(extension) Then
      aextensiones.Add(extension)
    Endif
  Next
  Return aextensiones
 
End

Public Sub ObtenerExtensiones2(aarchivos As String[]) As String[]
 
  Dim aextensiones As New String[]
  Dim nombref As String
  Dim extension As String
 
  For Each nombref In aarchivos
    extension = File.Ext(nombref)
    If Not aextensiones.Exist(extension) Then aextensiones.Add(extension)      
  Next  
  Return aextensiones
 
End

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.


RE: ¿ Cuándo se produce una violación de segmento en Gambas ? - Shell - 10-10-2022

El problema es:

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

Y la forma de llamarse.

Código:
Public Sub TestBenchMark(nombrefuncion As String, aelementos As String[])
 
  Dim i, t As Float
  Dim ob As Object
  Dim valores As String[]
 
  ob = Me
 
  t = Timer
 
  For i = 1 To 10
    valores = Object.Call(ob, nombrefuncion, [aelementos])
  Next
 
  Print "Tiempo para 10^6 repeticiones, método: " & nombrefuncion & " = " & "\t"; Format(Timer - t, "0.######") & "s" & "\t"
 
End

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

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

Código:
Public Sub TestBenchMark(nombrefuncion As String, aelementos As String[])
 
  Dim i, t As Float
  Dim ob As Object
  Dim valores As String[]
  Dim maximo As Integer
 
  maximo = 1000
 
  ob = Me
 
  t = Timer
 
  For i = 1 To maximo
    valores = Object.Call(ob, nombrefuncion, [aelementos])
  Next
 
  Print "Tiempo para " & Str(maximo) & " repeticiones, sobre " & Str(aelementos.Length) & " elementos. Usando " & "método: " & nombrefuncion & " = " & "\t"; Format(Timer - t, "0.######") & "s" & "\t"
 
End

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.


RE: ¿ Cuándo se produce una violación de segmento en Gambas ? - vuott - 10-10-2022

(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.


RE: ¿ Cuándo se produce una violación de segmento en Gambas ? - vuott - 10-10-2022

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

En efecto... mira este ejemplo:
Código:
Public Sub Main()
 
  Dim i As Integer
  Dim bb As Byte[] = [1, 2, 3, 4]
  Dim c As New Byte[][]
'                  ↑ ↑   bidimensional
  c = [bb]
  
  i = Object.Call(Me, "Mediterraneo", c)

  Print i
  
End

Public Function Mediterraneo(a As Byte[]) As Integer
  
  Dim i As Integer
 
  i = a[2] * 10000
 
  Return i
 
End



RE: ¿ Cuándo se produce una violación de segmento en Gambas ? - Shell - 12-10-2022

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

Gracias, en el ejemplo se ve mejor.