<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif">​Hola amigos.<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Estoy intentando utilizar una biblioteca escrita en C. La declaración que funciona en Delphi de la función que voy a utilizar es la siguiente:<br>_________________________________________________________<br>​function swe_calc_Win( <br>                 tjd    : double;    {Julian day number}<br>                 ipl         : Integer;   {planet number}<br>                 iflag       : Longint;   {flag bits}<br>                 var xx      : double;    {first of 6 doubles}<br>                 sErr        : PChar      {Error-String}<br>): Longint; stdcall; far; external 'swedll32.dll' name '_swe_calc@24';</div><div class="gmail_default" style="font-family:verdana,sans-serif">​_________________________________________________________<br>​​</div><div class="gmail_default" style="font-family:verdana,sans-serif">​Ahora estoy escribiendo con Lazarus un programa que funcione en Windows y en Linux de la siguiente manera:<br>_________________________________________________________<br><pre dir="ltr" class=""><pre class=""><span class="">uses</span> <span class="">...</span><span class="">dynlibs</span><span class="">...</span><br>(...)<br></pre></pre>type<br>  swe_calc = function(tjd    : double;    {Julian day number}<br>                 ipl         : Integer;   {planet number}<br>                 iflag       : Longint;   {flag bits}<br>                 var xx      : double;    {first of 6 doubles}<br>                 sErr        : PChar      {Error-String}<br>): Longint; stdcall; <br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">var  <br>  astro_Handle:TLibHandle=dynlibs.NilHandle;<br>  swCalc: swe_calc;<br>  FuncResult: longint;<br>  xx : array [0..6] of double;<br>  err: PChar;        <br></div><div class="gmail_default" style="font-family:verdana,sans-serif">​  (...)<br><br>​  {$IFDEF Windows}<br>    astro_Handle := LoadLibrary('swedll32.dll');<br>  {$ELSE}<br>    astro_Handle := LoadLibrary('libswe.so');<br>  {$ENDIF}   <br></div><div class="gmail_default" style="font-family:verdana,sans-serif">   ​swCalc := swe_calc(GetProcedureAddress(astro_Handle, 'swe_calc'));// '_swe_calc@24'));<br>  FuncResult:= swCalc(julday,0,SEFLG_MOSEPH,xx[0],err);  // *** ERROR<br>__________________________________________________________    ​</div><div class="gmail_default" style="font-family:verdana,sans-serif">​Cuando llamo a la función me da el siguiente error:<br>"El proyecto syrius ha lanzado una excepción de la clase 'External: SIGSEGV'."<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Mirando el ensamblador aparece:<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">"00000000 ??????" <br>Es decir; que al parecer el error lo da la biblioteca en C.<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Las posibilidades sobre lo que he hecho mal que se me ocurren son:<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">1) ¿Habré declarado mal xx?<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">2) ¿Tendré que recompilar 'libswe.so' para esta distro de Linux en concreto?<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Agradezco vuestra ayuda :-)<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">​</div><br></div>