DLL and SO with Free Pascal

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

DLL and SO with Free Pascal

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.

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

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: DLL and SO with Free Pascal

Jilani Khaldi

>
> const
>  spaDLL = 'spa.dll';

I mean here:
const
  spaDLL = 'libspa.so';

>
> //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

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

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: DLL and SO with Free Pascal

Michael Van Canneyt
In reply to this post by Jilani Khaldi


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  -  [hidden email]
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: DLL and SO with Free Pascal

Jilani Khaldi

>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

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

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: DLL and SO with Free Pascal

Michael Van Canneyt


On Sun, 9 Apr 2006, Jilani Khaldi wrote:

>
> > 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.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal