Hi All,
excuse me if I have included the code, but I really need help.
I have:
1) spa.c (coded in ANSI C) which compiled with mingw produces "spa.dll", and compiled with gcc produces a "libspa.so" under Linux.
2) myDelphi.dpr (a delphi project) uses "spa.dll" and works fine.
3) myFpc.pp (a FP project under windows) uses "spa.dll" and works fine.
4) myC.c (a C project under Linux) uses "libspa.so" and works fine.
5) myFpc.pp (a FP project under Linux -- same code as 3) uses "libspa.so" gives many troubles.

This is the C header file:

#ifndef __solar_position_algorithm_header
#define __solar_position_algorithm_header
//enumeration for function codes to select desired final outputs from SPA
enum {
   SPA_ZA,           //calculate zenith and azimuth
   SPA_ZA_INC,       //calculate zenith, azimuth, and incidence
SPA_ZA_RTS, //calculate zenith, azimuth, and sun rise/transit/set values
   SPA_ALL,          //calculate all SPA output values
};

typedef struct
{
   //----------------------INPUT VALUES------------------------

int year; // 4-digit year, valid range: -2000 to 6000, error code: 1 int month; // 2-digit month, valid range: 1 to 12, error code: 2 int day; // 2-digit day, valid range: 1 to 31, error code: 3 int hour; // Observer local hour, valid range: 0 to 24, error code: 4 int minute; // Observer local minute, valid range: 0 to 59, error code: 5 int second; // Observer local second, valid range: 0 to 59, error code: 6

float delta_t; // Difference between earth rotation time and terrestrial time
                        //     (from observation)
// valid range: -8000 to 8000 seconds, error code: 7

   float timezone;      // Observer time zone (negative west of Greenwich)
// valid range: -12 to 12 hours, error code: 8

   float longitude;     // Observer longitude (negative west of Greenwich)
// valid range: -180 to 180 degrees, error code: 9

   float latitude;      // Observer latitude (negative south of equator)
// valid range: -90 to 90 degrees, error code: 10

   float elevation;     // Observer elevation [meters]
// valid range: -6500000 or higher meters, error code: 11

   float pressure;      // Annual average local pressure [millibars]
// valid range: 0 to 5000 millibars, error code: 12

float temperature; // Annual average local temperature [degrees Celsius] // valid range: -273 to 6000 degrees Celsius, error code; 13

float slope; // Surface slope (measured from the horizontal plane)
                        // valid range: -360 to 360 degrees, error code: 14

float azm_rotation; // Surface azimuth rotation (measured from south to projection of // surface normal on horizontal plane, negative west)
                        // valid range: -360 to 360 degrees, error code: 15

float atmos_refract; // Atmospheric refraction at sunrise and sunset (0.5667 deg is typical)
                        // valid range: -10  to  10 degrees, error code: 16

int function; // Switch to choose functions for desired output (from enumeration)

   //-----------------Intermediate OUTPUT VALUES--------------------

   double jd;          //Julian day
   double jc;          //Julian century

   double jde;         //Julian ephemeris day
   double jce;         //Julian ephemeris century
   double jme;         //Julian ephemeris millennium

   double l;           //earth heliocentric longitude [degrees]
   double b;           //earth heliocentric latitude [degrees]
   double r;           //earth radius vector [Astronomical Units, AU]

   double theta;       //geocentric longitude [degrees]
   double beta;        //geocentric latitude [degrees]

   double x0;          //mean elongation (moon-sun) [degrees]
   double x1;          //mean anomaly (sun) [degrees]
   double x2;          //mean anomaly (moon) [degrees]
   double x3;          //argument latitude (moon) [degrees]
   double x4;          //ascending longitude (moon) [degrees]

   double del_psi;     //nutation longitude [degrees]
   double del_epsilon; //nutation obliquity [degrees]
   double epsilon0;    //ecliptic mean obliquity [arc seconds]
   double epsilon;     //ecliptic true obliquity  [degrees]

   double del_tau;     //aberration correction [degrees]
   double lamda;       //apparent sun longitude [degrees]
   double nu0;         //Greenwich mean sidereal time [degrees]
   double nu;          //Greenwich sidereal time [degrees]

   double alpha;       //geocentric sun right ascension [degrees]
   double delta;       //geocentric sun declination [degrees]

   double h;           //observer hour angle [degrees]
   double xi;          //sun equatorial horizontal parallax [degrees]
   double del_alpha;   //sun right ascension parallax [degrees]
   double delta_prime; //topocentric sun declination [degrees]
   double alpha_prime; //topocentric sun right ascension [degrees]
   double h_prime;     //topocentric local hour angle [degrees]

double e0; //topocentric elevation angle (uncorrected) [degrees]
   double del_e;       //atmospheric refraction correction [degrees]
   double e;           //topocentric elevation angle (corrected) [degrees]

   double eot;         //equation of time [minutes]
   double srha;        //sunrise hour angle [degrees]
   double ssha;        //sunset hour angle [degrees]
   double sta;         //sun transit altitude [degrees]

   //---------------------Final OUTPUT VALUES------------------------

   double zenith;      //topocentric zenith angle [degrees]
double azimuth180; //topocentric azimuth angle (westward from south) [-180 to 180 degrees] double azimuth; //topocentric azimuth angle (eastward from north) [ 0 to 360 degrees]
   double incidence;   //surface incidence angle [degrees]

double suntransit; //local sun transit time (or solar noon) [fractional hour] double sunrise; //local sunrise time (+/- 30 seconds) [fractional hour] double sunset; //local sunset time (+/- 30 seconds) [fractional hour]

} spa_data;

