Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-10-2007
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
carga dinámica de una libreria en linux

En linux las librerías se pueden cargar en forma dinámica como las dll en windows, se denominan shared objects, de ahí la extensión .so.

Estube probando para ver como es el procedimiento, luego de sortear varios problemas cree una libería con freepascal 2.2.0 y construí una aplicación elemental en lazarus para probar la librería.

código de la librería:

Código Delphi [-]
library equ2n_raices;

uses
  Classes,Math
  { add your units here };

const
  SIN = 0;
  UNA = 1;
  DOS = 2;

function ResolverEq2nGrado(a, b, c : real; var x1, x2 : real) : Longint; cdecl; export;
  {
  Resolución de ecuaciones de 2do grado en los reales
  La función devuelve
  SIN si no hay solución
  UNA si sólo hay una solución
  DOS si hay dos soluciones
  }
var
  discr : real; // El discriminante
begin
    discr := b*b - 4*a*c;
    if discr < 0 then begin
       ResolverEq2nGrado := SIN;
    end
    else begin
    if discr = 0 then begin
       ResolverEq2nGrado := UNA;
       x1 := -b / (2*a);
       x2 := -b / (2*a); 
    end
    else {Sólo puede ser discr > 0} begin
       ResolverEq2nGrado := DOS;
       x1 := (-b + Sqrt( discr )) / (2*a);
       x2 := (-b - Sqrt( discr )) / (2*a);
    end;
end;

end;

exports ResolverEq2nGrado;

begin
end.

Esta libreria sirve para calcular las raices de una ecuación de segundo grado.

Para probar la librería el código en lazarus es el siguiente:

Código Delphi [-]
const
  SIN = 0;
  UNA = 1;
  DOS = 2;

type

 TResolverEq2nGrado = function(A1, A2, A3 : real; var A4, A5 : real) : Longint;cdecl;

  Function dlopen (name : pchar ;mode : longint ) : pointer; cdecl; external 'dl';
  Function dlsym( lib : pointer ; name : pchar ) : pointer; cdecl; external 'dl';
  Function dlclose (lib : pointer) : longint; cdecl; external'dl';

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
   ResolverEq2nGrado         : TResolverEq2nGrado;
   h                         : pointer;
   x1, x2, a, b, c           : real;
   fp1                   : textfile;
begin

  assignfile(fp1,'entrada.txt');
  reset(fp1);
  read(fp1,a);
  read(fp1,b);
  read(fp1,c);

      h := dlopen('libequ2n_raices.so',3);
      Pointer(ResolverEq2nGrado) := TResolverEq2nGrado(dlsym(h, 'ResolverEq2nGrado'));
      if h = nil then begin
          { function no found.. misspelled? }
           ShowMessage ('procedimiento no encontrado, ¿llamada erronea?');
      end
      else begin
         { call the function as usually }

        case ResolverEq2nGrado(a, b, c, x1, x2) of
          SIN : begin
          showmessage ('Esta ecuación no tiene solución real');
          writeln(fp2,'Esta ecuación no tiene solución real');
        end;
          UNA : begin
          showmessage('Una solución : ' + #13#10 + 'X =' + FloatToStr(x1));
        end;
          DOS : begin
          showmessage('Dos soluciones :'+#13#10+
          'X1 =' + floattostr(x1)+#13#10+
          'X2 =' + floattostr(x2));
        end;

      end;
    dlclose(h);
 end;
 closefile(fp1);
end;

Sólo he puesto la parte que interesa.

Copié la librería en /usr/lib usando sudo cp libequ2n_raices.so /usr/lib

Para poder usar el programa usé: sudo chmod 555 test y para ejecutarlo ./test

Da un error en la consola:

GTKWindowStateEventCB Form1:TForm1 new_window_state=0 changed_mask=1
GTKWindowStateEventCB Form1:TForm1 0 [RMVDStPr]
GTKWindowStateEventCB :TPromptDialog new_window_state=0 changed_mask=1
GTKWindowStateEventCB :TPromptDialog 0 [RMVDStPr]
At end of ExceptionAddresStack

Si alguien ha tenido un problema parecido tal vez lo podría aclarar.

Saludos
Responder Con Cita
  #2  
Antiguo 06-10-2007
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
Me olvidé de aclarar, anda bien hasta que uno hace click en el botón, se muestran los resultados y al hacer click otra vez en aceptar desaparece todo, el programa se cierra súbitamente.
Responder Con Cita
  #3  
Antiguo 06-10-2007
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.003
Poder: 26
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Probablemente el problema sea otro, pero creo que, ya que utilizas Free Pascal, deberías utilizar la librería dynlibs que, entre otras cosas, te hará la vida más fácil si algún día portas el programa a Windows o MacOS X entre otros.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Carga dinamica de una dll y Access violation zurech OOP 3 21-02-2011 13:33:14
instalacion de una distro linux. Sistema Operativo GNU/linux sakuragi La Taberna 0 31-07-2007 22:56:28
Carga el applet maribajar JAVA 2 22-06-2007 12:15:15
Como hacer un shares en un Servidos Linux para que otro Servidor Linux .... FernandoFAI Linux 0 15-04-2004 10:33:07
Asociación y Carga!!! craven Varios 3 17-09-2003 20:03:18


La franja horaria es GMT +2. Ahora son las 01:44:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi