Ir para conteúdo

POWERED BY:

Arquivado

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

Claudio Neto

Declarar variavel publica

Recommended Posts

Preciso declarar uma variavel publica dentro de main.

 

Precisa ser dentro de main porque ela será um array, e a quantidade desse array será calculado dentro de main.

 

Está assim:

Estrutura

struct LigacoesEfetuadas{
	int Placa;
	int Canal;
	char Destino[15];
	int CodTupla;
	bool PlayDeGravacao;
};
Declaracao e preenchimento

LigacoesEfetuadas LgcEf[TotalCanais];
LgcEf[0].Placa = 0;
LgcEf[0].Canal = 0;
LgcEf[0].CodTupla = 80;
LgcEf[0].PlayDeGravacao = false;
LgcEf[0].Destino = "00000000";

E preciso pegar esse valor em outro modulo.

Como faço? Tentei colocar public na frente da declaração mas dá erro:

discauto.cpp:222: error: expected primary-expression before "public"

discauto.cpp:222: error: expected `;' before "public"

discauto.cpp:223: error: `ligacoesEfetuadas' was not declared in this scope

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A palavra chave "public", em C++, só faz sentido dentro da declaração de uma classe.

Use ponteiros, servem para isso!

 

Ou, melhor ainda, passe o array por parâmetro.

São muito raros os casos em que a única solução (extremamente deselegante, diga-se de passagem) seja variáveis globais...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Precisa ser dentro de main porque ela será um array, e a quantidade desse array será calculado dentro de main.

 

Isso não é justificativa p/ dizer que uma variável precisa ser local ou global.

Sendo global você elimina mais um parâmetro nas funções, mas vai precisar usar alocação dinâmica. Se for local, você pode usar a forma tradicional de um array, declarando a variável após ler o tamanho máximo, mas vai precisar passar a variável como parâmetro para as funções.

Já comentei que programador não evita construção da linguagem porque falam pra evitar. Ele usa quando é necessário e quando facilita as coisas. Se variáveis globais são compartilhadas por threads, não vejo 'deselegância' em criar uma lista global. Pior é duplicar listas e contadores dentro das threads. Aliás, elegância é bem relativo, assim como parece ser a utilidade de comentários como 'declaração da variável x', 'função main' e outros. Mas isso rende.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Victor, não tenho como passá-la com parâmetro em todas as funções.

Há uma função que precisarei dessa variável que não a chamo pelo próprio programa, ela recebe dados do hardware.

 

Isis, não usei essa frase para justificar que ela precisa ser global ou local, usei essa frase para mostrar que preciso contruir o array após calcular um certo valor.

Para colocar a declaração no topo do código, preciso já indicar o tamanho do array, mas não sei qual o tamanho do array antes do programa ser executado. Esse é o meu problema.

 

Alguma outra sugestão? Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Para colocar a declaração no topo do código, preciso já indicar o tamanho do array, mas não sei qual o tamanho do array antes do programa ser executado. Esse é o meu problema.

 

Eu já disse que não precisa e que não é um problema. Use alocação dinâmica. Como está programando em C++, faz bem conhecer a STL e usar pelo menos a classe vector, que nem precisa de new p/ reservar espaço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isis, achei esse tutorial sobre:

http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html

 

Deixa eu ver se entendi. Nesse primeiro exemplo que ele dá, simplesmente declaraa variavel SS como sendo um vetor. E através do push_back ele insere valores nos índices de SS depois lê normalmente.

 

O que você sugere que eu faça é que declare uma variavel do tipo vetor na área global e conforme a necessidade use o push_back para inserir os valores?

É isso ou entendi errado?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Faz tempo que não dou notícias dos resultados obtidos através das ajudas de vocês. Não estava conseguindo tempo para terminar o aplicativo, mas agora consegui de novo.

 

Bom, as dicas aqui sugeridas foram ótimas.

 

Mas ainda estou com um problema.

 

O banco de dados deve ser consultado todo o tempo para ver se entraram novos registros e uma nova ligação deve ser efetuada. Para isso, montei um loop infinito que está acabando com meu processador.

 

A Isis me deu algumas dicas, mas não consegui corrigir esse problema.

 

A idéia que tive foi a seguinte:

Em VB tenho um componente chamado timer que configuro um certo tempo nele, e nesse tempo ele executa uma rotina. O melhor é que o componente não consome processamento em exagerado.

Então minha idéia é criar uma DLL em VB6 com esse componente e a usar no aplicativo.

 

Minha dúvida é: Se isso é possível, usar uma dll feita em outra linguagem e como a uso?

 

Construir em VB6 em sei.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O plano da DLL não deu certo.

 

