Ir para conteúdo

Arquivado

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

Claudio Neto

[Resolvido] Transformar estrutura de arquivo header em VB

Recommended Posts

Ué, mas se basta copiar o valor de params para cmd.params, para que ele usou o ( byte* )? Não entendi. Somente copiando, estou passando uma string, estou certo?

 

E assim, params foi declarado como um array, masna hora que foi passado valor para ele, não especificou em que posição do array o string ficou.

Pelo menos em VB, quando declaro um array de três posições por exemplo (dim exemplo(2) as string), quando passo valor para ele, preciso especificar assim:

exemplo(0) = "teste"

Como fica ali que não foi especificado?

 

E onde vou usar o valor do ponteiro? rs

 

Em VB, array pode ser sinônimo de vetor sim, pois pode ser montado só na base x (dim exemplo(10) as string), ou na base x e y (dim exemplo(5,10) as string) que ai sim nesse caso fica mais parecido com um vetor (ou com uma matriz), por isso tem gente que chama assim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece que, param não é um array de strings, é um array de char, que forma uma string.

 

Na verdade, o que ele faz é o seguinte:

tenho uma string (ou array de char, como preferir) com um conteúdo qualquer, e eu tenho certeza que essa string começa em &params[0], que é o mesmo que params.

 

O que ele faz, é que passa esse endereço de memória, que é do tipo char*, para a variável cmd.params, com o tipo byte*.

Em suma, a variável cmp.params não guarda nada, apenas o endereço de memória de uma string qualquer.

Vou reescrever o trecho em python, talvez seja mais fácil entender o que ele faz:

numeroA = "1234"
numeroB = "5678"

params = "destr_addr=\"%s\" orig_addr=\"%s\"" % (numeroA, numeroB)

cmd.params = params
(Note que, não é preciso fazer nenhum casting com o tipo de params)

 

Sobre a nomenclatura, eu não gosto de chamar arrays de vetores, pois eles não são vetores, matemáticamente falando.

Um array pode ser chamado de lista

Um array multidimensional também não é uma matriz, é uma lista de listas....

No fundo a nomenclatura não importa, eu é que sou chato com isso.. hahahahahahaha

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, agora algumas coisas ficaram mais claras quanto ao array de params.

 

Beleza.

 

Bom, então no fundo estou passando da forma certa mesmo, que em meu programa passei sem acrescentar nada ao passar o valor de params para cms.params. Só que ainda está dando algum erro.

Falei com o fabricante, eles pediram para eu enviar os logs para eles analisarem o que estou passando errado, mas pelo menos consegui chegar em algum lugar.

 

Por ora é só, mas com certeza volto daqui uns dias com uma dúvida diferente, rs.

 

Abraços Victor, e muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Victor, tudo bem?

 

Não lembro se comentei com você, mas depois de tudo isso, acabei descobrindo que fazer com o VB será mais difícil do que imaginava. A informação que tive é que o VB não tem nada que substitua o struct do C. Montar uma class não funciona igual, então tive que abandonar.

Minha solução foi tentar desenvolver em C direto, já que é a linguagem que eles mesmos indicam.

 

Para começar, tentei compilar o próprio HelloWorld deles.

Adicionei todos os headers e fiz as referências, mas tive um erro:

 

[Linker erro] undefined reference to 'GetDeviceConfig@16'

 

No projeto existe GetDeviceConfig, mas não com esse @16 na frente.

 

Sabe o que pode ser e como corrijo?

 

Obrigado mais uma vez antecipadamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Cláudio!

 

Não, eu acho que você não comentou nada, mas isso é o de menos.

Enfim, eu preciso antes de algumas informações para saber o que se passa.

Qual compilador esta utilizando?

Quais opções de compilação estão sendu utilizadas?

No projeto existe a definição de 'GetDeviceConfig' ou apenas a declaração?

Como é a declaração de 'GetDeviceConfig'? Por acaso é com um 'external' na frente?

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

É então, não dá. Foi até por isso que tinha conversado sobre aquilo com você. Aí quando vi que não dava achei mais fácil contratar. O que estou tentando fazer agora nem é para o programa principal, é mais para aprender mesmo e construir pequenos aplicativos.

 

