Ir ao conteúdo

Posts recomendados

Postado

nem sei direito como fazer a pergunta

 

eu tenho uma macro (VBA EXCEL) que apesar de ser simples usa muitas variaveis

para não ter que ficar mandando as  variaveis por referencia eu preferi usar o gosub

 

basicamente é um loop passando de uma função para outra

    for (w = 1; w <= k; w++)    {        if (Op == 0)        {            OcoL(Loi, OLi, OLf, Lig, Op, OZig_L, OqL, Oquadante_L, T, Coi, Oci, Ocf, Zig, Op, OZig_C, OqC, Oquadante_C);            if (t == 1)            {                t = 0;                OLin(Loi, OLi, OLf, Lig, Op, OZig_L, OqL, Oquadante_L, T, Coi, Oci, Ocf, Zig, Op, OZig_C, OqC, Oquadante_C);            }        }        if (Op == 1)        {            OLin(Loi, OLi, OLf, Lig, Op, OZig_L, OqL, Oquadante_L, T, Coi, Oci, Ocf, Zig, Op, OZig_C, OqC, Oquadante_C);            if (t == 1)            {                t = 0;                OcoL(Loi, OLi, OLf, Lig, Op, OZig_L, OqL, Oquadante_L, T, Coi, Oci, Ocf, Zig, Op, OZig_C, OqC, Oquadante_C);            }        }       ...    }...}

e nelas próprias tem chamada para as outras

void OLin(long long &Loi, long long &OLi, long long &OLf, long long &Lig, long long &Op, bool OZig_L, long long OqL, bolean *Oquadante_L, long long &T, long long &Coi, long long &Oci, long long &Ocf, long long &Zig, long long Op, bool OZig_C, long long OqC, bolean *Oquadante_C){	if (Op == 0)	{		if (T == 1)		{			Loi = Loi + Lig;		}		if (OZig_L == false)		{			if (Loi == OLf)			{				if (Oquadante_L == true)				{					OLf = OLf + OqL;					OLi = OLi + OqL;				}				Loi = OLi + Lig;			}		}		else		{			if (Loi == OLi || Loi == OLf)			{				if (Oquadante_L == true)				{					OLf = OLf + OqL;					OLi = OLi + OqL;					Loi = Loi + OqL;				}				Lig = -Lig;				Loi = Loi + Lig;			}		}	}	if (Op == 1)	{		T = 0;		Loi = Loi + Lig;		if (OZig_L == false)		{			if (Loi == OLf)			{				T = 1;				if (Oquadante_L == true)				{					OcoL(Loi, OLi, OLf, Lig, Op, OZig_L, OqL, Oquadante_L, T, Coi, Oci, Ocf, Zig, Op, OZig_C, OqC, Oquadante_C);					if (T == 1)					{						OLf = OLf + OqL;						OLi = OLi + OqL;						T = 0;                                                ...					}				}				Loi = OLi + Lig;			}		}		else		{			if (Loi == OLi || Loi == OLf)			{				T = 1;				if (Oquadante_L == true)				{					OcoL(Loi, OLi, OLf, Lig, Op, OZig_L, OqL, Oquadante_L, T, Coi, Oci, Ocf, Zig, Op, OZig_C, OqC, Oquadante_C);					if (T == 1)					{						OLf = OLf + OqL;						OLi = OLi + OqL;						Loi = Loi + OqL;						T = 0;					}				}				Lig = -Lig;				Loi = Loi + Lig;                                ...			}		}	}}

com vba e o gosub foi fácil organizar a logica (a minha pelo menos)

mas isso está me dando um nó no cérebro para reescrever, ainda mais que tem as outras partes que usa mais variaveis e tem uma logica mais complicada

 

pergunta,

1º se pode usar o mesmo nomes em um ponteiro de ponteiro?

não sei se isso que eu fiz funcionaria

ainda mais que tem as outras partes que tem 4 niveis de chamadas para ajustar os valores  "função1 chama função2 que chama função3 que chama função4 ou função5"

 

existe uma maneira diferente de passar essas variaveis ou  ponteiros ? "ainda estou perdido nisso"

 

ou melhor, existe maneira melhor de fazer esse fluxo de ida e volta entre as partes?

Postado

Bem, até onde eu sei, não se pode usar o mesmo nome para 2 variáveis. Ponteiro não deixa de ser uma variável também, se pudesse usar o mesmo nome, o compilador ficaria confuso, não saberia se usaria o ponteiro ou o ponteiro do ponteiro.

Postado

Então basicamente eu tenho 4 opções

variaveis publicas

embutir tudo em um unico array

usar iF's e replicar as partes

tacar gosub

 

renomear as variaveis Loi *Loi2 vai me dar uma dor de cabeça e confundir minha logica

