HOWTO - Como utilizar o compilador LCC-Win32 para compilar uma biblioteca
        externa para o programa Maple^(R).

        Ricardo Y. Maeda - rymaeda@yahoo.com (10/09/2002)
        
        Esclarecimentos, correcoes, perguntas e luzes sao bem vindas!

-----------------------------------------------------------------------------

Seguindo o Principio KISS (Keep it simple stupid):
Apesar de o compilador LCC-Win32 possuir um ambiente de desenvolvimento,
preferi descrever o processo de criacao de uma biblioteca chamando os
executaveis pela linha de comando.

-----------------------------------------------------------------------------

Com a funcao em C dada como exemplo na pagina de ajuda da funcao do Maple
'define_external', criamos o arquivo 'edrlib.c':


/*  Inicio *************** EDRLIB.C *************************************/
#include <windows.h>

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
     return TRUE ;
}

_stdcall void mat_mult( double *A, double *B, double *C, int I, int J, int K )
{
     int i, j, k;
     double t;
     //MessageBox(NULL,"","",MB_OK);
     for( i = 0; i < I; ++i )
         for( k = 0; k < K; ++k ) {
             t = 0.0;
             for( j = 0; j < J; ++j )
             t += A[i*J+j] * B[j*K+k];
             C[i*K+k] = t;
         }
}
/*  Fim ****************** EDRLIB.C *************************************/



Repare o qualificador '_stdcall' antecede a definicao da funcao
'void mat_mult()'.

Compilamos com o comando:
lcc edrlib.c -O

A opcao '-O' instrui o compilador para realizar otimizacoes.

Criamos o arquivo texto 'edrlib.def' para informar quais as funcoes
exportaveis de 'edrlib.dll' que iremos criar, cujo conteudo e':

; Inicio ****************** EDRLIB.DEF ***********************************
EXPORTS
mat_mult
; Fim ********************* EDRLIB.DEF ***********************************

Agora podemos criar 'edrlib.dll' com o comando:
lcclnk -DLL -s edrlib.obj edrlib.def

A opcao '-s' suprime informacoes de 'debuging'.

Pronto, se nada errado ocorreu, o arquivo 'edrlib.dll' foi criado, para
utiliza-lo e' necessario que ele esteja no 'path' do Windows ou no mesmo
diretorio do Maple.

Para testar a funcao 'mat_mult()' podemos recorrer ao exemplo dado na ajuda
da funcao Maple 'define_external', mas note-se que algumas alteracoes tiveram
de ser feitas nas definicoes das matrizes 'A', 'B' e 'C', ao inves de ser
'C_order' temos de definir como 'Fortran_order':

mat_mult :=
> define_external('mat_mult',
> a::ARRAY(1..i,1..j,float[8]),
> b::ARRAY(1..j,1..k,float[8]),
> c::REF(ARRAY(1..i,1..k,float[8]),RETURN_ONLY),
> i::integer[4],
> j::integer[4],
> k::integer[4],
> LIB="EdrLib.dll"):
> A := Matrix(100,100,(i,j)->i/j,datatype=float[8],order=Fortran_order):
> B := Matrix(100,100,(i,j)->i*j,datatype=float[8],order=Fortran_order):
> C := Matrix(100,100,(i,j)->i*j,datatype=float[8],order=Fortran_order):
> C[4,5];C[5,4];C[100,100];

                                 20.


                                 20.


                                10000.

> mat_mult(A,B,C,100,100,100):
> C[4,5];C[5,4];C[100,100];

                               270680.


                         422937.500000000000


                               338350.

>


-----------------------------------------------------------------------------