Estou usando DevC++, mas também tentei com o Visual Studio e deu a mesma coisa.

 

O que quer dizer com opção de compilação? rs

 

A declaração está assim:

int32 Kstdcall GetDeviceConfig(int32 Id, int32 Object, void *Data, int32 DataSize);

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que, pelo que parece, você só tem a declaração da função 'GetDeviceConfig' disponível.

Você não tem que linkar com nenhuma biblioteca?

 

Te aconselho fortemente à largar o DevC++, e esquecer IDE's.

Pegue num compilador (mingw fará o trabalho em windows) e num editor de texto e use apenas isso no início.

IDE's foram pensadas para aumentar a produtividade do programador, automatizando uma série e tarefas.

Tarefas estas que são importantes para aprender a programar e diagnosticar problemas, como o que você teve.

http://forum.imasters.com.br/index.php?/topic/348057-tutorial-gcc-o-basico/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Victor, legal, tentarei fazer assim.

Mas baixei o programa que indicou e fiquei na mesma. Ele não instalou nenhum executável, somente um monte de arquivos .gz no desktop, então nem sei por onde começar a usar seu tutorial, nem onde por isso:

gcc [opções][arquivos][-o saída (opcional)]

E você tem também um tutorial que ensina a linkar todos os arquivos necessários na mão? Como criar um projeto e tudo mais?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não cláudio, não tenho nada sobre isso, mas posso escrever.

Seguinte, o mingw instalou muitas coisas no seu pc, mas são ferramentas que você só consegue utilizar via linha de comandos.

 

Primeiro você deve adicionar a pasta onde estão os executáveis na variável de ambiente PATH do windows,

depois é só começar a usar!

 

gcc é o nome do compilador, "GNU C Compiler"

existe também o g++, para compilar C++.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vixi Victor, agora viajei. Que executáveis? Os únicos executáveis que ele instalou foram o desistalador e o atualizador, rs... De resto só os arquivos que mencionei.

 

 

Ah Victor, outra coisa. Você havia mensionado que o erro anterior seria porque deveria faltar alguma coisa a estar linkada. Na verdade, esse código deve se comunicar com uma dll. Mas não encontrei em parte alguma fazendo referência a essa dll. Como faço para linkar a ela?

 

Obrigado de novo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Victor, consegui começar a mecher no GNU. Mas estou todo perdido aqui, rs.

 

Fiz um programinha bobo (HelloWorld) só para testar, ele deu um erro dizendo:

HelloWorld.c:7:2: warning: no newline at end of line

 

E o código está assim:

#include <stdio.h>
#include <stdlib.h>

int main{
  printf("Olá");
}

Credo, aprender desde o início é muito chato, rs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Cláudio, peço desculpas pela demora.

 

Ótimo, você ja consegue compilar as coisas 'na mão'!

O seu programa tem dois erros:

main é uma função que retorna um int... e sua não retorna nada.

como o compilador disse, não há um newline no final do arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É, eu não queria que retornasse nada mesmo. Mas tentei usar void e deu erro.

 

Para resolver o newline basta apenas acrescentar uma nova linha em branco? É só isso mesmo? Que utilidade tem isso?

 

O arquivo que criei, usei extensão .c, mas todos os outros que estava trabalhando antes, tava usando .cpp e .dev. Qual a diferença, qual o melhor para eu usar e como monto um projeto indicando as .h?

 

Abraço.

 

Acrescentando:

O que há de errado nisso aqui:

main{
  char nome;
  printf("Ola, digite seu nome: ");
  scanf("%s",&nome);
  printf("\n\n%s",nome);
  system("pause>>NULL");
}

Quando digito o nome e dou enter, fecha o programa dizendo que o programa achou um erro precisa ser fechado.

 

Se troco %s por %c funciona, mas aí só com primeiro caractere.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para resolver o newline basta apenas acrescentar uma nova linha em branco? É só isso mesmo? Que utilidade tem isso?

 

http://gcc.gnu.org/ml/gcc/2003-11/msg01568.html

 

O arquivo que criei, usei extensão .c, mas todos os outros que estava trabalhando antes, tava usando .cpp e .dev. Qual a diferença, qual o melhor para eu usar e como monto um projeto indicando as .h?

 