variaveis publicas somente para essa parte do codigo seria sem noção

a array vai dificultar saber o que que está sendo feito Oarray(0)=Oarray(1)+Oarray(4)

replicar as partes vai multiplicar as linhas em 60X

gosub não tem em C/C++, mas acho que tem como criar um método

 

e agora?

 

uma duvida

em vb eu posso usar o mesmo nome de variavel em duas sub ou funções diferentes, mesmo se essas sub ou funções se auto chamam

isso porque o vb cria instancias separadas

ou talvez até renomeie essas variaveis para sabe a quem pertence

tipo

 

sub placar()

bola=gol

 

função gol() as

bola=1

gol=bola

talvez variavel bola é renomeada para algo como gol_bola, isso facilitaria ao interpretador saber a qual procedimento pertence a variavel

 

no caso no C eu vou ter que ter nomes de variaveis diferentes para cada procedimento quando elas interagirem?

Postado

acho que não expliquei direito devido a não entender direito a sua dúvida. Por sinal, esse código está horrível, até parece que você descompilou ele...

Enfim, o que importa saber é que você pode sim usar o mesmo nome para 2 variáveis, mas elas não podem ser globais, ex:

Se você criar uma função chamada "funcX();", com uma variável de parâmetro chamada X, e outra variável dentro da função com o nome X, vai dar erro.
 