Não consigo criar uma DLL em vb que use um componente da forma como eu precisava.

 

Existe alguma outra solução para eu reduzir esse processamento e conseguir verificar o banco quantas vezes forem necessárias? Obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que já devem até ter falado isso...

 

Em primeiro lugar, usar variáveis globais é ruim. É bem ruim. Se você puder, passe tudo como argumentos pras funções que as utilizam (quando necessário alterar o valor da variável, passe por referência, o que em C equivale a passar o endereço da variável).

 

Se você realmente quiser usar a variável global, declare um ponteiro fora da main, e faça a alocação a partir do momento em que souber o tamanho dela. Se for necessário mudar este tamanho mais tarde, use realloc(). Se precisar acessar a variável a partir de código que está em outro arquivo, use

 

 extern struct LigacoesEfetuadas *array;

De qualquer forma, na main:

 

 // ler TotalCanais;
 array = malloc((TotalCanais + 1) * sizeof LigacoesEfetuadas);
 array[TotalCanais] = 0; // pras suas funcoes saberem que chegaram ao fim da array

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado guidjos, mas o método que a Isis passou tinha funcionado.

 

Qual é mais vantajoso utilizar?

 

Então, eu entendi que usar variáveis globais é ruim, mas você entendeu o porque de minha necessidade?

 

Eu tenho uma das funções que não será outra função do programa que passará dados para ela, e sim o hardware. Mas agradeço a preocupação.

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claudio...

 

Usa a classe vector.

 

Acerca das variáveis globais, vamos com calma...

Os professores abominam tais variáveis por uma questão de ensinar a forma mais limpa de resolver o problema, mas muitas vezes é extremamente vantajoso usar variáveis globais em comparação à passagem por parâmetro.

Sem contar que programar num computador com 1 gb de RAM é fácil...

Programar para um processador com recursos limitados é muito mais complicado, e 4 bytes podem fazer a diferença.

 

Imagine o seguinte trecho de código em C:

int funcao1(int x, int y)
{
    //...
    //...
    //...
    funcao2();
    //...
}

int funcao2()
{
int a,b,c,d,e;

    //...
    //...
    //...
}

Imaginemos que estamos executando a funcao1. No momento logo a seguir à chamada da funcao2 a stack está assim:

0xXXX 00 :
0xXXX 04 : e
0xXXX 08 : d
0xXXX 0C : c
0xXXX 10 : b
0xXXX 14 : a
0xXXX 18 : endereço da stack frame de f1
0xXXX 1C : endereço de retorno de f2

Agora, imagina que as variáveos a,b,c e d, que foram declaradas locais em f2, tinham o mesmo papel em váááááárias funções e todas essas funções recebiam os dados por parâmetros.

A cada chamada de cada função dessas ocupamos 16 bytes (ou 32 bytes se o SO for de 64 bits).

Vamos supor que tinhamos 10 chamadas à essas funções aninhadas, então estariamos ocupando 160 bytes desnecessáriamente, uma vez que poderiamos declarar tais variáveis globais e ocupar apenas 16 bytes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, obrigado Victor. Manterei então da forma que está.

 

Quanto a sua explicação, só embananou minha cabeça então. Tendo em vista os motivos que deu para a vantagem de usar global, qual é a vantagem de usar passando por parâmetro? Só estou perguntando por curiosidade mesmo...

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A vantagem de não usar globais é que você sempre tem certeza de que valores está modificando e acessando.

 

Suponha que você está trabalhando num projeto, e tem como tarefa desenvolver um módulo específico que integrará um sistema maior. No seu código, você trabalha com uma variável global. O projeto envolve, obviamente, outros módulos, que serão codificados por outros desenvolvedores. Se o código sobre o qual os módulos serão rodados usar variáveis globais que devem ser acessadas de dentro deles, nunca se sabe o que outro módulo estará fazendo com elas quando nós tivermos que lê-las / escrever nelas.

 

Dependendo do caso, pode ficar incrivelmente difícil detectar e corrigir erros. É o lado ruim de variáveis globais.

 

O argumento da economia de memória é válido em alguns casos muito específicos. No seu caso, por exemplo, você somente passaria por parâmetro um endereço de memória (o ponteiro do endereço base da array), que na x86 é de 4 bytes. Portanto, não importa quão grande sua matriz é, o stack nunca cresce. Os valores "replicados que desempenham papéis similares em várias funções diferentes" são, geralmente, tipos primitivos. Estes nunca são maiores do que a arquitetura sobre a qual trabalhamos pode suportar (se fossem, seria impraticável definir novos tipos de dados, que são composições de primitivos, e em qualquer projeto que se preze isso é necessário).

 

Atenha-se, quando possível, a variáveis locais.

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.