Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Daltro_jr

Vetor com ponteiro

Recommended Posts

Caros,

 

Estou fazendo minha primeira aplicação em Visual Basic. Esta aplicação troca dados com um controlador industrial. Recebi uma DLL do fabricante com várias funções, dentre elas existe a função de leitura de dados que é a seguinte:

 

SCPReadData( 1, 1, 40, 7, Vvetor)

 

- O primeiro parâmetro "1" é o nr. do controlador na rede;

- O segundo "1" é o tipo de variável que eu quero ler, no caso valor inteiro entre -32768/+32767;

- O terceiro "40" é o número da variável que eu quero ler;

- O quarto "7" é a quantidade de variáveis que eu quero ler a partir da variável escolhida, ou seja, da 40 até a 47;

- O ultimo parâmetro "Vvetor" deve ser um ponteiro para um vetor de 8 inteiros. (ai é que está o problema)

 

Na minha aplicação eu declarei um vetor da seguinte forma

 

Dim Vvetor(7) As integer - Está certo ?

 

Caso esteja certo, como eu faço para preencher este vetor com o retorno da função acima ???

 

Depois disso, como eu posso recuperar o valor de cada variável contida no vetor ???

 

Se alguém puder me ajudar...

 

Daltro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Daltro, se você passar a função dessa mesma forma que está, que retorno te dá?

 

A variável está aguardando um ponteiro, e VB não trabalha com ponteiro. Mas um ponteiro é um endereço de memória da sua variável, então você pode usar a função varPtr(variavel) que pega esse endereço.

 

Agora cuidado quando for declarar a função na sua aplicação. O item que vai receber essa variavel deve ser declarado como long e em todas as variaveis coloque ByVal na frente. Sem colocar o ByVal, por padrão ele fica ByRef, e quando passa como ByRef o valor chega alterado para a API.

 

E só uma coisa, você sabe se realmente a API deles é compatível com VB6? Estou perguntando isso porque há uns meses atrás estava tentando desenvolver uma aplicação com uma API de um certo fabricante. E depois de muito tentar diversas formas diferentes, chegamos a conclusão que o VB6 não me daria suporte para fazer tudo que eu precisava. Tente conferir com o fabricante se é normal utilizarem essa linguagem com a API deles.

 

Faça uns testes ai e diga o resultado.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Moderador,

 

Como eu disse está é a primeira vez que estou fazendo uma aplicação em VB6. A muito tempo eu programava em CLIPPER 5.1 ( na época do guraraná com rolha!, rsrsrs) mas voltei agora com VB6.

 

Não sei se vou responder a sua pergunta mas, quando utilizo a função SCPReadData( 1, 1, 40, 1, buffer) no VB6 eu consigo ler e com a função SCPWRriteData() consigo escrever no equipamento normalmente... o que acontece é que tenho que ler umas 100 variáveis de cada equipamento e isso ocupa um tempo razoavel na rede... então perguntei ao fabricante se eu fizesse a leitura de "n" variáveis ao mesmo tempo seria mais rápido e a resposta foi positiva, ou seja, o tempo de ler 8 posições de memória de uma vez é muito menor do que ler as mesmas 8 posições separadamente !

 

Entretanto ele me informou que necessitaria fazer um vetor com ponteiro... eu não sei nem fazer o vetor, quanto mais o ponteiro...

 

Mas vamos lá....

 

eu estou declarando todas da variáveis como integer pois elas são variáveis inteiras com valores entre -32768/+32767, na realidade a aplicação só aceitará valores entre 1 e 999.

 

Você diz para que eu use a função varPtr(variavel), como funciona isso ???

 

Grande abraço

 

Daltro

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função varPtr te retorna o endereço de memória da sua variável.

 

Se fizer msgbox varPtr(variavel_declarada), verá que ele mostrará um número. Esse é seu endereço de memória. É só passar esse valor na item pedido.

 

Então, quando ao vetor, eu acho que ele quer que você monte uma variável estruturada. Se for isso, é exatamente o problema que tive que citei que não consegui resolver.

 

Em C/C++ você tem algo chamado struct, que monta assim:

 

struct Teste{
  int32 a;
  int32 a;
}

Então depois em seu código você faria:

Teste variavel

 

Ou seja, você tem uma variavel chamada variavel do tipo Teste que tem "dois ítens":

variavel.a
variavel.i

Então quando passa para a API o endereço de memória dessa variável, de acordo com os outros dados que passou, a API preencherá esse valores (a e i).

Mas em VB, o mais próximo que chegará do struct, será usando class. Mas infelizmente, o class não responde igual o struct. Pelo menos não consgui e não encontrei nada que fizesse funcionar da mesma forma.

Por isso falei para perguntar para o fabricante se é normal utilizarem VB para a API dele.

Então deixo em aberto. Caso apareça alguém que diga que é possível fazer o que você precisa ou se encontrar algo na net, consegue resolver.

Compartilhar este post


Link para o post
Compartilhar em outros sites

'Vamos tentar assim...

'Espero que dê certo!

 

'Me indique uma unica coisa... essa variável buff é de que tipo?

'Integer, String, Boolean, Double, Long, Byte...

 

'Entenda que o VB se comunica com API´s via dados terminados com NULO (vbNullChar ou vbNullString ou Chr(0))

'Se for String, Tente fazendo pelo caso abaixo

Dim i as Integer

 

For i = 0 to 8 'Coloque aqui a qtde de leitura que se deseja ter

buffer = buffer + vbNullChar ' <<<< Isso identifica que é um ponteiro, quando passamos esses valores para API´s

next

'Depois Leia pelo buffer incrementado

SCPReadData( 1, 1, 40, 1, buffer)

 

 

'No final do For, devera aparecer algo assim:

 

'Buffer = 12◙13◙14◙123◙124◙

'Onde Fica assim determinado um ponteiro de valores terminados com caracter nulo.

 

'Espero ter ajudado!

'Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Manoel, isso funciona para qualquer caso? Nesse ele quer montar um vetor.

 

Mas caso quisesse montar um struct, sabe se isso também funciona?

 

Por exemplo se tenho a variável teste e nela tenho alguns "atributos"

 

teste.1
teste.2
teste.3

E presico passar esses parâmetros em uma API, por exemplo

 

call api{34,23,teste)

Estou perguntando porque tentei fazer isso com class mas não deu certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.