Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   desbordamiento de pila (https://www.clubdelphi.com/foros/showthread.php?t=91040)

danielmj 29-10-2016 18:25:46

desbordamiento de pila
 
Hola, tengo un error de stack overflow, en el siguiente código:
Código Delphi [-]
procedure TForm1.Button7Click(Sender: TObject);
var
  i, j: integer;

begin
    timer1.Enabled:= true;
    button5.Enabled:= false;
    button2.Enabled:= false;
    button3.Enabled:= false;
    button4.Enabled:= false;
    comb.Enabled:= false;
    for i:= 0 to lista.Items.Count -1 do
      for j:= 0 to listBox1.Items.Count -1 do
      begin
          barra2.Max:= listBox1.Items.Count;
          barra2.Position:= j;
          label10.Caption:= (IntToStr((i)+1))+' de '+IntToStr(lista.Items.Count);
          label12.Caption:= (IntToStr((j)+1))+' de '+ IntToStr(listBox1.Items.Count);
          //edit7.Text:= listBox1.Items.Strings[j];
          if lista.Items.Item[i].SubItems[0] +
            ' '+ lista.Items.Item[i].SubItems[1]+' '+lista.Items.Item[i].SubItems[2]+
            ' '+ lista.Items.Item[i].SubItems[3] +' '+lista.Items.Item[i].SubItems[4] +
            ' '+ lista.Items.Item[i].SubItems[5] = listBox1.Items.Strings[j] then
            begin
              showmessage('encontrado en la fila '+IntToStr(i)+' de la lista inical');
              lista.Selected:= lista.Items[i];
            end;
            label17.Caption:= FormatFloat('0.00',(i*100)/lista.items.Count)+'%';
      end;

      showmessage('Proceso terminado. No se encontraron coincidencias.');
      if label10.Caption = IntToStr(lista.Items.Count)then
      timer1.Enabled:= false;
      lista.Selected:= lista.Items[i];
end;

Pero si cambio listBox1.Items.Strings[j] por listBox1.Items.Text el error no se produce, aunque claro, tampoco estoy seguro de que se recorra correctamente todo el listbox. A parte, que usando .string[j] se reduce enormemente el tiempo que emplea en recorrer y comparar cada linea de listbox con cada linea del listview.

¿Alguna sugerencia? saludos.

AgustinOrtu 30-10-2016 01:51:09

Facil, en edit7.Text:= listBox1.Items.Strings[j]; estas accediendo a un indice que es mayor a edit7.Text:= listBox1.Items.Count

danielmj 30-10-2016 10:11:18

Hola agustin,
gracias por responder, pero esa linea del edit7.text... es un comentario, vamos que en la practica debe saltarla ¿no? si la salta no creo que sea esa la causa del error.


edit: Encontre esta información y estoy probando http://docwiki.embarcadero.com/RADSt..._sizes_(Delphi)

saludos.

AgustinOrtu 30-10-2016 15:07:37

Ah, crei que la habias comentado porque esa era la linea que producia el error

Por lo general en ese tipo de algoritmos en donde usas mucho los indices el problema esta ahi; tenes una lista o coleccion de lo que sea, de tamaño N y estas accediendo a una posicion que esta fuera del rango 0..N-1.

Ademas, dijiste

Cita:

Pero si cambio listBox1.Items.Strings[j] por listBox1.Items.Text el error no se produce
Por eso le apunte a esa linea

En que linea exactamente te da el error? Si te manda a una parte "rara" de codigo delphi, podes ir depurando tu codigo linea por linea y ver "hasta donde llega"

Que clase de excepcion obtienes? EStackOverflow?

danielmj 30-10-2016 20:27:48

hola agustin,

si, era stack overflow, el error es algo raro, por que me he dado cuenta que corriendo la aplicacion con la ventana minimizada (sin verse en el escritorio) el error NO se produce. Esta tarde he estado migrando todo de delphi 7 a delphi xe7 (donde inicie la aplicacion inicialmente) y la he construido para 64bit y tampoco salta el error. Pero ya digo, en d7 con la ventana del programa en modo normal, el error salta y no siempre en el mismo valor,, quiero decir...

la I recorre un listview de por ejemplo 1000 lineas y la J un listbox de 720 (este es un valor fijo) pues a veces el error salta cuando va por la linea 124 del listview y otras cuando va por la linea 673 del mismo listview. Insisto, con la aplicacion minimizada no tira errores. Ahora mismo esta funcionando para 64bit (compilada en xe7) y minimizada junto al reloj y va bien.
Un saludo.


La franja horaria es GMT +2. Ahora son las 21:31:45.

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