Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-06-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 18
Guillermo80 Va por buen camino
Stack Overflow

Hola peña, creo que el título de mi hilo lo dice todo...¡ me quedo sin memoria !
El caso es que no entiendo el porqué, ya que me he asegurado de declarar variables tipo LongWord para que no sobrepase el rango.

Mi programa es de codificación de audio, hay un bucle en el que cada vez el número de muestras codificadas va aumentando, hasta que pega el pete cuando lleva 211Mb codificados...Le puse para que codificara un archivo de gran tamaño, para probar un contador de tiempo que le puse a la aplicación, para probar si me contaba bien los minutos, pero claro, no me imaginaba yo que me pegase le excepción a los 38'', momento en el que me doy cuenta de que mi aplicación tiene un fallo que no había detectado.

¿Qué podría hacer? ¿Es posible que LongWord no sea suficiente para controlar el nº de muestras que voy codificando? El problema parece no estar ahí, pero no sé dónde más mirar
Responder Con Cita
  #2  
Antiguo 01-06-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Provastes int64?

Int64= –2^63..2^63–1
Longword= 0..4294967295

Salu2
Responder Con Cita
  #3  
Antiguo 01-06-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
no llamaras recursivamente a alguna funcion dentro del bucle?, tipo :

Código Delphi [-]

function calcula(s)
begin
...

for ...

   Calcula(s-1);

end;

end;

o en un OnEvent change?

Última edición por coso fecha: 01-06-2008 a las 16:40:59.
Responder Con Cita
  #4  
Antiguo 01-06-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 18
Guillermo80 Va por buen camino
Pues ni lo uno ni lo otro, quiero decir, no tengo puesto nada recursivo, y por otra parte, he probado con el tipo Int64 y tampoco ha resultado .

Tengo puesto un TTimer para hacer un reloj que cuente el tiempo de proceso, ¿podría ser este el problema? de todas formas lo puse enabled:=false por probarlo pero tampoco ha resultado.

Ya casi no me quedan ideas por probar, no creo ya que sea cosa de overflow de alguna variable, ahora estoy pensando que es problema de la propia función de mi librería que llama a la función codificadora, ya que al comentar esa línea el proceso de lecturas va perfecto. La función codificadora es de una dll que tengo importada para el programa.

Saludos.
Responder Con Cita
  #5  
Antiguo 01-06-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
si pones el codigo del bucle quiza te podamos ayudar mejor...

pd: usas los breakpoints, watches, ctrl+f3 y el f8 del debugger para saber exactamente cuando te salta el stack overflow?
Responder Con Cita
  #6  
Antiguo 01-06-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 18
Guillermo80 Va por buen camino
En el debug me sale en call FreeDeviceContexts, si le doy a ctr+F3 me va al boton que llama la función de codificación, pero no me aclara nada, o sea, en código va a:

Cita:
procedure TForm1.BtnDecodeClick(Sender: TObject);
begin

DesHabilitaTodo(Sender);
EditDest.Text:=ChangeFileExt(EditDest.Text, '.flac');// ruta destino + nombre fichero flac
DecodeFile(EditDest.Text, EditFileName.Text); // ruta destino.flac, ruta origen.wav

end;
DesHabilitaTodo no es el problema ya que lo he comentado y sigue saltando la excpeción. DecodeFile es la función que contiene el bucle cuyo código es:
Cita:
while (ok = 1) and (restan > 0) and (BtnDecode.Cancel = false)do
begin
Application.ProcessMessages;
if restan > READSIZE then
begin
necesarias := READSIZE
end
else
begin
necesarias := restan;
end;

progreso := progreso + necesarias;

if(progreso > BarraProgreso.Step) then
begin
BarraProgreso.StepIt;
end;

BlockRead(F_Origen, buffer, tmuestra, transferidas);

if necesarias<tmuestra then
begin
MessageDlg('Error al leer del fichero, las muestras leídas tienen tamaño menor que el tamaño de lectura por muestra', mtError, [mbOk], 0);
ok := 0;
restan := 0;
end
else if ok = 1 then
begin
for i:=0 to (necesarias*channels-1) do
begin
//trabajo ineficiente pero efectivo para sistemas little-endian o big-endian
pcm[i] := FLAC__int32(FLAC__int16(FLAC__int8(buffer[2*i+1]))) shl 8 or FLAC__int16(buffer[2*i]);
end;
//se alimenta el codificador
ok := FLAC__stream_encoder_process_interleaved(pencoder, pcm, necesarias);
end;
restan := restan - necesarias;//necesarias;
end;//while
Si comento la línea que llama a la función FLAC__stream_encoder_process_interleaved, entonces no salta la excepción.

Yo no sé a vosotros, pero yo debugeando con Delphi lo hago a nivel un poco básico y esto del ctrl+F3 y viendo la pila con esas instrucciones en ensamblador no me han aclarado casi nunca los problemas que he tenido...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
stack overflow juan francisco Varios 6 28-05-2008 22:26:15
Stack overflow aonarres API de Windows 5 29-02-2008 13:07:11
Stack overflow al reabrir una tabla jzginez Conexión con bases de datos 1 24-04-2007 16:52:53
Stack Overflow agonzalez Varios 5 08-12-2006 22:26:46
Stack Overflow Mariana Varios 14 30-10-2003 11:37:47


La franja horaria es GMT +2. Ahora son las 08:44:28.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi