Ir al contenido


Foto

Tratamiento de un bloque de datos


  • Por favor identifícate para responder
23 respuestas en este tema

#21 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 28 junio 2013 - 05:53

Hola a todos. He realizado un procedimiento para calcular el valor de la direcion promedio donde se encuentran los datos de mayor señal. Compila bien pero da error en la ejecución:

          " is not a integer valid value


Veo varios errores en tu código, pero faltría saber en qué línea te salta el error.

En la línea 16 pones  "for k := 1 to length(arrayprincipal) do" y a continuación usas la posicion k+1 y k+2... eso está mal... primero tu array termina en la posición lenght()-1 porque empieza en 0 y no en 1, y segundo, si vas a usar k+2, el for debe terminar dos posiciones antes, así que deberías poner "length(arrayprincipal)-3".

Este podría ser el problema, porque si lees en el array pasado el final, o te da un error o leeras textos vacios (según las opciones de compilación), y strtoint('') te daría justo el error que envías.

En la linea 52 se repite el problema.

Bueno, comprueba esto y si da error dinos en que línea exactamente.
  • 0

#22 mosco

mosco

    Member

  • Miembros
  • PipPip
  • 11 mensajes

Escrito 29 junio 2013 - 08:07

Gracias Sergio y Cadetill. Ustedes son muy buenos en esto pero yo me quedo cortísimo.
He modificado el código siguiendo vuestras indicaciones pero ahora me salta otro fallo que me tiene encasquillado. Pongo solo la parte inicial del codigo anterior que he modificado y que esta provocando el error:



delphi
  1. procedure  TForm1.ValorMaximo(orientacion:char);          //Funcion que halla el valor
  2. var                                                      //medio de la direccion en
  3.   i, k, s, n, p, valorEntero, tamanio, posicionMaximo:integer;  //donde la señal es mayor
  4.   senialMayor, promedioMinimo, promedioMaximo: integer;    //Se puede llamar tanto para
  5.   direccionMayor:array [1..8] of Char;                    //azimut como para elevacion
  6.   direccionMenor:array [1..8] of Char;
  7.   promedioMayorH:array [1..4] of Char;
  8.   promedioMayorV:array [5..8] of Char;
  9.   promedioMenorH:array [1..4] of Char;
  10.   promedioMenorV:array [5..8] of Char;
  11.   juntaOchoChar:string;
  12.   cadenaIndividual:string;
  13.   senial:string;
  14.   begin
  15.     senialMayor:= 0;
  16.     valorEntero:=0;
  17.     posicionMaximo:=0;
  18.     for i:=1 to 8 do
  19.       direccionMayor[i]:='0';                          //Inicializar , porque da error
  20.     for i:=1 to 8 do
  21.       direccionMenor[i]:='0';
  22.     for k := 1 to length(arrayprincipal) do
  23.       begin
  24.         cadenaIndividual:=arrayprincipal[k];
  25.           if cadenaIndividual[10] = ')' then
  26.             begin
  27.               senial[1]:=cadenaIndividual[11];
  28.               senial[2]:=cadenaIndividual[12];
  29.               valorEntero:= strtoint(senial[1]+senial[2]);
  30.                 if valorEntero > senialMayor then
  31.                   begin
  32.                     senialMayor:= valorEntero;
  33.                     tamanio:= 1;
  34.                     posicionMaximo:= k;
  35.                     for s:=2 to 9 do
  36.                       begin
  37.                         direccionMayor[tamanio]:=cadenaIndividual[s];
  38.                         tamanio:= tamanio + 1;
  39.                       end;
  40.                   end;
  41.             end;
  42.       end;



La pantalla de error pone lo siguiente:

Acces violation at address 0045AAEE4 in module "programa.exe". Read of address 00000009.


Saludos

PD:  Las variables globales del Form tengo:



delphi
  1. arrayprincipal: array[1..500] of string;
  2.   direccionPromedio:array[1..8] of Char;


  • 0

#23 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 01 julio 2013 - 02:12

Te repito lo mismo que te dije en mi anterior mensaje. Pon un breakpoint (F5 cuando tengas el cursor en la linea) en la 1era línea del procedure y ejecuta paso a paso (F7 o F8) para ver dónde salta el error. Un AV suele ser porque haces una referencia a un objeto que ya ha sido destruido o simplemente que nunca fue creado.

Cuando encuentres la linea con el error, quizás tú mismo des con la solución :-) Sino, dinos qué linea es y vemos por qué salta el AV

Saludos
  • 0

#24 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 01 julio 2013 - 04:06

Das muchas cosas por supuestas en tu código, y una no es cierta ¿cual? pues vete a saber, muchos arrays no aparecen en el código, pero deberías leer sobre como hacer "debug" en delphi, para pasar el programa pasito a pasito y ver donde da el error y esas cosas.

Por ejempo, en esta línea " if cadenaIndividual[10] = ')' then" das por supuesto que esa cadena mide 11 (las cadenas suelen empezar por el caracter 0), y claro, puede que si, puede que no... más adelante usas la posicion 11 y 12... eso no puedes darlo por supuesto, deberias asegurarte de que es así antes de nada, y de paso "avisarte" si algo falla:



delphi
  1. if (Length(cadenaindividual) < 13) then
  2.   ShowMessage('Problemas con cadena individual demasiado corta: "'+cadenaindividual+'"');
  3. end else if cadenaIndividual[10] = ')' then
  4.  
  5. ...aqui el resto de tu código...
  6.  
  7. end;



Ya sabes, la suposición es la madre de todas las pifias!

Otro punto donde supones cosas: "valorEntero:= strtoint(senial[1]+senial[2]);" esto puede darte error si no hay digitos en esos valores. Puedes asegurarte de que son digitos o bien usar un try/except:



delphi
  1. try
  2.   valorEntero:= strtoint(senial[1]+senial[2]);
  3. except
  4.   on e: exception do
  5.     ShowMessage('Error con strtoint(senal1+2). El error es: '+E.message);
  6. end;



La otra opción es comprobarlo, yo usaría una funcion que detecte dígitios como esta:



delphi
  1. function EsDigito(v: char): boolean;
  2. begin
  3.   result:= (Pos(v, '0123456789') > 0);
  4. end;
  5.  
  6. if EsDigito(senial[1]) and EsDigito(senial[2]) then



Vamos, que programar "a prueba de bombas" requiere un esfuerzo algo mayor que solo "programar" pero trae cuenta hacerlo bien.
  • 0




IP.Board spam blocked by CleanTalk.