Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

mas grande que un string

Estas en el tema de mas grande que un string en el foro de Visual Basic clásico en Foros del Web. es para recorrer una carpeta con x archivos de un mismo tipo en este caso *.jpg esta operacion solo me funciona con 2500 archivos si ...
  #1 (permalink)  
Antiguo 13/02/2006, 14:02
Avatar de jevalenzuela  
Fecha de Ingreso: enero-2006
Mensajes: 49
Antigüedad: 18 años, 3 meses
Puntos: 0
mas grande que un string

es para recorrer una carpeta con x archivos de un mismo tipo en este caso *.jpg esta operacion solo me funciona con 2500 archivos si le pongo 3000 o algo mas grande se cae me dice que hay demasiadas funciones no estaticas o algo asi el problema es que no debo depender de esto por lo que necesito poner un valor altto para que recorra todos los archivo que existan sin ningun problema


Public Type ZIPnames
s (0 To 2500) As String
End Type


alguien tiene alguna idea?
  #2 (permalink)  
Antiguo 13/02/2006, 14:10
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
No es problema del tamaño de un String, sino del tamaño del array (arreglo).

Acabas de encontrar otra limitación (más aún) a VB: No puede declarar vectores mayores de 2500 para tipos String. ;)

La única manera de atajarlo sería crearte tu propio tipo String más suave que no ocupase tante memoria, o eso, o usar una DLL en C/C++ que supla la carencia de VB.
  #3 (permalink)  
Antiguo 13/02/2006, 14:17
Avatar de GeoAvila
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Antigua Guatemala
Mensajes: 4.032
Antigüedad: 20 años, 4 meses
Puntos: 53
Cita:
Iniciado por MaxExtreme
Acabas de encontrar otra limitación (más aún) a VB: No puede declarar vectores mayores de 2500 para tipos String. ;)
muy cierto jajaja

lo que podrías hacer es una DLL hecha en C++ o bien C para y te devuelva el valor en Int o Bien Long para que podas seguir.

o bien
aunque se escuche muy mal podrías declarar otro array dependiendo que tipo de que manera lo estes llenando....

nos vemos..
__________________
* Antes de preguntar lee las FAQ, y por favor no hagas preguntas en las FAQ
Sitio http://www.geoavila.com twitter: @GeoAvila
  #4 (permalink)  
Antiguo 13/02/2006, 14:26
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Cita:
Iniciado por GeoAvila
lo que podrías hacer es una DLL hecha en C++ o bien C para y te devuelva el valor en Int o Bien Long para que podas seguir.

o bien
aunque se escuche muy mal podrías declarar otro array dependiendo que tipo de que manera lo estes llenando....
Realmente yo haría una DLL en C para manejar los datos, que proporcione las funciones similares a las de VB (es fácil, casi todas ya vienen hechas). Así no hace falta jugar con punteros en VB.

Sobre lo segundo, es bastante guarro, sí. En cualquier caso VB no iba a dejar. Según comenta, el problema es que un tipo no puede ser tan grande en memoria, no consigue manejarlo. Aunque dividieses el array/arreglo, el tipo seguiría ocupando el mismo tamaño.
  #5 (permalink)  
Antiguo 13/02/2006, 14:29
Avatar de GeoAvila
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Antigua Guatemala
Mensajes: 4.032
Antigüedad: 20 años, 4 meses
Puntos: 53
Cita:
Iniciado por MaxExtreme
Sobre lo segundo, es bastante guarro, sí. En cualquier caso VB no iba a dejar. Según comenta, el problema es que un tipo no puede ser tan grande en memoria, no consigue manejarlo. Aunque dividieses el array/arreglo, el tipo seguiría ocupando el mismo tamaño.
claro que es guarro como decís pero en caso que no pueda encontrar a alguien que le heche la mano para la DLL o bien que no la pueda hacer se la va a tener que hacer de esa manera pero lo más recomendable es hacerla DLL en C.

nos vemos..
__________________
* Antes de preguntar lee las FAQ, y por favor no hagas preguntas en las FAQ
Sitio http://www.geoavila.com twitter: @GeoAvila
  #6 (permalink)  
Antiguo 13/02/2006, 14:52
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Cita:
Iniciado por GeoAvila
claro que es guarro como decís pero en caso que no pueda encontrar a alguien que le heche la mano para la DLL o bien que no la pueda hacer se la va a tener que hacer de esa manera pero lo más recomendable es hacerla DLL en C.

nos vemos..
Dices, ¿hacer la DLL en VB? En teoría sigue siendo un problema, porque el propio VB lleva la misma limitación, aunque siempre se podrán encontrar trucos.

Lo que sí es cierto es que no podrá hacer un tipo (Type) mayor que eso, lo divida como lo divida.
  #7 (permalink)  
