Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Arreglo!!! (https://www.clubdelphi.com/foros/showthread.php?t=67277)

MARLON1 08-04-2010 23:27:31

Arreglo!!!
 
Hola a todos:

Les comento mi problema , estoy trabajando en delphi 1o, pero resulta que quiero guardar una variable en un arreglo que se encuentra en un ciclo for,pero me arroja un error "acces violation at adrres 004078a2 in module 'puerto.exe. write of address 0000000", la verdad nose a ke se deba este error, espero y me haya explicado les dejo el codigo que tengo. saludos
Código Delphi [-]
 
var
 
resultx: array of string;
 uno,dos,Xutm: real;
begin
 
for ini:=0 to fin do begin

 uno:=dbgrid2.DataSource.DataSet.FieldValues['x'];
 dos:=dbgrid2.DataSource.DataSet.FieldValues['y'];
 
"proceso esta informacion y arrojo un resultado"
 
resultx[ini]:=FloatToStr(Xutm)  ;
 
dbgrid2.DataSource.DataSet.Next;
 
end;
 end;
end.

Casimiro Notevi 08-04-2010 23:42:01

Hola, MARLON1, por favor, pon títulos descriptivos a los temas para saber de qué trata, ya que luego a la hora de buscar no sirve de nada a nadie que quiera encontrar algo sobre el mismo tema, te recomiendo que leas la guía de estilo de clubdelphi, gracias.

En cuanto a tu pregunta, está el código un poco "lioso" con variables que no se saben de donde vienen ni qué son, pero de todas formas, me parece que te olvidaste de declarar el tamaño del array.
Código:

resultx: array [xxx] of string;

MARLON1 08-04-2010 23:58:29

Gracias!!
 
Cita:

Empezado por Casimiro Notevi (Mensaje 359823)
Hola, MARLON1, por favor, pon títulos descriptivos a los temas para saber de qué trata, ya que luego a la hora de buscar no sirve de nada a nadie que quiera encontrar algo sobre el mismo tema, te recomiendo que leas la guía de estilo de clubdelphi, gracias.

En cuanto a tu pregunta, está el código un poco "lioso" con variables que no se saben de donde vienen ni qué son, pero de todas formas, me parece que te olvidaste de declarar el tamaño del array.
Código:

resultx: array [xxx] of string;


QUE TAL CASIMIRO:

YA TRATE DECLARANDO EL TAMAÑO DEL ARREGLO PERO AUN ASI SIGUE EL PROBLEMA, PERO MUCHAS GRACIAS DE TODAS FORMAS, NO PUSE EL CODIGO COMPLETO POR QUE PENSE KE SERIA MAS ENREDO, PERO AHORA LO PONGO IGUAL Y SIRVE DE MAS AYUDA.

Código Delphi [-]
var
uno,dos,ttotal,total,A_X,B_Y,Ema,eme,emac,emec,rest,rauz,e1,e2,e2c,c1,alpha1,mA_X,mB_Y,gA_Xr,gB_Yr,m  gA_Xr,mgB_Yr,Huso,Lo,pi,pid,DeL,A,E,N,cose2,V,C2,A1,A2,J2,J4,J6,ALPHA,alp1,BETHA,alp2,alp3,GAMMA,Bo,  Xutm,Yutm :real;
raizc,Xut,Yut:real;
inc,ino,ini,fin: integer;
resultx : array of string;
begin
QUERY2.Close;
QUERY2.SQL.Clear;
QUERY2.SQL.Add('SELECT *FROM DATOS WHERE MAQUINA=:MAQ && DR=:D && MODULO=:MO && DIA=:DI && MES=:ME && ANO=:AN');
QUERY2.ParamByName('MAQ').Value:=EDIT1.Text;
QUERY2.ParamByName('D').Value:=EDIT2.Text;
QUERY2.ParamByName('MO').Value:=EDIT3.Text;
QUERY2.ParamByName('DI').Value:=EDIT4.Text;
QUERY2.ParamByName('ME').Value:=EDIT5.Text;
QUERY2.ParamByName('AN').Value:=EDIT6.Text;
QUERY2.Open;
dbgrid2.DataSource.DataSet.First;
ini:= dbgrid2.DataSource.DataSet.Fields[0].Value;

  fin:=0;
  inc:=0;
dbgrid2.DataSource.DataSet.First;
for fin:=0 to ini do begin

 uno:=dbgrid2.DataSource.DataSet.FieldValues['x'];
 dos:=dbgrid2.DataSource.DataSet.FieldValues['y'];
  //grados decimales
        A_X :=  uno; // w
        B_Y :=  dos; // N

     Ema := 6378388.000000;
      eme := 6356911.946130;
  emac:= Ema * Ema;
  emec:= eme * eme;
  rest:= emac - emec;
  rauz:= sqrt(rest);
    e1  := rauz/ Ema;
    e2  := rauz / eme;
    e2c := e2 * e2;
    c1   := Ema*Ema/eme;
  alpha1 := (Ema-eme)/Ema;
      mA_X := -A_X; // w
        mB_Y := -B_Y; // N
  //Convertirgrados rad
  gA_Xr := A_X*3.14159265358979323846/180; // w
        gB_Yr := B_Y*3.14159265358979323846/180; // N
  mgA_Xr := -gA_Xr; // w
    mgB_Yr := -gB_Yr; // N
    Huso := floor(mA_X/6+31);
  Lo   := Huso*6-183;
  pi:= Lo* 3.14159265358979323846;
  pid:= pi /180;
    DeL := mgA_Xr - pid;
  A  := cos(gB_Yr)*sin(DeL);
  E  := 1/2* ln(((1+A)/(1-A)));
    N  := arctan(tan(gB_Yr)/cos(DeL)) - gB_Yr;
  cose2 := cos(gB_Yr)*cos(gB_Yr);
  V  := c1* 0.9996/((1+e2c*cose2))*1/2;
  C2  := e2c/2 * $E*$E * cos(gB_Yr)*cos(gB_Yr);
  A1  := sin(2*gB_Yr);
  A2  := A1* cos(gB_Yr)*cos(gB_Yr);
    J2  := gB_Yr + A1/2;
  J4  := (3*J2 +A2)/4;
  J6  := (5*J4 +A2*cos(gB_Yr)*cos(gB_Yr))/3;
  ALPHA := 0.75 * $e2c;
  alp1:= ALPHA * ALPHA;
  BETHA:= 1.6666666666666666666666666666667 * alp1 ;
  alp2:= ALPHA * ALPHA;
  alp3:= alp2 * ALPHA;

  GAMMA := 1.2962962962962962962962962962963 * alp3;
    Bo  := 0.9996 * c1 * (gB_Yr-((ALPHA * J2) + BETHA )*( J4 - GAMMA ) * J6 );
 
  Xutm := E*V*(1+C2/3)+500000;
  Yutm := N*V*(1+C2)+Bo;
    Listbox2.Items.Add(FloatToStr(Xutm));
    Listbox3.Items.Add(FloatToStr(Yutm));
      resultx[fin]:=FloatToStr(Xutm);  -----------------------AKI ESTA EL ERROR
    dbgrid2.DataSource.DataSet.Next;
 end;
end;

Casimiro Notevi 09-04-2010 00:44:25

Te tengo que dar la misma respuesta que antes:

Tienes que darle un tamaño:
Código:

resultx:array [xxx] of string;
Código:

resultx[fin]:=FloatToStr(Xutm);  -----------------------AKI ESTA EL ERROR
Te aconsejo que leas sobre los arrays.
No puede asignar un valor a algo que no existe,

Ejemplo:
Código:

var
  personas : array [3] of string;  // array de 3 elementos
begin
  personas[0] := 'manolo';  // posición 1
  personas[1] := 'maría';  // posición 2
  personas[2] := 'pedro';  // posición 3
  personas[3] := 'juan';  // ERROR !!!  no existe sitio en el array para 4 elementos !!!

end;


MARLON1 09-04-2010 00:49:32

casimiro:

te agradezco mucho te ayuda, pero como te digo ya lo intente o nose si lo estoy declarando mal el arreglo, lo declaro asi pero aun me marca error, gracias por la ayuda :o
Código Delphi [-]
resultx : array[1..100] of string;

Casimiro Notevi 09-04-2010 01:56:58

En tu código declaras 'fin' y le das el valor cero.
Luego haces un bucle 'for' desde 0 (el valor de fin) hasta 'ini', que lo sacas de aquí:
Código:

ini:= dbgrid2.DataSource.DataSet.Fields[0].Value;
¿cuánto vale esa variable 'ini'?
Luego asignas al array, en la posición 'fin' un valor.
Código:

resultx[fin]:=floattostr(Xutm)
Pues bien, como al principio has declarado el array
Código:

resultx : array[1..100] of string;
si la variable 'fin' tiene un valor menor de 1 o mayor de 100 ---> ¡¡¡crack!!!
y por supuesto, si la declaras sin tamaño... no puede hacerse eso.
Tienes varias soluciones, pero para empezar te hago una pregunta:
¿qué valores mínimo y máximo puede resultar de aquí: dbgrid2.DataSource.DataSet.Fields[0].Value

JosepGA 09-04-2010 09:32:41

Hola MARLON1, creo que Casimiro tiene razón, no puedes asignar un valor a una posición del array que no existe, yo tambien pienso que hay tienes el problema.

Un saludo

defcon1_es 09-04-2010 10:51:00

Prueba con SetLength
 
Como ya te han comentado, si declaras el array con un tamaño y "te pasas", te da error.

Una solución sería aumentar el tamaño del array en tiempo de ejecución,
ya que si sabes (en ejecución) el tamaño máximo de ese array.

Código Delphi [-]
dbgrid2.DataSource.DataSet.First;
SetLength(resultx, ini); // Redimensionado del array
for fin:=0 to ini do begin

MARLON1 12-04-2010 16:22:55

Gracias a todos
 
Pues si ese era el error!! que el tamaño de mi arreglo lo declaraba [1..n], y mas abajo fin lo igualaba a "cero", y ps ahi tronaba :D, muchas gracias a todos, lo unico que tenia que hacer era lo que uds me decian declarar el tamaño de mi arreglo asi [0..n].


saludos.;)


La franja horaria es GMT +2. Ahora son las 07:31:42.

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