//Calculate SPA output values (in structure) based on input values passed in structure
int spa_calculate(spa_data *spa);
#endif

and this is the Pascal unit;
unit spaUnit;

interface
uses
 SysUtils;

type
//enumeration for function codes to select desired final outputs from SPA
 enum =(
   SPA_ZA,           //calculate zenith and azimuth
   SPA_ZA_INC,       //calculate zenith, azimuth, and incidence
SPA_ZA_RTS, //calculate zenith, azimuth, and sun rise/transit/set values
   SPA_ALL          //calculate all SPA output values
);

PSpaData = ^SpaData;
SpaData = record
   //----------------------INPUT VALUES------------------------

year: integer; // 4-digit year, valid range: -2000 to 6000, error code: 1 month: integer; // 2-digit month, valid range: 1 to 12, error code: 2 day: integer; // 2-digit day, valid range: 1 to 31, error code: 3 hour: integer; // Observer local hour, valid range: 0 to 24, error code: 4 minute: integer; // Observer local minute, valid range: 0 to 59, error code: 5 second: integer; // Observer local second, valid range: 0 to 59, error code: 6

delta_t: single; // Difference between earth rotation time and terrestrial time
                        //     (from observation)
// valid range: -8000 to 8000 seconds, error code: 7

timezone: single; // Observer time zone (negative west of Greenwich) // valid range: -12 to 12 hours, error code: 8

longitude: single; // Observer longitude (negative west of Greenwich) // valid range: -180 to 180 degrees, error code: 9

   latitude: single;      // Observer latitude (negative south of equator)
// valid range: -90 to 90 degrees, error code: 10

   elevation: single;     // Observer elevation [meters]
// valid range: -6500000 or higher meters, error code: 11

   pressure: single;      // Annual average local pressure [millibars]
// valid range: 0 to 5000 millibars, error code: 12

temperature: single; // Annual average local temperature [degrees Celsius] // valid range: -273 to 6000 degrees Celsius, error code; 13

slope: single; // Surface slope (measured from the horizontal plane)
                        // valid range: -360 to 360 degrees, error code: 14

azm_rotation: single; // Surface azimuth rotation (measured from south to projection of // surface normal on horizontal plane, negative west)
                        // valid range: -360 to 360 degrees, error code: 15

atmos_refract: single; // Atmospheric refraction at sunrise and sunset (0.5667 deg is typical)
                        // valid range: -10  to  10 degrees, error code: 16

AFunction: integer; // Switch to choose functions for desired output (from enumeration)

   //-----------------Intermediate OUTPUT VALUES--------------------

   jd: double;          //Julian day
   jc: double;          //Julian century

   jde: double;         //Julian ephemeris day
   jce: double;         //Julian ephemeris century
   jme: double;         //Julian ephemeris millennium

   l: double;           //earth heliocentric longitude [degrees]
   b: double;           //earth heliocentric latitude [degrees]
   r: double;           //earth radius vector [Astronomical Units, AU]

   theta: double;       //geocentric longitude [degrees]
   beta: double;        //geocentric latitude [degrees]

   x0: double;          //mean elongation (moon-sun) [degrees]
   x1: double;          //mean anomaly (sun) [degrees]
   x2: double;          //mean anomaly (moon) [degrees]
   x3: double;          //argument latitude (moon) [degrees]
   x4: double;          //ascending longitude (moon) [degrees]

   del_psi: double;     //nutation longitude [degrees]
   del_epsilon: double; //nutation obliquity [degrees]
   epsilon0: double;    //ecliptic mean obliquity [arc seconds]
   epsilon: double;     //ecliptic true obliquity  [degrees]

   del_tau: double;     //aberration correction [degrees]
   lamda: double;       //apparent sun longitude [degrees]
   nu0: double;         //Greenwich mean sidereal time [degrees]
   nu: double;          //Greenwich sidereal time [degrees]

   alpha: double;       //geocentric sun right ascension [degrees]
   delta: double;       //geocentric sun declination [degrees]

   h: double;           //observer hour angle [degrees]
   xi: double;          //sun equatorial horizontal parallax [degrees]
   del_alpha: double;   //sun right ascension parallax [degrees]
   delta_prime: double; //topocentric sun declination [degrees]
   alpha_prime: double; //topocentric sun right ascension [degrees]
   h_prime: double;     //topocentric local hour angle [degrees]

e0: double; //topocentric elevation angle (uncorrected) [degrees]
   del_e: double;       //atmospheric refraction correction [degrees]
   e: double;           //topocentric elevation angle (corrected) [degrees]

   eot: double;         //equation of time [minutes]
   srha: double;        //sunrise hour angle [degrees]
   ssha: double;        //sunset hour angle [degrees]
   sta: double;         //sun transit altitude [degrees]

   //---------------------Final OUTPUT VALUES------------------------

   zenith: double;      //topocentric zenith angle [degrees]
azimuth180: double; //topocentric azimuth angle (westward from south) [-180 to 180 degrees] azimuth: double; //topocentric azimuth angle (eastward from north) [ 0 to 360 degrees]
   incidence: double;   //surface incidence angle [degrees]

suntransit: double; //local sun transit time (or solar noon) [fractional hour] sunrise: double; //local sunrise time (+/- 30 seconds) [fractional hour] sunset: double; //local sunset time (+/- 30 seconds) [fractional hour]
end;

const
 spaDLL = 'spa.dll';

//Calculate SPA output values (in structure) based on input values passed in structure
function spa_calculate(PRec: PSpaData): integer; cdecl; external spaDLL;

implementation

end.

--
Jilani KHALDI
http://jkhaldi.oltrelinux.com

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to