Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-02-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 28
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
El asunto es que en una "marea" de codigo es facil perderse:

http://www.dreamsongs.com/ObjectsHaveNotFailedNarr.html


Cita:
Muestrame tus flujos y esconde tus tablas, y me mantendrás estupefacto. Muestrame tus tablas y usualmente no necesitare tus flujos, estos serán obvios.

Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won't usually need your flowchart; it'll be obvious.
--Fred Brooks, in Chapter 9 of The Mythical Man-Month
Por lo que veo del codigo, esta muy complicado. Tiene DEMASIADAS constantes, abreviaciones y demás que no dejan claro qué es que. Es mas simple escribir funciones cortas que resuelven tareas especificar, y unirlas reduciendo al minimo el uso de variables de estado. Para simular el uso de "tablas" y hacer evidente la estructura del programa, usa en Delphi Records(mejor pa este caso)/Objetos.

Asi, por ejm:

Código Delphi [-]
type
   TPlaneta = (SE_MERCURY, SE_VENUS, ...); 

TPlanetaMedicion = Record
    nombre: TPlaneta
    ..
    ..
  end;

procedure medir(planeta : TPlaneta): TPlanetaMedicion;

Nota bien lo interesante. Usando records/clases como si modelaras las "tablas" de una BD vas dandole forma a la estructura conceptual del programa, y al usuarlo en funciones/metodos se vuelve claro cual es el flujo de este: "medir TPlaneta me retorna un TPlanetaMedicion".

El programa se AUTO DOCUMENTA cuando usas los nombres/clasificaciones/tipos de datos adecuados. De allí es copiar datos y calcular. Ademas, en Delphi tienes enumeraciones y sets, que son superiores (logicamente) que clavar constantes como ocurre con SE_MERCURY y similares.

Aunque pueden haber expeciones, si un metodo/funcione tiene "muchas" lineas *tal vez* es buena idea partirlo en sub rutinas (o agregas marcas con comentario en las secciones).

El truco que dice Fred Brooks es que estructurar los datos clarifica el programa mientras el codigo "duro" lo obscurece.

Con respecto a copiar arrays, es mejor que aprendas como usar iteraciones y LOW/HIGH para capturar las posiciones del mismo:

http://www.delphibasics.co.uk/Article.asp?Name=Arrays
__________________
El malabarista.

Última edición por mamcx fecha: 20-02-2020 a las 21:22:27.
Responder Con Cita
  #2  
Antiguo 20-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
De entrada y sin entrar en el funcionamiento del código veo que tienes una unit con las definiciones para usar swedll32.dll desde delphi. Eso implica que debes incluirla en el uses y no repetir de nuevo nada.


Tu código debe quedar mucho más sencillo y resumiendo esto es la parte que interesa:


Código Delphi [-]
unit sample2; 

interface  

uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   StdCtrls, swiss;  

type   TForm1 = class(TForm)
    button_doit: TButton;     
    button_exit: TButton;
    outfld: TMemo;
    combo_utet: TComboBox;
    Combo_EW: TComboBox;
    Combo_NS: TComboBox;
    combo_hsys: TComboBox;
    day: TEdit;
    month: TEdit;
    year: TEdit;
    outfld: TMemo;
    hour: TEdit;
    minute: TEdit;
    second: TEdit;
    lon_deg: TEdit;
    lon_min: TEdit;
    lon_sec: TEdit;
    lat_deg: TEdit;
    lat_sec: TEdit;
    lat_min: TEdit;

 ...........
implementation

{$R *.dfm}

procedure TForm1.button_doitClick(Sender: TObject);
const
   hsys: array[0..4] of Char = ('P', 'K', 'R', 'C', 'E');
var
   tjd, tjdet, tjdut, tsid, armc, dhour, deltat : double;
   eps_true, e, nut_long: double;
   glon, glat: double;
   sjul: String[30];
   s: Array[0..255] of Char;
   sout: string[255];
   i, j: integer;
   iflag, rflag : Longint;
   ilondeg, ilonmin, ilonsec, ilatdeg, ilatmin, ilatsec: Integer;
   hcusps: array[0..12] of double;
   ascmc: array[0..9] of double;
   pname: array[0..19] of Char;
begin
  outfld.clear;
  iflag := 0;
  iday := StrToInt(day.Text);
  imonth := StrToInt(month.Text);
  iyear := StrToInt(year.Text);
  ihour := StrToInt(hour.Text);
  imin := StrToInt(minute.Text);
  isec := StrToInt(second.Text);
  ilondeg := StrToInt(lon_deg.Text);
  ilonmin := StrToInt(lon_min.Text);
  ilonsec := StrToInt(lon_sec.Text);
  ilatdeg := StrToInt(lat_deg.Text);
  ilatmin := StrToInt(lat_min.Text);
  ilatsec := StrToInt(lat_sec.Text);
  dhour := ihour + imin / 60.0 + isec / 3600.0;
  tjd := swe_julday(iyear, imonth, iday, dhour, 1);
  deltat := swe_deltat(tjd);
  if (combo_utet.ItemIndex <= 0)then
    begin
    {input date is Universal Time}
    Str((deltat * 86400):16:10,  sjul);
    sout := 'deltat:     ' + sjul + ' sec';
    outfld.Lines.Add(sout);
    tjdut := tjd;
    tjdet := tjd + deltat;
    Str(tjdut:10:8,  sjul);
    sjul := sjul + ' UT';
    end
  else
    begin
    {input date is Ephemeris Time}
    tjdet := tjd;
    tjdut := tjd - deltat;
    Str(tjdet:16:10,  sjul);
    sjul := sjul + ' ET';
    end;
  sout := 'jul. day:   ' + sjul;
  outfld.Lines.Add( sout);
  outfld.Lines.Add(' ');
  { planets }
  for i := SE_SUN to SE_TRUE_NODE do
    begin
      rflag := swe_calc(tjdet, i, iflag, xx[0], serr);
      if (rflag <> iflag) then outfld.Lines.Add(StrPas(serr));
      Str(xx[0]:16:10,  sjul);
      swe_get_planet_name(i, pname);
      sout := StrPas(pname);
      for j := StrLen(pname) to 11 do sout := sout + ' ';
      sout := sout + sjul;
      outfld.Lines.Add( sout);
    end;
  { for houses: ecliptic obliquity and nutation }
  rflag := swe_calc(tjdet, SE_ECL_NUT, 0, xx[0], serr);
  if (rflag <> 0) then outfld.Lines.Add(StrPas(serr));
  eps_true := xx[0];
  e:=xx[1];
  nut_long := xx [2];
  { geographic position }
  glon := ilondeg + ilonmin / 60.0 + ilonsec / 3600.0;
  if (combo_EW.ItemIndex > 0) then glon := -glon;
  glat := ilatdeg + ilatmin / 60.0 + ilatsec / 3600.0;
  if (combo_NS.ItemIndex > 0) then glat := -glat;
  { sidereal time }
  tsid := swe_sidtime(tjdut);
  tsid := tsid + glon / 15;
  armc := tsid * 15;
  outfld.Lines.Add(' ');
  Str(tsid:16:10, sjul);
  sout := 'Sid. time   ' + sjul;
  outfld.Lines.Add( sout);
  Str(armc:16:10, sjul);
  sout := 'ARMC        ' + sjul;
  outfld.Lines.Add( sout);
  { house method }
  i := combo_hsys.ItemIndex;
  if (i < 0) then i := 0;
  swe_houses_armc(armc, glat, eps_true, hsys[i], hcusps[0], ascmc[0]);
  Str(ascmc[0]:16:10, sjul);
  sout := 'ascendant   ' + sjul;
  outfld.Lines.Add( sout);
  Str(ascmc[1]:16:10, sjul);
  sout := 'MC          ' + sjul;
  outfld.Lines.Add( sout);
  Str(ascmc[3]:16:10, sjul);
  sout := 'vertex      ' + sjul;
  outfld.Lines.Add( sout);
  outfld.Lines.Add( '');
  for i := 1 to 12 do
    begin
      Str(i:2, sjul);
      sout := 'house ' + sjul + '    ';
      Str(hcusps[i]:16:10, sjul);
      sout := sout + sjul;
      outfld.Lines.Add( sout);
    end;

end;

procedure TForm1.button_exitClick(Sender: TObject);
begin
  swe_close;
  close;
  Exit;
end;

end.

El código es un galimatías. Debes ir con orden. Primero inicializaciza los ComboBox en funciones de inicio o en el Form.Create.
Luego darás funcionalidad a los botones...

Debes estudiar el uso de esa dll pues al parecer debes inicializar con una ruta que debe contener previamente algunos archivos y quizás requiera más acciones. Este punto es básico y piensa que probablemente ninguno de nosotros estamos familiarizados con esa dll, ese es tu cometido.

Cuando requieras preguntar alguna cosa concreta, trata de aislar en lo posible el código que te preocupa y que sea suficiente para entenderte pero no tán sobrecargado que se pierdan las ganas de leerlo.


Saludos.

Última edición por escafandra fecha: 20-02-2020 a las 22:19:05.
Responder Con Cita
  #3  
Antiguo 20-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ahora fíjate en este código:

Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DateUtils, swiss;
.............................



var
  i, iflag: integer;
  xx:       array[0..5] of double;
  planet:   array [1..12] of double;
  serr:     PChar;
  JulDay:   double;
begin
  swe_set_ephe_path(PCHAR('c:\sweph\ephe\'));
  JulDay:= DateTimeToJulianDate(Date);
  for i:= 1 to 12 do
  begin
    swe_calc_ut(Date, i, SE_ECL_NUT, xx[0], serr);
    planet[i]:= xx[0];
  end;
end;

El array es asignado correctamente, otra cosa es que los valores sean los experados.

Fíjate que arroja un error serr = 'SwissEph file 'seplm48.se1' not found in PATH 'c:\sweph\ephe\'' para todos los valores de i hasta para I=10.

Para i= 11 el error es 'SwissEph file 'semom48.se1' not found in PATH 'c:\sweph\ephe\'' y para i=12 no falla


Esto quiere decir que en ese path deben existir previamente esos archivos y probablemente alguno más.

Entonces la pregunta no es como rellenar un array, sino como manejar swedll32.dll para conseguir el array que esperamos.


Saludos.

Última edición por escafandra fecha: 20-02-2020 a las 23:55:10.
Responder Con Cita
  #4  
Antiguo 20-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Pero si lo usamos así:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i, iflag: integer;
  xx:       array[0..5] of double;
  planet:   array [1..12] of double;
  serr:     PChar;
  JulDay:   double;
begin
//  swe_set_ephe_path(PCHAR('c:\sweph\ephe\'));
  JulDay:= DateTimeToJulianDate(Date);
  iflag := 0;
  for i:= 1 to 12 do
  begin
    swe_calc(Date, i, iflag, xx[0], serr);
    planet[i]:= xx[0];
  end;
end;

Entonces no hay errores y los valores son:
Cita:
0
0
0
0
0
0
0
0
0
188,01570562548
0
200,800942459646
Ahora bien, no tengo ni idea si eso es lo que se espera para la fecha de hoy.



Saludos.
Responder Con Cita
  #5  
Antiguo 21-02-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 230
Poder: 16
compuin Va por buen camino
Hola Escafandra

Te anexo el archivo con el projecto completo (Puse el link ya que no me deja ponerlos adjuntos )


https://www.astro.com/ftp/swisseph/sweph.zip

La Dll hace los calculos, pero existen unos archivos .se1 que aunque arrojan error no son necesarios (Son para calculo de asteroides)

La variable xx[0] se espera que arroje la longitud o posicion planetaria del sol, luna, mercurio, venus, marte, jupiter, saturn, urano, neptuno y pluton

Son 10 planetas, asi que seria del 1 al 10
Responder Con Cita
  #6  
Antiguo 21-02-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 230
Poder: 16
compuin Va por buen camino
Para la fecha de hoy esto es lo que se espera

deltat: 69.5103960890 sec
jul. day: 2458900.50000000 UT

Sun 331.8094127618
Moon 302.2187037435
Mercury 341.5633697228
Venus 15.2722542439
Mars 273.1099711227
Jupiter 287.8282244089
Saturn 297.2549903731
Uranus 33.3602165722
Neptune 347.7743860929
Pluto 294.0205054947
mean Node 95.5387999697
true Node 97.1857573215

Sid. time 10.5957212216
ARMC 158.9358183233
ascendant 230.7646482310
MC 157.2282506635
vertex 92.2206035689

house 1 230.7646482310
house 2 261.2501400084
house 3 298.8634035392
house 4 337.2282506635
house 5 8.4105200249
house 6 32.0604837022
house 7 50.7646482310
house 8 81.2501400084
house 9 118.8634035392
house 10 157.2282506635
house 11 188.4105200249
house 12 212.0604837022
Responder Con Cita
  #7  
Antiguo 21-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ya, pero eso no es xx [0] que fue el origen de la pregunta y tampoco queda claro que son todos esos datos a no ser que seas entendido en la materia.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
LLenar Array con Query RaulA Conexión con bases de datos 2 22-11-2012 16:53:58
Array dentro de un Array Holger PHP 4 03-01-2012 17:27:44
Llenar un array donpedro Varios 5 12-08-2011 16:29:07
llenar array con consulta JULIOCTORRESG Varios 11 02-03-2007 15:13:04
Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo morfeo21 Varios 5 17-08-2004 17:39:51


La franja horaria es GMT +2. Ahora son las 00:15:31.


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
Copyright 1996-2007 Club Delphi