C-> Linguagem C

CPP -> Linguagem C++

 

main{
char nome;
printf("Ola, digite seu nome: ");
scanf("%s",&nome);
printf("\n\n%s",nome);
system("pause>>NULL");
}

 

Quando digito o nome e dou enter, fecha o programa dizendo que o programa achou um erro precisa ser fechado.

 

Se troco %s por %c funciona, mas aí só com primeiro caractere.

 

Porque você está lendo uma string e tentando enfiar num espaço de um caractere.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal Isis, obrigado.

 

Sobre os headers, sabe me dizer também como os incluo no projeto? Usando IDE era fácil, mas e no editor?

 

E sobre o que disse da string no espaço de um caractere, porque? O que há de errado em minha declaração para que isso esteja acontecendo? E como devo fazer?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal Isis, obrigado.

 

Sobre os headers, sabe me dizer também como os incluo no projeto? Usando IDE era fácil, mas e no editor?

 

E sobre o que disse da string no espaço de um caractere, porque? O que há de errado em minha declaração para que isso esteja acontecendo? E como devo fazer?

Obrigado.

 

Você está declarando nome como char de um caracter desta forma:

char nome;

Daí você define o tamanho da String, assim:

char nome[40];

 

 

Me corrijam se eu estiver errado! =)

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eeeee... Valeu Dee, você não está errado não. É isso mesmo. Então sempre que vou declarar uma variável de string, preciso declarar o tamanho dela né... Ok.

 

Desculpem a ignorância, mas estou usando umas apostilas que baixei no apostilando, e lá não dizia nada sobre isso.

 

Fico no aguardo ai dos headers então, e vou aparecendo por aqui conforma as dúvidas forem surgindo.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Claudio!

 

No tutorial do link que te passei ( http://forum.imasters.com.br/index.php?/topic/348057-tutorial-gcc-o-basico/ ),

eu explico algumas opções do compilador gcc, uma delas é a -I

 

Imagine a seguinte árvore de diretórios de um projeto:

raiz/ |-- include/ |      | |      |-- header1.h |      | |      |-- header2.h | |-- main.c
E o arquivo main.c:

#include <header1.h>#include <header2.h>//resto do código
Supondo que estamos no diretório 'raiz'

Se você tentar compilar da seguinte forma:

 

gcc main.c

Receberá um erro dizendo que não encontra os arquivos "header1.h" e "header2.h"

 

Mas, se você incluir o diretório 'include' nos diretórios de pesquisa do compilador, resolve o problema...

por exemplo:

 

gcc -I./include main.c

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi Victor, parece tranquilo.

 

Estou criando algumas coisinhas simples aqui para ir me familiarizando.

Montei uma rotina que me exibe a hora, assim:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

main{
 time_t rawtime;
 struct tm * timeinfo;
 time (&rawtime);
 timeinfo = localtime(&rawtime);

 char nome[255];
 printf("Digite seu nome: ");
 scanf("%s",&nome);
 printf("\n\n Ola %s, agora sao %s", nome, asctime(timeinfo));
 system("pause>>NULL");
}

Agora me diga uma coisa. Se eu quiser que ele fique atualizando a hora o tempo todo, como faço isso? E consigo exibir a data em formatos diferentes ou é padrão?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Victor, estou começando a usar a API que tanto estou tendo problema.

 

Tive um problema logo de cara para usar a função inicial (lStart).

 

A função está declarada em um header da seguinte forma:

 

sbyte *stdcall lStart(int32 Major, int32 Minor, int32 Build);

E quando tento compilar está dando um erro:

undefined reference to 'lStart@12'
O mesmo que estava dando quando estava usando DEV C++.

 

Provavelmente esse erro ocorre porque tenho que referenciar uma dll, mas não sei como fazer. Procurei algumas coisas na net e encontrei diversas maneiras diferente, mas fiquei confuso e não sei qual usar e como usar. Por exemplo:

#using <YMSG12ENCRYPT.DLL>
HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;
hDLL = LoadLibrary("MyDLL");
__declspec( dllexport ) void MyFunction(); // In called code
__declspec( dllimport ) void MyFunction(); // in calling code

Como devo fazer?

 

Obrigado.

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.