void funcX(int X) { // X do parâmetroint X; // X da funçãoX = 1 // Compilador se confunde, "Qual X? o do parâmetro ou o da função?"}


2  Exemplo: Se você criar uma função chamada "funcX();", com uma variável de dentro da função chamada X, essa variável só vai existir dentro da função "funcX();", você não vai conseguir utilizar essa variável dentro da função "main();" ou qualquer outra função.

 

int main() {X = 1 // Compilador desconhece "Qual variável X? Não vejo nenhuma variável chamada X!!!"}void funcX() {int X;X= 1; // Só funcionara aki dentro!}

A mesma coisa acontece se você declarar a variável dentro da main e usar ela em outra função:

 

int main() {  int X;  X = 1; // Só funcionara aki dentro!  funcX_Correta(X); //Desse jeito a função vai reconhecer X, dentro da funcX_Correta, a variável X se chamara A }void funcX() {  X = 1 // Compilador desconhece "Qual variável X? Não vejo nenhuma variável chamada X!!!"}void funcX_CorretA(int A) {  A = 1 // Aqui o compilador conhece, ele está acessando a variável que lhe foi passada como parâmetro}

E claro, se eu declarar uma variável fora de todas das funções, ela será global, todas as funções poderão acessar ela.

 

int X; //variável global!!!main() {  X = 1;  // Funciona!}funcX() {  X = 1;  // Funciona!}
Postado

Eu estou tentando me acostumar com a sintaxe do C,

para falar a verdade eu gosto de codigos o mais comprimido possível para ter uma visão do total

mas se está falando dos nomes das variaveis, já me falaram a respeito,

mas eu só consigo fazer assim

 

no vba eu uso gosub

na macro de uso:

OLin:    If Op = 0 Then        If t = 1 Then Loi = Loi + Lig        If OZig_L = False Then            If Loi = OLf Then                If Oquadante_L = True Then OLf = OLf + OqL: OLi = OLi + OqL                Loi = OLi + Lig            End If        Else            If Loi = OLi Or Loi = OLf Then                If Oquadante_L = True Then OLf = OLf + OqL: OLi = OLi + OqL: Loi = Loi + OqL                Lig = -Lig: Loi = Loi + Lig            End If        End If    End If    If Op = 1 Then        t = 0: Loi = Loi + Lig        If OZig_L = False Then            If Loi = OLf Then                t = 1                If Oquadante_L = True Then GoSub OCoL: If t = 1 Then OLf = OLf + OqL: OLi = OLi + OqL: t = 0                Loi = OLi + Lig            End If        Else            If Loi = OLi Or Loi = OLf Then                t = 1                If Oquadante_L = True Then GoSub OCoL: If t = 1 Then OLf = OLf + OqL: OLi = OLi + OqL: t = 0: Loi = Loi + OqL                Lig = -Lig: Loi = Loi + Lig            End If        End If    End If    ReturnOCoL:     

eu fiz uma parte usando uma macro em separado para ter uma ideia de como ficaria

Sub OLin( _        ByRef Loi As Long, ByRef OLi As Long, ByRef OLf As Long, _        ByRef Lig As Long, ByVal OZig_L As Boolean, _        ByVal OqL As Long, ByVal Oquadante_L As bolean, _        ByRef T As Long, ByVal Op As Long, _        ByRef Coi As Long, ByRef Oci As Long, ByRef Ocf As Long, _        ByRef Zig As Long, ByVal OZig_C As Boolean, _        ByVal OqC As Long, ByVal Oquadante_C As bolean)    If Op = 0 Then        If T = 1 Then Loi = Loi + Lig        If OZig_L = False Then            If Loi = OLf Then                If Oquadante_L = True Then OLf = OLf + OqL: OLi = OLi + OqL                Loi = OLi + Lig            End If        Else            If Loi = OLi Or Loi = OLf Then                If Oquadante_L = True Then                    OLf = OLf + OqL: OLi = OLi + OqL: Loi = Loi + OqL                End If                Lig = -Lig: Loi = Loi + Lig            End If        End If    End If    If Op = 1 Then        T = 0: Loi = Loi + Lig        If OZig_L = False Then            If Loi = OLf Then                T = 1                If Oquadante_L = True Then                    Call OcoL(Loi, OLi, OLf, Lig, OZig_L, OqL, Oquadante_L, _                            T, Op,Coi, Oci, Ocf, Zig,  OZig_C, OqC, Oquadante_C)                    If T = 1 Then                        OLf = OLf + OqL: OLi = OLi + OqL: T = 0                    End If                End If                Loi = OLi + Lig            End If        Else            If Loi = OLi Or Loi = OLf Then                T = 1                If Oquadante_L = True Then                    Call OcoL(Loi, OLi, OLf, Lig, OZig_L, OqL, Oquadante_L, _                            T, Op, Coi, Oci, Ocf, Zig, OZig_C, OqC, Oquadante_C)                    If T = 1 Then                        OLf = OLf + OqL: OLi = OLi + OqL: Loi = Loi + OqL: T = 0                    End If                End If                Lig = -Lig: Loi = Loi + Lig            End If        End If    End IfEnd Sub

como pode ver

mesmo a macro chamada não usa todas as variaveis mas  eu tenho que passar uma carga maior porque dependendo dos testes ela tem que chamar a outra macro que também vai trabalhar as variaveis por referencia

 

a variavel T passa a informação se a macro passou em certo teste "chegou no limite dos parâmetros especificados"

 

seria como

 

procedimento-A

cria variaveis X,Y, Z,

faz ajuste pelas especificações passadas

dependendo do ajustes chama função-X ou função-Y

 

função-X

ajusta valor de X e chama a

função-Y

que ajusta o valor de Y e informa se Y extrapolou o quadrante

 

se Y extrapolou

 

função-X faz um  ajuste adicional

retorna para procedimento-A

 

de acordo com os valores de X e y o Z é ajustado

isso vai até varrer toda a ARRAY

 

mas basicamente eu não sei como passar e usar essas variáveis por referenciaria de uma função para outra em cascata

tem que usar o asterisco "*" antes da variavel para atualizar o valor e não o endereço certo?

no caso tenho que fazer isso *OLi = *OLi + *OqL ?

 

cara to quase adicionando o gosub, a macro é muito simples para se ter essa dor de cabeça por causa de variaveis

eu tenho variaveis globais, mas é de controle entre todas as macros

 

uma pergunta adicional,

é possivel usar uma variavel apenas concatenando as letras de seu nome?

tipo

ana1=4

ana2=6

a=1

b=2

var("ana" & a) + var("ana" & b )

algo muito usado para adicionar valores em objetos de useform com loops no vba

    Static frL(1 To 15) As Byte     Static frC(1 To 15) As Byte    Static frLs(1 To 15) As Byte      Static frCd(1 To 15) As Byte    Call Inicio    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*    For cs = 1 To 12    '-------------Controla a Frequencia        If mL <> 0 Then            freL = "freL" & cs            If Me.Controls(freL).Value = "" Then frL(cs) = 0            If Me.Controls(freL).Value <> "" And frL(cs) = 0 Then frL(cs) = Me.Controls(freL).Value + 1        End If        If mc <> 0 Then            freC = "freC" & cs            If Me.Controls(freC).Value = "" Then frC(cs) = 0            If Me.Controls(freC).Value <> "" And frC(cs) = 0 Then frC(cs) = Me.Controls(freC).Value + 1        End If    Next

como pode ver o nome do objeto que nesse caso é uma textbox é definido por  

freL = "freL" & cs

e é utilizado por

Me.Controls(freL).Value

isso facilitaria bastante meus projetos

Até

Postado

cara, suas dúvidas são muito esquisitas e de difícil compreensão. Parece que você quer usar a programação que aprendeu em VB no C. A lógica de programação transcende a linguagem, mas a sintaxe nem sempre, talvez haja maneiras de fazer o que você quer na linguagem C, só que você não está sabendo explicar direito. você tem TeamSpeaker? se tiver a gente pode conversar, ai você me explica direito porque não consigo entender bem o que você quer fazer.

Postado

eu sempre fui enrolado assim mesmo, as ideias ficam dando voltas e as vezes é difícil pegar a que se quer ou precisa

no vba foi a mesma coisa :(

"E por incrível que pareça apesar de tudo eu tenho avançado bastante,"

 

Cara, eu gaguejo horrores, se está difícil entender o que escrevo, imagina falando

 

sabe a logica do barco? pois bem, minha mente trabalha por referencia também :P

quando eu vejo OLi na macro é a mesma coisa que vizualizar o 1º quadrado de uma array OrigemLinhaInicial

 

por isso que só uso variaveis com poucas letras, por que quando faço a macro e olho para ela é a mesma coisa que visualizar o percusso que está fazendo entre os itens da array, e se tem palavras grandes e complexas meu raciocínio congela para definir a palavra em si :(

 

infelizmente isso me prejudica enormemente o entendimento das coisas como são passadas normalmente e acabo tendo que refazer para assimilar

 

sobre esse monte de variaveis, eu achei como fazer um gosub para ser usado no C

 

------------------------------

 

sobre concatenar palavras para definir uma variavel seria algo como

long long var1 = 0;long long var2 = 0;long long var3 = 0;for (void *n = 1; n <= 3; n++){&var= std::wstring(L"var") + n;*var=n;}//novo valor de var1,var2,var3//var1=1//var2=2//var3=3}

é meio confuso mesmo

Postado

eu sempre fui enrolado assim mesmo, as ideias ficam dando voltas e as vezes é difícil pegar a que se quer ou precisa

no vba foi a mesma coisa :(

"E por incrível que pareça apesar de tudo eu tenho avançado bastante,"

 

Cara, eu gaguejo horrores, se está difícil entender o que escrevo, imagina falando

 

sabe a logica do barco? pois bem, minha mente trabalha por referencia também :P

quando eu vejo OLi na macro é a mesma coisa que vizualizar o 1º quadrado de uma array OrigemLinhaInicial

 

por isso que só uso variaveis com poucas letras, por que quando faço a macro e olho para ela é a mesma coisa que visualizar o percusso que está fazendo entre os itens da array, e se tem palavras grandes e complexas meu raciocínio congela para definir a palavra em si :(

 

infelizmente isso me prejudica enormemente o entendimento das coisas como são passadas normalmente e acabo tendo que refazer para assimilar

 

sobre esse monte de variaveis, eu achei como fazer um gosub para ser usado no C

 

------------------------------

 

sobre concatenar palavras para definir uma variavel seria algo como

long long var1 = 0;long long var2 = 0;long long var3 = 0;for (void *n = 1; n <= 3; n++){&var= std::wstring(L"var") + n;*var=n;}//novo valor de var1,var2,var3//var1=1//var2=2//var3=3}

é meio confuso mesmo

Porque você não utiliza vetor? Não vejo necessidade de fazer isso que você fez. Abaixo um exemplo bem mais simples

 

long long var[3];int n;for (n = 0; n < 3; n++) {  var[n] = n;}

 

Postado

é bem mais fácil

mas quando se tem muitas interações individuais se torna difícil o raciocinio

 

eu tenho uma macro que parte dela é assim

        if (L[ni] <= Lx) //vn1 '        {            arr[L[ni]][c[ni]][ni] = Vn[ni];            Lini[L[ni]][ni] = Lini[L[ni]][ni] + 1;        }        if (ni ==           {ni2 = dix;}        else          {ni2 = ni - 1;}        Vn[ni] = Vn[ni] + x[ni];        if (Vn[ni] > Nx[ni] || Vn[ni] < 1)        {            x[ni] = -x[ni];            if (vhc == 1)            {                vhc = 0;            }            else            {                vhc = 1;            }            Vn[ni] = invVal(Vn[ni], vhc, Nx[ni] - vhc, 3 + vhc);        }

no vba:

        If L(ni) <= Lx Then arr(L(ni), c(ni), ni) = Vn(ni):  Lini(L(ni), ni) = Lini(L(ni), ni) + 1  'vn1    '        If ni = b Then ni2 = dix Else ni2 = ni - 1        Vn(ni) = Vn(ni) + x(ni)        If Vn(ni) > Nx(ni) Or Vn(ni) < 1 Then            x(ni) = -x(ni):            If vhc = 1 Then vhc = 0 Else vhc = 1            Vn(ni) = invVal(Vn(ni), vhc, Nx(ni) - vhc, 3 + vhc)        End If

nesse caso foi fácil porque é tudo uma coisa só  e tem poucas interações de ajuste, mas em uma logica como a mostrada inicialmente pela macro que realoca os valores da array seria impensável fazer assim

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!