usar funções em C dentro do objeto DLL

olá a todos... boa tarde! Estou tentando aprender como usar uma DLL, via "dyn.load" e ".C" dentro do R. Fiz uns testes (abaixo tem um pedaço do que tentei) e não consegui entender como fazer isso. Se alguém puder dar uma dica de como fazer essa manipulação, seria de muita ajuda! E agradeço desde já por qualquer dica. Obrigado! Cleber ### No pdf explicando o SDK, tem detalhe da função: FDwfGetVersion(char szVersion[32]) Description: Retrieves the version string. The version string is composed of major, minor, and build numbers (i.e., “2.0.19”). ############################################################## ### No R, eu tentei:
dwf <- dyn.load("C:\\Program Files (x86)\\Digilent\\WaveForms3\\dwf") is.loaded("FDwfGetVersion") [1] TRUE result <- .C("FDwfGetVersion", ver=as.character() ) str(result) List of 1 $ ver: chr(0)
################################# Mas em Python, vi que o resultado é o seguinte ( exemplos em Python são disponibilizados pelo fabricante) #################################
from ctypes import * dwf = cdll.dwf version = create_string_buffer(16) dwf.FDwfGetVersion(version) 1 print("DWF Version: "+str(version.value)) DWF Version: 3.8.22
--- Este email foi escaneado pelo Avast antivírus. https://www.avast.com/antivirus

Se a lógica de chamar uma função C se mantém com a API do R que vc está usando, necessitar-se-ia que na chamada a FDwfGetVersion você passasse uma posição de memória para a função preencher a cadeia (a.k.a. *ponteiro* para memória no jargão C). O que a documentação da biblioteca R para ligação com o C diz a esse respeito? On Sun, Nov 18, 2018 at 3:53 PM Cleber N.Borges por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
olá a todos... boa tarde!
Estou tentando aprender como usar uma DLL, via "dyn.load" e ".C" dentro do R.
Fiz uns testes (abaixo tem um pedaço do que tentei) e não consegui entender como fazer isso.
Se alguém puder dar uma dica de como fazer essa manipulação, seria de muita ajuda!
E agradeço desde já por qualquer dica.
Obrigado!
Cleber
###
No pdf explicando o SDK, tem detalhe da função: FDwfGetVersion(char szVersion[32]) Description: Retrieves the version string. The version string is composed of major, minor, and build numbers (i.e., “2.0.19”).
##############################################################
### No R, eu tentei:
dwf <- dyn.load("C:\\Program Files (x86)\\Digilent\\WaveForms3\\dwf") is.loaded("FDwfGetVersion") [1] TRUE result <- .C("FDwfGetVersion", ver=as.character() ) str(result) List of 1 $ ver: chr(0)
#################################
Mas em Python, vi que o resultado é o seguinte ( exemplos em Python são disponibilizados pelo fabricante)
#################################
from ctypes import * dwf = cdll.dwf version = create_string_buffer(16) dwf.FDwfGetVersion(version) 1 print("DWF Version: "+str(version.value)) DWF Version: 3.8.22
------------------------------ [image: Avast logo] <https://www.avast.com/antivirus>
Este email foi escaneado pelo Avast antivírus. www.avast.com <https://www.avast.com/antivirus>
<#m_-2461537844725911222_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Olá Cesar, Obrigado pelo comentário... Não há uma biblioteca para essa ligação. É justo a ligação que pretendia construir. Até onde entendi a ligação se daria pelo uso dessa função do R: ".C" para manuseio das funções dentro da dll. Mas de fato, imagino que a função esteja escrevendo o valor da variável (no caso uma string) mas que eu não entendi como fazer esse parâmetro ser transportado para o R (tal como foi feito no exemplo em Python). O help da função .C diz: ###### .C(.NAME, ..., NAOK = FALSE, DUP = TRUE, PACKAGE, ENCODING) onde: |.NAME| = a character string giving the name of a C function ... = arguments to be passed to the foreign function. ###### Por isso tentei: > result <- .C("FDwfGetVersion", ver=as.character() ) na esperança de que a string em C fosse "magicamente" repassada para a variável "ver", em R. Mas não deu certo! :-( Ainda não consegui achar nenhum exemplo na internet para elucidar esse meu probleminha! Obrigado pela atenção Cleber Borges Em 19/11/2018 20:16, Cesar Rabak por (R-br) escreveu:
Se a lógica de chamar uma função C se mantém com a API do R que vc está usando, necessitar-se-ia que na chamada a FDwfGetVersion você passasse uma posição de memória para a função preencher a cadeia (a.k.a. /ponteiro/ para memória no jargão C).
O que a documentação da biblioteca R para ligação com o C diz a esse respeito?
On Sun, Nov 18, 2018 at 3:53 PM Cleber N.Borges por (R-br) <r-br@listas.c3sl.ufpr.br <mailto:r-br@listas.c3sl.ufpr.br>> wrote:
olá a todos... boa tarde!
Estou tentando aprender como usar uma DLL, via "dyn.load" e ".C" dentro do R.
Fiz uns testes (abaixo tem um pedaço do que tentei) e não consegui entender como fazer isso.
Se alguém puder dar uma dica de como fazer essa manipulação, seria de muita ajuda!
E agradeço desde já por qualquer dica.
Obrigado!
Cleber
###
No pdf explicando o SDK, tem detalhe da função:
FDwfGetVersion(char szVersion[32]) Description: Retrieves the version string. The version string is composed of major, minor, and build numbers (i.e., “2.0.19”).
##############################################################
### No R, eu tentei:
> dwf <- dyn.load("C:\\Program Files (x86)\\Digilent\\WaveForms3\\dwf") > is.loaded("FDwfGetVersion") [1] TRUE > result <- .C("FDwfGetVersion", ver=as.character() ) > str(result) List of 1 $ ver: chr(0) >
#################################
Mas em Python, vi que o resultado é o seguinte ( exemplos em Python são disponibilizados pelo fabricante)
#################################
>>> from ctypes import * >>> dwf = cdll.dwf >>> version = create_string_buffer(16) >>> dwf.FDwfGetVersion(version) 1 >>> print("DWF Version: "+str(version.value)) DWF Version: 3.8.22 >>>
--- Este email foi escaneado pelo Avast antivírus. https://www.avast.com/antivirus

