Error conversion datos Array.

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • Error conversion datos Array.

    Hola Buenas.

    Estoy utilizando la librerias FMOD para realizar un analizador de espectro, los resultados de la llamada a la libreria los almaceno en el array 'Spectrum()' tipo 'Single' , más tarde estas las paso al array 'InSpect()' tipo 'Integer'.

    El problema lo tengo en la conversión de 'Single a Integer' da error de desbordamiento, una vez que examino los datos en el array 'InSpect()' no tengo nada estan vacios, mientras en el array 'Spectrum()' estan todos los datos, aún no he encontrado dicho error o fallo.

    A ver si podeis ayudame, Gracias.

    El código es es siguiente (resumido):

    Dim Spectrum(1023) As Single
    Dim InSpect(1023) As Integer
    Dim i as Long
    Dim DetSpectro As Long


    Call FMOD_System_GetSpectrum(system, Spectrum(0), 512, count, FMOD_DSP_FFT_WINDOW_TRIANGLE)
    DetSpectro = system
    CopyMemory = Spectrum(0), ByVal DetSpectro , 1024 * 4 'Convierte Long a Entero usando punteros.

    For i = 1 To 1023 Step 1
    InSpect(i) = Spectrum(i) 'Conversion de de Single a Integer ERROR DESBORDAMIENTO
    Next

    Saludos.

  • #2
    Bienbenido al foro, lo primero comentarte que se deben utilizar las etiquetas CODE, para , si pulsas sobre el editor avanzado tendrás opciones para editar mejor los mensajes.

    En cuanto al error, el problema es que el tipo Integer solo admite valores entre -32768 y 32767, mientras que dicha limitación no se aplica a Single, así mientras en Spectrum(1) puedes tener un valor de 50000, si intentas asignarselo a inSpect(1) te dará el error que comentas.

    Por otra parte no entiendo esto:
    Código:
    Call FMOD_System_GetSpectrum(system, Spectrum(0), 512, count, FMOD_DSP_FFT_WINDOW_TRIANGLE)
    DetSpectro = system
    'El signo = no debería estar, asumo que es un error
    CopyMemory  Spectrum(0), ByVal DetSpectro , 1024 * 4 'Convierte Long a Entero usando punteros.
    He buscado por ahí y he visto la declaración de la función FMOD_System_GetSpectrum:
    Código:
    Public Declare Function FMOD_System_GetSpectrum Lib "fmodex.dll" _
                      (ByVal system As Long, ByRef spectrumarray As Single, _
                       ByVal numvalues As Long, ByVal channeloffset As Long, _
                       ByRef windowtype As FMOD_DSP_FFT_WINDOW) As FMOD_RESULT
    Si es correcta, y hace lo que yo pienso, al llamarla como tú haces llenaría 512, valores en el array Spectrum desde el channeloffset count.
    Verifica que es así, porque si no me equivoco no es lo que tú quieres.
    Si es así, y corregidos los parametros en la llamada, lo que no tiene sentido es:

    Código:
    DetSpectro = system
    CopyMemory  Spectrum(0), ByVal DetSpectro , 1024 * 4 'Convierte Long a Entero usando punteros.
    Dado que ya tienes los valores necesarios en el array Spectrum, y por otro lado lo CopyMemory, no hace lo que tú dices, si no copiar a partir de la posición de Spectrum(0) los 1024*4 bytes siguientes a la posición indicada en DetSpectro, que tiene el valor indicado en system y que es una variable que la llamada a FMOD_System_GetSpectrum no cambia, y que desconocemos el valor, pero ya que funciona borra toda la información que habíamos obtenido y pone otra que básicamente es incorrecta.
    Última edición por gilman; 02-11-2018, 09:23 AM.
    Una visita a las Normas del foro nunca viene mal

    Comentario


    • #3
      Gracias gilman, por la respuesta.

      Yo creia que VB lo hacia de una forma automática cuando hace la conversion de varibles, es decir si el valor Single = 3,2E38 creia que te lo dejaba a Integer=32000, es decir de alguna manera te lo cuadraba o redondeaba o qutitaba los decimales si es el caso etc... sin tenerte que preocupar.
      Despues de lo dicho al final he puesto un 'On Error Resume Next' ya que los valores son dispares.
      En la linea que no entiendes (DetSpectro = system) tienes razón hay una varible inecesaria la quite.

      Estoy modificando un código de un programa de archivos de música con FMOD, resulta que el programa que estoy modificando sobre todo la subrutina de dibujar el espectro solo admite los MP3 esta hace una llamda a DSP y no a Spectrum como estoy haciendo, esta no es compatible con ficheros FLAC por la tanto la barra s del espectro no se mueven.

      Ahora con la libreria Fmod_Ex me fije que y hay una llama similar DSP pero esta la cambiaron y me estoy haciendo un lio de momento tampoco no se bien bien cual es la llamada a esa libreria ni su nombre ya que los ejemplos estan en C y no hay ejemplos en VB.
      Como se que existe¿? porque hay gente que tiene el mismo problemas a la antigua libreria o a la llamada a 'FSOUND_DSP_GetSpectrum' en el foro de la web FMOD, pero lo dicho todo en C.

      Me di de alta en dicha página y hice la respuesta y me contestaron escuetamente aún asi voy haciendo pero no me entero.

      De momento utilizo la llamada a Spectrum en vez a DSP que seria la ideal, hay movimiento en las barras pero un poco raras.

      Si puedes ayudarme te lo agradeceria, bajaria el código de la barra de Spectro el viejo y el modificado.


      Saludos.
      Hello, I'm working with VB6 and I've been using fmod.bas fmod_3.75. I have been able to reproduce t

      Comentario


      • #4
        Sobre el uso de esas librerías, poco, o nada, puedo ayudarte ya que las desconozco completamente, respecto a la conversión, VB si la hace automaticamente, pero el problema es que 3,2E38 no es 32000, sino 32 seguido de 37 ceros, con lo que al hacer la conversión se produce el error, si el valor estuviese entre -32768 y 32767, no se produciría dicho error, así 345.25 lo convertirá a 345, pero al intentar almacenar, por ejemplo, 500000.547 en una variable long se produce dicho error.
        Una visita a las Normas del foro nunca viene mal

        Comentario

        Trabajando...
        X