Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con error list index out of bounds (https://www.clubdelphi.com/foros/showthread.php?t=90938)

danielmj 14-10-2016 15:18:43

Ayuda con error list index out of bounds
 
1 Archivos Adjunto(s)
Hola, después de mucho tiempo sin entrar y casi el mismo sin hacer nada en delphi (por trabajo), vuelvo buscando vuestra ayuda y conocimientos y más despues del tiempo sin tocar nada de programación, pero el tiempo muerto es mucho (trabajo de noche), así que me puse con una tonteria, pero una tonteria que me trae de cabeza. Es el tipico programa para sacar combinaciones de la loteria. El programa corre y no da error, hasta que le pido los seis numeros mas repetidos y entonces me tira el error "list index out of bounds (6)".

Os he adjuntado el archivo rar con todo el programa. El error lo da cuando se pulsa el boton "Buscar repeticiones"
Está hecho en xe7 por que una vez consiga que haga lo que quiero me gustaria pasarlo a android despues claro, de cambiar las 4 cosas que sean necesarias. También unso un hilo de ejecucion y no tengo ni idea de si funcionara en android, pero bueno paso a paso, ahora lo que me trae loco es ese error al mostrar resultados.

Espero vuestra ayuda, un saludo a todos.
Ah, por cierto, el código que deberia mostrar el resultado es una respuesta (creo) que de ecfisa que ya me ayudo con este problema hace mucho tiempo, incluso tengo el ejemplo que el me paso y que NO da error, pero a mi en xe7, si.

Ñuño Martínez 14-10-2016 18:49:20

No he visto el código, pero por lo que dices, ¿no será que estás contando desde el 1 y deberías contar desde el 0? Lo digo porque a veces a mi también me pasa.

danielmj 14-10-2016 20:10:31

hola ñuño,

el error salta cuando se pulsa este boton..
Código Delphi [-]
procedure TForm1.Button4Click(Sender: TObject);
var
   i, j, p : Integer;
   ModaCount : Array[0..5] of Integer;
   AModa : Array[0..5] of TModa;
   b : Boolean;

begin

   // Cuenta cuantas ocurrencia hay de un número.
   // la posición del arreglo corresponde al número generado aleatoriamente
   // El valor del arreglo corresponde a la cantidad de ocurrencias encontradas para ese número.
   FillChar(ModaCount,Sizeof(ModaCount),0);
   for i := 0 to lista.Items.Count - 1 do
   begin
      for j := 0 to lista.Items.Item[i].SubItems.Count - 1 do
      begin
         p := StrToInt(lista.Items.Item[i].SubItems.Strings[j]);
         ModaCount[p] := ModaCount[p] + 1;
      end;
   end;

   // Genera un arreglo con los 6 primeros números en orden de repetición.
   FillChar(AModa,Sizeof(AModa),-1);
   for i := Low(AModa) to High(AModa) do
      for j := Low(ModaCount) to High(ModaCount) do
      begin
         if AModa[i].Count < ModaCount[j] then
         begin

            for p := 0 to 5 do
               if (AModa[p].Number = j) then
                  b := True;

            if not b then
            begin
               AModa[i].Number := j;
               AModa[i].Count := ModaCount[j];
            end;

            b := False;

         end;
      end;

   // Muestra los primeros números repetidos en secuencia hasta un máximo de 6
   for i:= 0 to 6 do
   begin
      if (AModa[i].Count <> 0) then
        ShowMessage(Format('El %s número es %d con %d ocurrencias',[Secuencia[i],AModa[i].Number,AModa[i].Count]));
   end;
end;

Un saludo.

Casimiro Noteví 14-10-2016 20:40:23

Sigue paso a paso el código con el depurador y mira la línea que da error.

roman 14-10-2016 20:54:42

Deberías ser más específico en cuanto a la localización del error. Sin embargo, en el código que escribes, el útimo ciclo seguramente te producirá el error de "Index out of bounds":

Código Delphi [-]
   // Muestra los primeros números repetidos en secuencia hasta un máximo de 6
   for i:= 0 to 6 do
   begin
      if (AModa[i].Count <> 0) then
        ShowMessage(Format('El %s número es %d con %d ocurrencias',[Secuencia[i],AModa[i].Number,AModa[i].Count]));
   end;

AModa va de 0 a 5 y tu ciclo va de 0 a 6.

LineComment Saludos

danielmj 14-10-2016 21:32:52

Hola, escribió desde el móvil lo digo por si alguna palabra no se entiende..
Gracias por responder, lo del 0..6, el 6 lo puse por probar, pero el error ya me daba
Con 0..5
Hola casimiro, ahora mismo estoy en el curro, pero mañana miraré lo del depurador.
Gracias otra vez y un saludo.

roman 17-10-2016 15:50:50

Cita:

Empezado por danielmj (Mensaje 509562)
Hola, escribió desde el móvil lo digo por si alguna palabra no se entiende..
Gracias por responder, lo del 0..6, el 6 lo puse por probar, pero el error ya me daba
Con 0..5

Pues si haces una pregunta y pones un código, trata de que éste coincida con tu problema. Y sigues sin contestar en qué punto exactamente ocurre el error.

LineComment Saludos

danielmj 18-10-2016 16:58:26

hola, ya esta solucionado, el problema es que no habia declarado los campos "max y rows" en el apartado de constantes. Estuve toqueteando y debí borrarlo.
El código que tiene relacion con el error y la pregunta en cuestion es este:

Código Delphi [-]
private
    { Private declarations }
  public
    { Public declarations }
  end;

  TModa = record
     Number : Integer;
     Count : Integer;
  end;

  THilo = class( TThread )
    Ejecutar: procedure of object;
    procedure Execute; override;
  end;

const
  {Max = 50; // Número máximo de elementos a generar aleatoriamente
  Rows = 100; // Número máximo de lineas del control TListview}
  Secuencia : Array[0..5] of String = ('primero','segundo', 'tercero', 'cuarto', 'quinto', 'sexto');
  Max = 50; // Número máximo de elementos a generar aleatoriamente
  Rows = 150000000; // Número máximo de lineas del control TListview

Como se puede ver, max y rows aparecen marcados como comentarios y ahí estaba el error.


La franja horaria es GMT +2. Ahora son las 13:30:03.

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