Página 1 de 1
Preferência de bibliotecas
Enviado: 26 Jul 2007 13:14
por pringles
Pessoal, me surgiu uma situação interessante: utilizo Clipper 5.2 e Blinker. Em meu sistema para emissão de cupom fiscal (cuja impressora fiscal utilizada é da Bematech) utilizo duas bibliotecas: PTOOL52 e BEMAFI, sendo esta última a biblioteca da Bematech.
Em ambas as bibliotecas, existe a função FILESIZE, com o mesmo nome, mas com parâmetros e retornos diferentes. O problema é que: ao utilizar esta função, preciso utilizá-la na biblioteca BEMAFI, e o compilador utiliza a função da biblioteca PTOOL52, já que as duas bibliotecas estão incluídas no código e são utilizadas pelo mesmo.
Existe algum modo pra que eu possa alterar essa ordem de preferência, de forma a deixar a BEMAFI em "primeiro plano", ou seja, quando as funções tiverem o mesmo nome dar preferência para a função da BEMAFI, ao invés do contrário?
Enviado: 26 Jul 2007 13:18
por Maligno
A preferência se dará pela ordem em que as bibliotecas forem informadas. Se informar a BEMAFI primeiro, o símbolo pendente (FILESIZE) a ela será vinculado.
Mas, em vista dos nomes sugerirem funções exatamente iguais, que diferença faz se a função vier de uma ou outra? Algum parâmetro extra?
Enviado: 26 Jul 2007 13:25
por pringles
Maligno, obrigado pela dica, vou testar e depois posto o resultado.
Na verdade, as sintaxes são diferentes com relação aos parâmetros utilizados: a BEMAFI me fornece a função de que eu preciso; já a PTOOL52 fornece outra função com o mesmo nome, mas parâmetros diferentes dos que eu preciso.
Enviado: 26 Jul 2007 13:31
por Maligno
pringles escreveu:a PTOOL52 fornece outra função com o mesmo nome, mas parâmetros diferentes dos que eu preciso.
Foi o que imaginei. Apesar de que não há muito o que ser diferente numa função desse tipo.

Enviado: 26 Jul 2007 14:47
por Pablo César
Caro Pringles,
Existe uma forma de excluir a função de uma biblioteca, utilizando o LIBRA.EXE (creio que outras também o fazem). Para esse caso de funções em duplicidade e você queira obtar apena por uma ou outra, bastaria excluir a que função da biblioteca que você não quer.
Enviado: 26 Jul 2007 15:19
por pringles
Entendi, mas já consegui resolver o problema.
Na verdade, mesmo acertando a ordem das bibliotecas, ocorria o mesmo problema. O que eu fiz foi alterar alguns parâmetros dentro da função de forma a deixá-las com sintaxe diferente. Assim, não ocorre conflito.
Mesmo assim vou testar este comando para excluir função, obrigado pelas dicas.
Enviado: 26 Jul 2007 15:50
por Maligno
pringles escreveu:Na verdade, mesmo acertando a ordem das bibliotecas, ocorria o mesmo problema.
Não funcionou? Já me ocorreu o mesmo tipo de problema e resolvi alterando a ordem das LIBs.
Enviado: 26 Jul 2007 18:25
por pringles
Será que não deu certo por se tratar da BEMAFI, que é uma biblioteca um pouco diferente das mais comumente utilizadas?
Enviado: 26 Jul 2007 18:31
por Maligno
Quando o linker encontra uma referência a um símbolo, ele pesquisa na primeira LIB que aparecer. Se encontrar este símbolo, morreu. A pendência foi resolvida. Se existir numa outra biblioteca, não fará a menor diferença. Ele não está mais procurando por esse nome.
Inclusive, daí vêm alguns problemas quando criamos uma função com um nome coincidente com o de um símbolo numa LIB qualquer. A coisa não funciona e você não sabe por quê. Depois é que você descobre que criou um nome que já existia. Às vezes isso dá uma mão-de-obra lascada.
Situação um pouco pior: um símbolo (variável ou função) reside num módulo. Este módulo pode conter vários símbolos. Um deles tem nome coincidente com uma função que reside em outra LIB, em outro módulo. Cada módulo tem símbolos essenciais para o programa. Não tem como separar. Se consertar de um lado, estraga do outro.
Enviado: 26 Jul 2007 18:54
por Maligno
Apenas uma curiosidade: situações como essa são facilmente resolvíveis em linguagens mais modernas através de uma técnica chamada de name mangling, que não usa para o símbolos exatamente os nomes que lhes damos. Alguma informação extra é adicionada ao nome. Aliás, o nome correto da técnica, mas não tão usual, é [n]name-decorating[/i]. Mas daí não existe conflito algum e esse tipo de problema não acontece. Nem poderia, pois existem linguagens OOP que dispõem da característica de function overloading, onde podem ser definidas várias funções diferentes com o mesmo nome.
O único senão é que cada empresa tem uma técnica própria para name mangling. Mas este problema deixa de existir se o programa for compilado pelo mesmo compilador que criou a biblioteca ou se for utilizado algum tipo de "tradutor", por vezes como uma diretiva de pré-processamento. Em alguns casos, aliás, é necessário um switch para o unmangling de uma porção de código que não usa a técnica.
Enviado: 26 Jul 2007 19:00
por pringles
Realmente interessante....
Vou fazer o seguinte: vou revisar o meu código e posto depois o que pode ter ocorrido.
Enviado: 26 Jul 2007 19:43
por Pablo César
Pringles, você tentou com a minha indicação de deletar a função da LIB ?
A função FILESIZE é utilizado pela BEMAFI ?. Seria o mais indicado então deletar o FILESIZE da PTOOL52 ?
O FILESIZE da PTOOL52, você utiliza no seu sistema em alguma ocasião ?. Se for daria para substituir tranquilamenter por outra função ora feita por ti mesmo.
Enviado: 26 Jul 2007 20:09
por pringles
Pablo César escreveu:Pringles, você tentou com a minha indicação de deletar a função da LIB ?
Como já consegui resolver o problema pelos parâmetros informados, ainda não fiz o teste.
Pablo César escreveu:A função FILESIZE é utilizado pela BEMAFI ?. Seria o mais indicado então deletar o FILESIZE da PTOOL52 ?
O FILESIZE da PTOOL52, você utiliza no seu sistema em alguma ocasião ?. Se for daria para substituir tranquilamenter por outra função ora feita por ti mesmo.
Não utilizo em outras ocasiões o FILESIZE da PTOOL52, mas se tivesse meio de deixá-lo disponível para alguma situação futura eu preferiria. Por isso ainda não testei este método, mas vou testá-lo o quanto antes.
Mesmo assim, obrigado Pablo e Maligno, vou dar uma olhada melhor e fazer mais alguns testes e posto no fórum depois.