Antiguo 13/02/2006, 15:49
Avatar de GeoAvila
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Antigua Guatemala
Mensajes: 4.032
Antigüedad: 20 años, 4 meses
Puntos: 53
Cita:
Iniciado por MaxExtreme
Dices, ¿hacer la DLL en VB? En teoría sigue siendo un problema, porque el propio VB lleva la misma limitación, aunque siempre se podrán encontrar trucos.
no claro que no, pero me refiero a lo de dividir el array talvez si pudiera hacer algo como la paginación por cada 2000 un array si en caso no pudiera contar con una DLL hecha en C.

a eso me refiero puesto que hacerla dll en vb seria el mismo problema..

nos vemos..
__________________
* Antes de preguntar lee las FAQ, y por favor no hagas preguntas en las FAQ
Sitio http://www.geoavila.com twitter: @GeoAvila
  #8 (permalink)  
Antiguo 13/02/2006, 16:17
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Cita:
Iniciado por GeoAvila
no claro que no, pero me refiero a lo de dividir el array talvez si pudiera hacer algo como la paginación por cada 2000 un array si en caso no pudiera contar con una DLL hecha en C.

a eso me refiero puesto que hacerla dll en vb seria el mismo problema..

nos vemos..
No lo he probado, pero aunque dividieses el array en partes de 2000, creo que seguiría sin poderse hacer. Date cuando de que él lo intenta guardar en un tipo. Aunque hiciese:

Type loquesea
Uno (0 To 1000) As String
Dos (0 To 1000) As String
...
End Type

o un ReDim, sigue ocupando lo mismo (si es que el problema es la memoria que ocupa que no lo sabemos, habría que hacer pruebas).
  #9 (permalink)  
Antiguo 13/02/2006, 16:57
Avatar de jevalenzuela  
Fecha de Ingreso: enero-2006
Mensajes: 49
Antigüedad: 18 años, 3 meses
Puntos: 0
gracias muchachos veo que no es tan simple lo que trato de hacer estoy un poco confundido con la real solucion pero igual gracias
  #10 (permalink)  
Antiguo 15/03/2006, 16:51
 
Fecha de Ingreso: octubre-2005
Ubicación: Montevideo, Uruguay
Mensajes: 14
Antigüedad: 18 años, 7 meses
Puntos: 0
Podes hacer una simple matriz, array de arrays, entonces cuando llenas un array de 2500, pasas al proximo y asi sucesivamente. La solucion te servira si solo quieres guardar los strings y no borrar modificar etc etc, en ese caso te recomiendo que busques alguna libreria que te de una mano.

Por si a caso, una matriz es dim matriz(0 to 10,0 to 2500)

Suerte!
  #11 (permalink)  
Antiguo 15/03/2006, 17:29
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Cita:
Iniciado por alvmet
Podes hacer una simple matriz, array de arrays, entonces cuando llenas un array de 2500, pasas al proximo y asi sucesivamente. La solucion te servira si solo quieres guardar los strings y no borrar modificar etc etc, en ese caso te recomiendo que busques alguna libreria que te de una mano.

Por si a caso, una matriz es dim matriz(0 to 10,0 to 2500)

Suerte!
Creo que eso seguiría dando problemas en caso de que sea culpa del tamaño que ocupa, sino, puede ser una solución viable.
  #12 (permalink)  
Antiguo 16/03/2006, 01:05
Avatar de [EX3]  
Fecha de Ingreso: marzo-2006
Ubicación: Fuenlabrada, Madrid
Mensajes: 203
Antigüedad: 18 años, 1 mes
Puntos: 1
Cita:
Iniciado por MaxExtreme
Acabas de encontrar otra limitación (más aún) a VB: No puede declarar vectores mayores de 2500 para tipos String. ;)
Perdon? Cualquier dato estatico de una estructura definida por el usuario tiene una capacidad maxima de 64kb. Un array estatico de 2500 strings dentro de una estructura no llega ni por asomo a esa cantidad de memoria:

Código:
Private Type ZIPnames
    s(0 To 16377) As String
    
End Type
Este valor es el maximo que permitira dicho elemento dentro de una estructura de datos. Ahora, si el array fuese dinamico:
Código:
Private Type ZIPnames
    s() As String
    
End Type

Dim a As ZIPnames

Private Sub Form_Load()
Redim a.s(999999) As String

End Sub
Si el array fuese dinamico tendrias como capacidad maxima todo lo que diese de si la memoria de tu sistema. (si alguien prueba el ejemplo que no se asuste si tarda unos minutos en responder el programa, 999999 strings en un array es mucha memoria )

jevalenzuela, la solucion que yo utilizo en casos como el tuyo es la de hacer dicho elemento dinamico en vez de estatico. En este caso se trata de un listado de archivos. Si la mayoria de las veces solo fueras a listar un total de 35 archivos, para que malgastar memoria a lo tonto alojando 2965 elementos vacios en el array? Definelo dinamicamente y añade elementos segun archivos vayas leyendo:
Código:
Redim Preserve a.s(Ubound(a.s) + 1) As String
Esto añadiria un elemento mas al array sin perder los datos del resto de los elementos existentes.

Salu2...
__________________
Proyecto dx_lib32 (http://dxlib32.se32.com) Libreria DLL ActiveX para el desarollo de juegos y programas multimedia en Visual Basic 6.0 con la potencia de DirectX

Dice un dicho que "el que calla otorga". En internet tenemos otro que dice "nunca alimentes a un troll" que viene a decir "dejale hablar solo que se ya se cansara de incordiar". Solo los necios creen tener la razon con la ultima palabra.

  #13 (permalink)  
Antiguo 16/03/2006, 07:52
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Cita:
Iniciado por [EX3]
Perdon? Cualquier dato estatico de una estructura definida por el usuario tiene una capacidad maxima de 64kb. Un array estatico de 2500 strings dentro de una estructura no llega ni por asomo a esa cantidad de memoria:

Código:
Private Type ZIPnames
    s(0 To 16377) As String
    
End Type
Es él el que dice que no ha podido declararlo... Y lo de la memoria, no es seguro cuanto ocupa.

Cita:
Iniciado por [EX3]
Este valor es el maximo que permitira dicho elemento dentro de una estructura de datos. Ahora, si el array fuese dinamico:
Código:
Private Type ZIPnames
    s() As String
    
End Type

Dim a As ZIPnames

Private Sub Form_Load()
Redim a.s(999999) As String

End Sub
Si el array fuese dinamico tendrias como capacidad maxima todo lo que diese de si la memoria de tu sistema. (si alguien prueba el ejemplo que no se asuste si tarda unos minutos en responder el programa, 999999 strings en un array es mucha memoria )
No debería de tardar nada en iniciar el programa. 1 millón de strings, suponiendo que las usáramos para meter nombres de 20 letras, ocuparían 40 bytes, es decir, un total de 40MB de RAM.

El sistema devuelve esa memoria instantáneamente, tanto si son 40 MB, como si son 500 o más. Sólo se vuelve lento en el caso de que requiera usar el disco duro, pero creo que tienes más. No exageremos tanto con la memoria, que sobra.

Si se lentifica es problema de VB, no de la memoria.
  #14 (permalink)  
Antiguo 16/03/2006, 12:14
Avatar de [EX3]  
Fecha de Ingreso: marzo-2006
Ubicación: Fuenlabrada, Madrid
Mensajes: 203
Antigüedad: 18 años, 1 mes
Puntos: 1
Cita:
Iniciado por MaxExtreme
Es él el que dice que no ha podido declararlo... Y lo de la memoria, no es seguro cuanto ocupa.
Algo fuera del codigo que nos ha mostrado puede ser la causa del supuesto error que le da por que por norma puede declarar un maximo de 64kb en un dato estatico. Puedes comprobarlo en la MSDN o haciendo la prueba tu mismo ya que la runtime te avisara en caso de sobrepasar el maximo de 64kb.

Cita:
Iniciado por MaxExtreme
No debería de tardar nada en iniciar el programa. 1 millón de strings, suponiendo que las usáramos para meter nombres de 20 letras, ocuparían 40 bytes, es decir, un total de 40MB de RAM.

El sistema devuelve esa memoria instantáneamente, tanto si son 40 MB, como si son 500 o más. Sólo se vuelve lento en el caso de que requiera usar el disco duro, pero creo que tienes más. No exageremos tanto con la memoria, que sobra.

Si se lentifica es problema de VB, no de la memoria.
Como aqui estamos tratando unica y exclusivamente de VB y no de programacion en cualquier otro lenguaje como C/C++ no se me paso por la cabeza si quiera remarcar que la lentitud de asignar la memoria viene dada por el administrador del propio VB. Por supuesto que es cosa de VB y no de la memoria y el aviso oviamente va para cualquiera de vosotros que tuviese intencion de probar el codigo. Si no lo avisara mas de uno pensaria que se les colgo el programa y no es asi.

Salu2...
__________________
Proyecto dx_lib32 (http://dxlib32.se32.com) Libreria DLL ActiveX para el desarollo de juegos y programas multimedia en Visual Basic 6.0 con la potencia de DirectX

Dice un dicho que "el que calla otorga". En internet tenemos otro que dice "nunca alimentes a un troll" que viene a decir "dejale hablar solo que se ya se cansara de incordiar". Solo los necios creen tener la razon con la ultima palabra.

Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:19.