[fpc-pascal] DLL and SO with Free Pascal
Michael Van Canneyt
michael at freepascal.org
Sun Apr 9 15:22:22 CEST 2006
On Sun, 9 Apr 2006, Jilani Khaldi wrote:
> 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.
It would be helpful if you could tell what exactly the problem is.
But from first glance, you need at least to add {$mode objfpc} or {$mode delphi}
so integer is 32-bit instead of 16 bit. Secondly, normally you should
add a
{$packrecords C}
directive to ensure record alignment compatible with C.
Michael.
>
> 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 at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
More information about the fpc-pascal
mailing list