Delphi - Acces violation at addres

 
Vista:

Acces violation at addres

Publicado por CARLES (5 intervenciones) el 08/11/2009 01:54:54
Hola a todos,
soy nuevo en esto(delphi 7) , por eso ruego me disculpeis si mis preguntas no son con el máximo rigor de programación. Estoy realizando el proyecto final de carrera que consiste en una sencilla aplicación que calcula incertidumbre a partir de niveles acusticos medidos.

OBJETIVO: consiste en la siguiente implementación :

1- De un stringgrid donde se han introducido valores, almacena en un array de array de double.
2- cada fila corresponde a una frecuencia y cada columna a un ensayo (total 10 columnas con valores,es decir ensayos) + otra columna para mostrar el promedio de los 10 ensayos.

frecuencia ,ensayo1, ensayo2 ,ensayo3..... ...... ........, ensayo10, PROMEDIO
125 Hz 20,45 18,98 15,67 ...... ....... .. 21,34, X
160 Hz
200 Hz
...
5000 H

IMPLEMENTACIÓN:

procedure TPrincipal.B_validadatoClick(Sender: TObject);
//Procedimiento Onclick del objeto validadato.
//Procede en almacenar los datos ubicados en las celdas de los stringgrid
//en diferentes array

var j:integer; //filas
i:integer; //columnas

begin

SetLength(matriz_le,tabla_le.RowCount,tabla_le.ColCount);

for j:=1 to (tabla_le.RowCol-1)do
begin
for i:=1 to(tabla_le.ColCount-2)do
begin

matriz_le[i,j]:=StrToFloat(tabla_le.Cells[i,j]);//lee tabla_le y almacena en matriz_le
//FormatFloat('###,###,##0.00',matriz_le[i,j]);

end;
matriz_le[11,j]:=0.00; //inicializa la columna 11 (promedios) de matriz_le
// FormatFloat('###,###,##0.00',matriz_le[11,j]);
end;

for j:=1 to (tabla_le.RowCol-1) do
begin
for i:=1 to (tabla_le.ColCount-2) do
begin

matriz_le[11,j]:=matriz_le[11,j]+(Power(10,(matriz_le[i,j]/10))); // Sumatorio(dB-> lineal)
tabla_le.Cells[i,j]:=FloatToStr(matriz_le[i,j]); //muestro toda la matriz:le
end;
matriz_le[11,j]:=(matriz_le[11,j]/(tabla_le.ColCount-2)); //Promedia valor en lineal
matriz_le[11,j]:=10*(log10((matriz_le[11,j]))); //Paso a logaritmico (dB)
FormatFloat('###,###,##0.00',matriz_le[11,j]);
tabla_le.Cells[11,j]:=FloatToStr(simpleRoundTo(matriz_le[11,j],-2){matriz_le[11,j]});

end;
end;// Validadato

ERROR / PROBLEMA:

1. Acces violation at addres 004A4... in module '______ .exe'.Write of addres 00000008

2. Project ________.exe raised exception class E invalid Op with message 'Invalid floating point operation'.Process stopped.Use Step or Run to continue.


Muchas gracias por vuestro tiempo y conocimientos, agradezco toda la ayuda posible, no entiendo que estoy haciendo mal.

GRACIAS DE NUEVO
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:Acces violation at addres

Publicado por E.T. (1244 intervenciones) el 09/11/2009 17:15:47
Si ejecutas el programa en modo linea a linea es útil para ver donde ocurre el problema
Para que el programa se detenga en una linea del codigo, puedes poner un break point, presionando F5 cuando el cursor esté en la linea que deseas que se detenga el prorgama, cuando tengas tu break point, ejecuta el programa, cuando se detenga presiona F8 para saltar a la siguiente linea.

A primera impresión tu fallo está en el SetLength, el cual no funciona simplemente diciendole que tiene X columnas y Y lineas, lo correcto es lo siguiente

Primero decirle la cantidad de columnas

SetLength(matriz_le,tabla_le.ColCount);

Luego a cada columna decirle la cantidad de lineas que va a tener

for i:= 0 to length(matriz_le)-1 do
SetLength(matriz_le[i],tabla_le.RowCount);

Ahora si, tienes tu matriz de X por Y. Tambien puedes hacerlo a la inverza, diciendole primero la cantidad de lineas, luego las columnas, aqui es cuestion personal la elección
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Acces violation at addres

Publicado por Carles (5 intervenciones) el 09/11/2009 17:32:41
Hola E.T ,
muchas gracias por responder y por el apunte del Setlength , break point...
voy a seguir los consejos.

gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar