Ir para conteúdo
Fórum Script Brasil
  • 0

Erro Em Uma Classe


rodfraga

Pergunta

E ai galera beleza? Bem, eu e o Igor iamos continuar o projeto do Graymalkin, porem achamos melhor evoluirmos um pouco mais pra continuar...

então, eu resolvi, começar a ver direito como funciona uma linguagem de programação...Eu fiz uma parte que soma e subtrai valores...

Vou postar aqui o código...

'Na classe de operações:
Public x As Single
Public Function add(f1 As Single, f2 As Single)
x = f1 + f2
End Function
Public Function subt(f1 As Single, f2 As Single)
x = f1 - f2
End Function
Public Function compilar(strInstruc As String)
If Mid(strInstruc, 0) = add Then
Call add
ElseIf Mid(strInstruc, 0) = subt Then
Call subt
End If
End Function

'###############

'Na parte do form
Dim prog As langMain
Private Sub Command1_Click()
Dim lbl As String
Dim exp() As String
exp() = Split(txt.Text, vbCrLf)
For i = LBound(exp) To UBound(exp)
prog.compilar (exp(i))
lbl = Label1.Caption
Label1.Caption = lbl & vbCrLf & prog.x
Next i
End Sub
Ta dando erro na linha
prog.compilar (exp(i))

Algo parecido com Block Object Variable not set or With Block variable not set

Tentei de tudo mas não conseguir reverter o erro

alguém pode me ajudar?

Abraços

Rodrigo

Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0

Experimente tirar os () do argumento, ficando:

prog.compilar exp(i)

E veja o resultado. E, outra coisa: já sabe usar ByVal e ByRef? Digo isso, porque esse tipo de argumento poderia ser passado por valor (não que seja obrigatório). Se ainda não usou essas palavras-chaves, posso te dar um exemplo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Pensando bem, acho que o que falta ali é a criação de uma instância da classe langMain, portanto a linha...

Dim prog As langMain
... ficaria:
Dim prog As New langMain
A idéia do ByVal e do ByRef, é que o primeiro faz um cópia do valor para o argumento de destino enquanto que o segundo faz uma referência direta. Por exemplo:
public function teste1(byval n as integer) as integer
  n=n+1
  teste = n
end function

public function teste2(byref n as integer) as integer
  n=n+1
  teste = n
end function
Ambas as funções acima fazem a mesma coisa, porém a primeira recebe o parâmetro por valor e a segunda por referência. Um exemplo de utilização delas seria o seguinte:
    Dim k As Integer
    k = 1
    Debug.Print teste1(k)
    Debug.Print "valor de k: ", k
    Debug.Print teste2(k)
    Debug.Print "valor de k: ", k
Repare que após a chamada de teste1() o valor de k permaneceu o mesmo, enquanto que no segundo caso (na chamada de teste2()) o valor de k passou a ser o mesmo do "n" da função. No primeiro caso, o "n" da função teste1() fica com o mesmo valor que "k". No segundo caso, o "n" é o "k". Talvez você tenha visto isto em Pascal também, que no caso é a inclusão da palavra "var" na frente do argumento que deve ser passado por referência. Note que no VB6 o padrão (quando não especificado) é o ByRef (no VB.NET é o ByVal). Portanto, esta declaração...
Public Function compilar(strInstruc As String)
... indica que "strInstruc" vai ser passada por referência, no entanto a utilização...
prog.compilar (exp(i))

... força a passagem por valor (por causa dos () em torno do valor passado).

Todavia, é claro que nesse caso não vai fazer muita diferença escolher entre um e outro (valor ou referência).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ai deu erro aqui:

If Mid(strInstruc, 0) = add Then
Porém ´já corrigi botando o add entre aspas...Assim fiz com o subt tambem..Porém dá um erro nessa linha:
Call add
E provavelmente tambem o dará em
Call subt

Bem a não ser que o que eu aprendi em VB tenha sido muito fuleiro, isso pra mim ta certo...qual o erro? dry.gifsad.gif

Abraços e obrigado pela atenção

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0

Repare que tanto add quanto subt recebem dois valores como parâmetros, os quais você não está passando chamando somente "Call add" ou "Call subt". O correto seria algo do tipo "Call add(x, y)" ou somente "add x, y" (onde o "x" e o "y" você vai extrair da strInstruc).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Por favor não me chame de relaxado...

Mas agora deu outro erro, que eu já tentei tomar providência mas não deu certo...

