Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2006-04

DLL and SO with Free Pascal

5 messages · 2 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Jilani Khaldi

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.

Reply by email

Jilani Khaldi
to Jilani Khaldi
const spaDLL = 'spa.dll';
I mean here:
const
  spaDLL = 'libspa.so';
Show quoted text 8 lines
//Calculate SPA output values (in structure) based on input values passed in structure function spa_calculate(PRec: PSpaData): integer; cdecl; external spaDLL; implementation end.

seen the problem exists only under Linux.

jk

Reply by email

Michael Van Canneyt
to Jilani Khaldi: excuse me if I have included the code, but I really need help. I have: 1) spa.c (coded in…
Jilani Khaldi wrote 10 lines
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.

Show quoted text 311 lines
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 - http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply by email

Jilani Khaldi
to Michael Van Canneyt
Show quoted text 8 lines
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}

Thank you very much Michael, you hint to add "{$packrecords C}" fixes the problem.
Just curious. I tried:
SpaData = packed record
...
end;

instead of:
SpaData = record
...
end;

But it doesn't solve the problem.

jk

Reply by email

Michael Van Canneyt
to Jilani Khaldi
Jilani Khaldi wrote 22 lines
> 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} > > Thank you very much Michael, you hint to add "{$packrecords C}" fixes the problem. Just curious. I tried: SpaData = packed record ... end; instead of: SpaData = record ... end; But it doesn't solve the problem.

No, because C doesn't use the 'packed record'. It uses a special alignment algorithm, which is imitated by $PACKRECORDS C

Michael.

Reply by email