Caros colegas do R!!! Venho desenvolvendo um projeto com dados de colar GPS de onças-pintadas com seleção de habitat no Pantanal. Gostaria de saber se algum de vocês possuem conhecimento sobre o package AdehabitatHS e AdehabitatLT ??? Aluno do 7° semestre de Ciências Biológicas-UNEMAT Em Seg, 19 de nov de 2018 21:02, Cleber N.Borges por (R-br) < r-br@listas.c3sl.ufpr.br escreveu:
Olá Cesar, Obrigado pelo comentário... Não há uma biblioteca para essa ligação. É justo a ligação que pretendia construir. Até onde entendi a ligação se daria pelo uso dessa função do R: ".C" para manuseio das funções dentro da dll. Mas de fato, imagino que a função esteja escrevendo o valor da variável (no caso uma string) mas que eu não entendi como fazer esse parâmetro ser transportado para o R (tal como foi feito no exemplo em Python). O help da função .C diz: ######
.C(.NAME, ..., NAOK = FALSE, DUP = TRUE, PACKAGE, ENCODING) onde:.NAME = a character string giving the name of a C function ... = arguments to be passed to the foreign function.
###### Por isso tentei: > result <- .C("FDwfGetVersion", ver=as.character() ) na esperança de que a string em C fosse "magicamente" repassada para a variável "ver", em R.
Mas não deu certo! :-( Ainda não consegui achar nenhum exemplo na internet para elucidar esse meu probleminha! Obrigado pela atenção Cleber Borges
Em 19/11/2018 20:16, Cesar Rabak por (R-br) escreveu:
Se a lógica de chamar uma função C se mantém com a API do R que vc está usando, necessitar-se-ia que na chamada a FDwfGetVersion você passasse uma posição de memória para a função preencher a cadeia (a.k.a. *ponteiro* para memória no jargão C).
O que a documentação da biblioteca R para ligação com o C diz a esse respeito?
On Sun, Nov 18, 2018 at 3:53 PM Cleber N.Borges por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
olá a todos... boa tarde!
Estou tentando aprender como usar uma DLL, via "dyn.load" e ".C" dentro do R.
Fiz uns testes (abaixo tem um pedaço do que tentei) e não consegui entender como fazer isso.
Se alguém puder dar uma dica de como fazer essa manipulação, seria de muita ajuda!
E agradeço desde já por qualquer dica.
Obrigado!
Cleber
###
No pdf explicando o SDK, tem detalhe da função: FDwfGetVersion(char szVersion[32]) Description: Retrieves the version string. The version string is composed of major, minor, and build numbers (i.e., “2.0.19”).
##############################################################
### No R, eu tentei:
dwf <- dyn.load("C:\\Program Files (x86)\\Digilent\\WaveForms3\\dwf") is.loaded("FDwfGetVersion") [1] TRUE result <- .C("FDwfGetVersion", ver=as.character() ) str(result) List of 1 $ ver: chr(0)
#################################
Mas em Python, vi que o resultado é o seguinte ( exemplos em Python são disponibilizados pelo fabricante)
#################################
from ctypes import * dwf = cdll.dwf version = create_string_buffer(16) dwf.FDwfGetVersion(version) 1 print("DWF Version: "+str(version.value)) DWF Version: 3.8.22
------------------------------ [image: Avast logo] <https://www.avast.com/antivirus>
Este email foi escaneado pelo Avast antivírus. www.avast.com <https://www.avast.com/antivirus>
<#m_4528161704605027063_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Boa noite Cleber Não seria um problema de compilação do dwf antes do dyn.load()? Vejo que está em uma máquina Windows. Tem algum compilador cc you gcc instalado? Eu não trabalho com Windows, mas talvez possa ser isso. Daniel
On 18 Nov 2018, at 15:53, Cleber N.Borges por (R-br) <r-br@listas.c3sl.ufpr.br> wrote:
dwf

Olá Daniel e demais Bom dia O software (dll) é gratuito mas não é open-source portanto não tenho as fontes para compilar! Um detalhe no arquivo "dwf.h" tem a seguinte declaração: *// Error and version APIs:* DWFAPI BOOL FDwfGetLastError(DWFERC *pdwferc); DWFAPI BOOL FDwfGetLastErrorMsg(char szError[512]); *DWFAPI BOOL FDwfGetVersion(char szVersion[32]); // Returns DLL version, for instance: "3.8.5"* Imaginei que deveria como retornar uma variável lógica e modificar a variável szVersion. Meu chute é correto? Obrigado pelo comentário. Cleber Borges Em 19/11/2018 23:18, Daniel Guimarães Tiezzi escreveu:
Boa noite Cleber
Não seria um problema de compilação do dwf antes do dyn.load()? Vejo que está em uma máquina Windows. Tem algum compilador cc you gcc instalado? Eu não trabalho com Windows, mas talvez possa ser isso.
Daniel
--- Este email foi escaneado pelo Avast antivírus. https://www.avast.com/antivirus

Cleber, Seu raciocínio no C está correto com o *proviso* que cadeia szVersion tem que estar pré-alocada antes da chamada à função FDwfGetVersion da API do Windows. Veja na página 7 do manual do SDK que você está usando a documentação para a função em questão diz: <quote> FDwfGetVersion(char szVersion[32]) Parameters: - szVersion - Pointer to buffer to receive version string. The function above is used to retrieve the version string. The version string is composed of major, minor, and build numbers (i.e., “2.0.19”). </quote> Você precisa ver na documentação do R como se aloca a cadeia de caracteres C compatível *no R* para poder passar o ponteiro para a chamada à função. HTH -- Cesar Rabak On Tue, Nov 20, 2018 at 8:07 AM Cleber N.Borges por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
Olá Daniel e demais Bom dia O software (dll) é gratuito mas não é open-source portanto não tenho as fontes para compilar!
Um detalhe no arquivo "dwf.h" tem a seguinte declaração: *// Error and version APIs:* DWFAPI BOOL FDwfGetLastError(DWFERC *pdwferc); DWFAPI BOOL FDwfGetLastErrorMsg(char szError[512]); *DWFAPI BOOL FDwfGetVersion(char szVersion[32]); // Returns DLL version, for instance: "3.8.5"*
Imaginei que deveria como retornar uma variável lógica e modificar a variável szVersion. Meu chute é correto?
Obrigado pelo comentário. Cleber Borges
Em 19/11/2018 23:18, Daniel Guimarães Tiezzi escreveu:
Boa noite Cleber
Não seria um problema de compilação do dwf antes do dyn.load()? Vejo que está em uma máquina Windows. Tem algum compilador cc you gcc instalado? Eu não trabalho com Windows, mas talvez possa ser isso.
Daniel
------------------------------ [image: Avast logo] <https://www.avast.com/antivirus>
Este email foi escaneado pelo Avast antivírus. www.avast.com <https://www.avast.com/antivirus>
<#m_-3904356728291830613_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Olá Cesar e demais Obrigado pelo comentário. Lendo mais sobre esse modo de integrar C com R, vi que é pré-requisito compilar o código C com a lib Rinternals.h ... Porém eu não tenho como ter acesso ao codigo fonte e somente a dll pronta. Imagino que a fonte do problema desse ser esse limitante. Daí parei de tentar. Mas obrigado pelo comentário de todo modo! Att., Cleber Borges Em 26/11/2018 15:52, Cesar Rabak escreveu:
Cleber,
Seu raciocínio no C está correto com o /proviso/ que cadeia szVersion tem que estar pré-alocada antes da chamada à função **FDwfGetVersion da API do Windows.
Veja na página 7 do manual do SDK que você está usando a documentação para a função em questão diz:
<quote> FDwfGetVersion(char szVersion[32]) Parameters: - szVersion - Pointer to buffer to receive version string.
The function above is used to retrieve the version string. The version string is composed of major, minor, and build numbers (i.e., “2.0.19”). </quote>
Você precisa ver na documentação do R como se aloca a cadeia de caracteres C compatível *no R* para poder passar o ponteiro para a chamada à função.
HTH -- Cesar Rabak
On Tue, Nov 20, 2018 at 8:07 AM Cleber N.Borges por (R-br) <r-br@listas.c3sl.ufpr.br <mailto:r-br@listas.c3sl.ufpr.br>> wrote:
Olá Daniel e demais Bom dia O software (dll) é gratuito mas não é open-source portanto não tenho as fontes para compilar!
Um detalhe no arquivo "dwf.h" tem a seguinte declaração: *// Error and version APIs:* DWFAPI BOOL FDwfGetLastError(DWFERC *pdwferc); DWFAPI BOOL FDwfGetLastErrorMsg(char szError[512]); *DWFAPI BOOL FDwfGetVersion(char szVersion[32]); // Returns DLL version, for instance: "3.8.5"*
Imaginei que deveria como retornar uma variável lógica e modificar a variável szVersion. Meu chute é correto?
Obrigado pelo comentário. Cleber Borges
Em 19/11/2018 23:18, Daniel Guimarães Tiezzi escreveu:
Boa noite Cleber
Não seria um problema de compilação do dwf antes do dyn.load()? Vejo que está em uma máquina Windows. Tem algum compilador cc you gcc instalado? Eu não trabalho com Windows, mas talvez possa ser isso.
Daniel
------------------------------------------------------------------------ Avast logo <https://www.avast.com/antivirus>
Este email foi escaneado pelo Avast antivírus. www.avast.com <https://www.avast.com/antivirus>
<#m_-3904356728291830613_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Cleber, Talvez dê pra você fazer uma outra dll em C que encapsula essa e adiciona as bibliotecas que você precisa. Att, Rodrigo On Mon, Nov 26, 2018 at 4:54 PM Cleber Borges por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
Olá Cesar e demais
Obrigado pelo comentário.
Lendo mais sobre esse modo de integrar C com R, vi que é pré-requisito compilar o código C com a lib Rinternals.h ...
Porém eu não tenho como ter acesso ao codigo fonte e somente a dll pronta. Imagino que a fonte do problema desse ser esse limitante.
Daí parei de tentar.
Mas obrigado pelo comentário de todo modo!
Att.,
Cleber Borges
Em 26/11/2018 15:52, Cesar Rabak escreveu:
Cleber,
Seu raciocínio no C está correto com o *proviso* que cadeia szVersion tem que estar pré-alocada antes da chamada à função FDwfGetVersion da API do Windows.
Veja na página 7 do manual do SDK que você está usando a documentação para a função em questão diz:
<quote> FDwfGetVersion(char szVersion[32]) Parameters: - szVersion - Pointer to buffer to receive version string.
The function above is used to retrieve the version string. The version string is composed of major, minor, and build numbers (i.e., “2.0.19”). </quote>
Você precisa ver na documentação do R como se aloca a cadeia de caracteres C compatível *no R* para poder passar o ponteiro para a chamada à função.
HTH -- Cesar Rabak
On Tue, Nov 20, 2018 at 8:07 AM Cleber N.Borges por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
Olá Daniel e demais Bom dia O software (dll) é gratuito mas não é open-source portanto não tenho as fontes para compilar!
Um detalhe no arquivo "dwf.h" tem a seguinte declaração: *// Error and version APIs:* DWFAPI BOOL FDwfGetLastError(DWFERC *pdwferc); DWFAPI BOOL FDwfGetLastErrorMsg(char szError[512]); *DWFAPI BOOL FDwfGetVersion(char szVersion[32]); // Returns DLL version, for instance: "3.8.5"*
Imaginei que deveria como retornar uma variável lógica e modificar a variável szVersion. Meu chute é correto?
Obrigado pelo comentário. Cleber Borges
Em 19/11/2018 23:18, Daniel Guimarães Tiezzi escreveu:
Boa noite Cleber
Não seria um problema de compilação do dwf antes do dyn.load()? Vejo que está em uma máquina Windows. Tem algum compilador cc you gcc instalado? Eu não trabalho com Windows, mas talvez possa ser isso.
Daniel
------------------------------ [image: Avast logo] <https://www.avast.com/antivirus>
Este email foi escaneado pelo Avast antivírus. www.avast.com <https://www.avast.com/antivirus>
<#m_7619292552036792796_m_-3904356728291830613_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Concordo que possa ser uma saída. On Mon, Nov 26, 2018 at 5:08 PM Rodrigo Ângelo <drigo.angelo@gmail.com> wrote:
Cleber,
Talvez dê pra você fazer uma outra dll em C que encapsula essa e adiciona as bibliotecas que você precisa.
Att, Rodrigo
On Mon, Nov 26, 2018 at 4:54 PM Cleber Borges por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
Olá Cesar e demais
Obrigado pelo comentário.
Lendo mais sobre esse modo de integrar C com R, vi que é pré-requisito compilar o código C com a lib Rinternals.h ...
Porém eu não tenho como ter acesso ao codigo fonte e somente a dll pronta. Imagino que a fonte do problema desse ser esse limitante.
Daí parei de tentar.
Mas obrigado pelo comentário de todo modo!
Att.,
Cleber Borges
Em 26/11/2018 15:52, Cesar Rabak escreveu:
Cleber,
Seu raciocínio no C está correto com o *proviso* que cadeia szVersion tem que estar pré-alocada antes da chamada à função FDwfGetVersion da API do Windows.
Veja na página 7 do manual do SDK que você está usando a documentação para a função em questão diz:
<quote> FDwfGetVersion(char szVersion[32]) Parameters: - szVersion - Pointer to buffer to receive version string.
The function above is used to retrieve the version string. The version string is composed of major, minor, and build numbers (i.e., “2.0.19”). </quote>
Você precisa ver na documentação do R como se aloca a cadeia de caracteres C compatível *no R* para poder passar o ponteiro para a chamada à função.
HTH -- Cesar Rabak
On Tue, Nov 20, 2018 at 8:07 AM Cleber N.Borges por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
Olá Daniel e demais Bom dia O software (dll) é gratuito mas não é open-source portanto não tenho as fontes para compilar!
Um detalhe no arquivo "dwf.h" tem a seguinte declaração: *// Error and version APIs:* DWFAPI BOOL FDwfGetLastError(DWFERC *pdwferc); DWFAPI BOOL FDwfGetLastErrorMsg(char szError[512]); *DWFAPI BOOL FDwfGetVersion(char szVersion[32]); // Returns DLL version, for instance: "3.8.5"*
Imaginei que deveria como retornar uma variável lógica e modificar a variável szVersion. Meu chute é correto?
Obrigado pelo comentário. Cleber Borges
Em 19/11/2018 23:18, Daniel Guimarães Tiezzi escreveu:
Boa noite Cleber
Não seria um problema de compilação do dwf antes do dyn.load()? Vejo que está em uma máquina Windows. Tem algum compilador cc you gcc instalado? Eu não trabalho com Windows, mas talvez possa ser isso.
Daniel
------------------------------ [image: Avast logo] <https://www.avast.com/antivirus>
Este email foi escaneado pelo Avast antivírus. www.avast.com <https://www.avast.com/antivirus>
<#m_-5536672279331657497_m_7619292552036792796_m_-3904356728291830613_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
participantes (6)
-
Cesar Rabak
-
Cleber Borges
-
Cleber N.Borges
-
Daniel Guimarães Tiezzi
-
Henrique Matheus
-
Rodrigo Ângelo