Public Function compilar(strInstruc As String)
Dim fac1, fac2 As Single
Dim values(1) As Single
Dim valor(2) As String
If Mid(strInstruc, 0) = "add" Then
valor(0) = Split(strInstruc, "(")(1)
valor(1) = Split(valor(0), ",")(0)
valor(2) = Split(Split(valor(0), ",")(1), ")")(0)
fac1 = CSng(valor(1))
fac2 = CSng(valor(2))
Call add(fac1, fac2)
ElseIf Mid(strInstruc, 0) = "subt" Then
valor(0) = Split(strInstruc, "(")(1)
valor(1) = Split(valor(0), ",")(0)
valor(2) = Split(Split(valor(0), ",")(1), ")")(0)
fac1 = valor(1)
fac2 = valor(2)
Call subt(fac1, fac2)
Call subt
End If
End Function

Deu erro no parametro fac1 da função add dizendo que seu tipo de dado não bate com o que a função pede...

Obrigado pela atenção

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0

De fato, veja a declaração:

Dim fac1, fac2 As Single
Qual o tipo de "fac1"? A resposta é Variant e não Single. O correto seria:
Dim fac1 As Single, fac2 As Single

Felizmente, isso foi "corrigido" no VB.NET, daí pode-se criar várias variáveis especificando o tipo apenas uma vez.

Um detalhe interessante nesse exemplo, é que funcionaria se o parâmetro fosse passado por valor (o VB converteria de acordo), enquanto que quando é passado por referência o tipo deve ser exatamente igual.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ai agora ta dando erro num troço que não dava antes..dry.gif

Public Function compilar(strInstruc As String)
Dim fac1 As Single, fac2 As Single
Dim values(1) As Single
Dim valor(2) As String
If Mid(strInstruc, 0) = "add" Then
valor(0) = Split(strInstruc, "(")(1)
valor(1) = Split(valor(0), ",")(0)
valor(2) = Split(Split(valor(0), ",")(1), ")")(0)
fac1 = CSng(valor(1))
fac2 = CSng(valor(2))
Call add(fac1, fac2)
ElseIf Mid(strInstruc, 0) = "subt" Then
valor(0) = Split(strInstruc, "(")(1)
valor(1) = Split(valor(0), ",")(0)
valor(2) = Split(Split(valor(0), ",")(1), ")")(0)
fac1 = valor(1)
fac2 = valor(2)
Call subt(fac1, fac2)
End If
End Function
Deu erro no Mid...Ai eu botei...If strInstruc = "add " Then Ai deu certo... Porém na hora de calcular ele apresenta os seguintes resultados pras seguintes ações:
add(8,7)
subt(8,7)

Ele retorna 0 pros dois.... dry.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, você pode usar InStr() que retorna a posição de uma string em outra. Todavia, isso acarreta em um futuro problema, mas por hora é uma solução simples:

Public Function compilar(ByVal strInstruc As String)
    Dim fac1 As Single, fac2 As Single
    Dim values(1) As Single
    Dim valor(2) As String
    If InStr(1, strInstruc, "add") > 0 Then
        valor(0) = Split(strInstruc, "(")(1)
        valor(1) = Split(valor(0), ",")(0)
        valor(2) = Split(Split(valor(0), ",")(1), ")")(0)
        fac1 = CSng(valor(1))
        fac2 = CSng(valor(2))
        Call Add(fac1, fac2)
    ElseIf InStr(1, strInstruc, "subt") > 0 Then
        valor(0) = Split(strInstruc, "(")(1)
        valor(1) = Split(valor(0), ",")(0)
        valor(2) = Split(Split(valor(0), ",")(1), ")")(0)
        fac1 = valor(1)
        fac2 = valor(2)
        Call subt(fac1, fac2)
    End If
End Function

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

AAEEEEE, muito obrigado...Nossa, essa pá de erro, pra adicionar e subtrair!!!!Imagina a parte de variáveis...Deve ter sido cansativo né? Claro que eu sou menos experiente, mas mesmo assim...

Obrigado pela atenção

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0
AAEEEEE, muito obrigado...Nossa, essa pá de erro, pra adicionar e subtrair!!!!Imagina a parte de variáveis...Deve ter sido cansativo né? Claro que eu sou menos experiente, mas mesmo assim...

Obrigado pela atenção

Rodrigo

Mas, é assim mesmo que se aprende: tentando. E quanto à sua pergunta, acho que nem tanto. Se não me engano, foi a primeira coisa que fiz (justamente por ser a mais fácil laugh.gif ), depois parti para as funções, daí tentei fazer o If ( unsure.gif ), mas tive que primeiro fazer desenvolvimento de expressões ( sad.gif isso foi bem complicadinho... em razão de eu não querer usar algo pronto para essa parte), daí voltei para o If e fiz o While depois, criei o tipo Booleano, voltei para o If e o While novamente porque não se podia ter dois Ifs ou dos Whiles aninhados ( sad.gif ) e nem me lembro mais o que fiz depois... (aliás, acho que foi nessa ordem). biggrin.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...