1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.
  2. Informação: Pela 0:30 desta Sexta-feira (9 de Dezembro, 23:30 de Quinta-feira nos Açores) o Fórum e restantes sites da ZWAME vão estar offline para manutenção durante cerca de 1h30.
    Se necessário faremos actualizações via Twitter e Facebook.
    Remover anúncio

Ajuda em Visual Basic Compile Error

Discussão em 'Programação' iniciada por willie22, 19 de Maio de 2007. (Respostas: 10; Visualizações: 1673)

  1. willie22

    willie22 I'm cool cuz I Fold

    Ando no 11º ano de Informática e tenho que fazer um programa que gere uma chave do euromilhões de cinco números e duas estrelas...Sem números repetidos...
    Fiz o seguinte código:

    Private Sub btn_euromilhoes_gerar1_Click()
    Dim vec1(5), vec2(2) As Integer
    Dim i, j As Integer
    For i = 0 To 4
    vec1(i) = Int(49 * Rnd + 1)
    numeros_euromilhoes1.Text = vec(i) + " "
    Next
    For j = O To 2
    vec2(j) = Int(8 * Rnd + 1)
    estrelas_euromilhoes.Text = vec(i) + " "
    Next
    End Sub

    ...Mas quando tento correr o programa dá-me este erro: Compile error: sub or function not defined...e a primeira linha de código( Private Sub btn_euromilhoes_gerar1_Click() ) aparece a amarelo...O botão já tem este nome desde o início do programa por isso não vejo o que possa ser.O código tem algum erro?Fico muito grato por qualquer ajuda que me possam dar...
     
  2. HecKel

    HecKel The WORM

    Bem, nova tentativa mas julgo que mais acertada :P

    Faz mesmo muito tempo que não programo em VB, os erros que julgo podem acontecer aí, baseando-me neste link, talvez tenhas de dizer qual a variável que estás a fazer Next, por exemplo, Next i.

    Já agora, não sei se é propositado, mas no segundo for estás a usar o i num suposto array vec, no entanto não tens nenhum array vec definido..., e esse i nunca será alterado, terá sempre o valor 4.

    Verifica isto.

    abraços, HecKel
     
  3. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    HecKel, podes fazer "For i... Next", sem ser "Next i". Pode é ficar confuso quando usas ciclos dentro de ciclos (há uma palavra que diz como isto se chama, mas não me lembro :x ). E quando há um "Next", o valor da variável é automaticamente incrementado, ao contrário de linguagens como o C onde tens de dizer explicitamente algo como "i++". No VB isso não é necessário ;)
    No entanto, o problema encontra-se no que disseste a seguir :)

    Nesse caso, que interessa não é o que está a Amarelo mas sim o que está seleccionado. As arrays vec1 e vec2 foram definidas, mas vec é o que está a ser chamado e não foi definido. E, de acordo com o que foi escrito ("vec(i)"), ele não considera "índice i da array vec", mas considera "função vec parâmetro i". Daí o erro ser "Sub of Function not defined". O compilador está a considerar vec como uma função, já que não sabe o que isso é.

    Confirma o nome da variável. O problema há-de estar aí. Provavelmente o que queres é isto
    Código:
    Private Sub btn_euromilhoes_gerar1_Click()
        Dim vec1(5) [B]As Integer[/B], vec2(2) As Integer
        Dim i [B]As Integer[/B], j As Integer
     
        For i = 0 To 4
            vec1(i) = Int(49 * Rnd + 1)
            numeros_euromilhoes1.Text = [B][U]vec1[/U][/B](i) + " "
        Next [B]i[/B]
     
        For j = O To 2
            vec2(j) = Int(8 * Rnd + 1)
            estrelas_euromilhoes.Text = [B][U]vec2[/U][/B](i) + " "
        Next [B]j[/B]
     
    End Sub
    
    E já agora, tomei a liberdade de corrigir o seguinte:
    - Dim x, y As Integer. Isto faz com que "x" seja Variant e "y" seja Integer. É um erro pensar-se que tanto x como y serão Integers. Corrigi para o equivalente a Dim x As Integer, y As Integer, que é como deve ser feito.
    - Acrescentei algum indenting, para organizar melhor o código.
    - Corrigi a variável que te dá problemas, presumindo que no primeiro ciclo referias-te a vec1 e no segundo, a vec2.
    - Acrescentei o nome da variável ao Next. Apesar de funcionar apenas o "Next", é sempre bom teres bem explícito o ciclo a que o Next se refere.

    Espero ter ajudado :P

    Cumprimentos
    angelofwisdom
     
    Última edição: 20 de Maio de 2007
  4. willie22

    willie22 I'm cool cuz I Fold

    Já fiz as correcções que me indicaram e este erro desapareceu, mas agora quando corro o programa aparece-me a seguinte mensagem: Runtime Error 13: Type Mismatch.
    Penso que tenho as variáveis declaradas correctamente.
    Alguem sabe o porquê deste erro?
    Muito obrigado pela vossa ajuda! :)
     
  5. msdevweb

    msdevweb Power Member

    No código acima corrigido, e mesmo no código original acho que existem alguns erros...

    no For j=, está lá a letra "O" em vez do numero 0 (se foi copiado daqui, poderá ser esse o erro de type mismatch), depois, queres apenas duas estrelas não é? então o porquê de for j=0 to 2 ?? o ciclo será executado 3 vezes, logo gerará 3 numeros.

    por final, não é normal, mas poderá acontecer o teu text label não estar a gostar de aceitar um vector, ou variavel de um vector, para isso podes converter o teu numero gerado em string antes de o enviares para o label. Podes usar o cstr() ou o format(), ficarias algo como
    numeros_euromilhoes1.text = cstr(vec1(i)) + " " ou
    numeros_euromilhoes1.text = format(vect1(i))
    o mesmo se passaria para as estrelas.

    Mas só mesmo corrigindo esse ciclo j=O para j=0 já deve funcionar correctamente.

    De qualquer das maneiras o melhor seria fazeres um debug colocando uns breakpoints e uns watch às variaveis para detectares mais facilmente o teu erro.

    hope it works!
     
    Última edição: 20 de Maio de 2007
  6. willie22

    willie22 I'm cool cuz I Fold

    Já descobri a razão do erro: Em vez de pôr + tinha k pôr & para adicionar o espaço entre os números. O único problema é que na textbox numeros_euromilhoes1.Text só aparece 1 número e deviam aparecer 5. Na textbox estrelas_euromilhoes1.Text também só aparece 1 número mas deviam aparecer 2. Estarei a fazer alguma coisa mal novamente? lol muito obrigado pela vossa ajuda mais uma vez :)
     
    Última edição: 20 de Maio de 2007
  7. msdevweb

    msdevweb Power Member

    em x de numeros_euromilhoes1.text = vec1(i) & " " coloca

    numeros_euromilhoes1.text = numeros_euromilhoes1.text & vec1(i) & " "

    :)

    abraço.
     
  8. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Com efeito, após rever o código todo e tudo o que o mswebdev disse, agora é que está certo.
    O código que eu coloquei é o original, com algumas modificações que fiz à mão. Não pude abrir o VB na altura porque não tinha memória :x

    O "For j = O to ..." não dá problemas se ele não usar o Option Explicit. Está errado, sim, mas "O" é considerado uma variável nova com o valor inicial 0. Apesar de estar incorrecto, não está a trazer problemas.
    O erro era mesmo estares a somar vec1(), que é uma Integer, com " ", que é uma String. Isso é que provoca o Type Mismatch (os tipos das variáveis não coincidem. Basicamente, não se pode somar um número com uma letra). Ou o CStr(vec1()) ou o trocar o "+" por "&" corrigem este problema.

    Quanto ao mostrar os números todos, a última resposta corrige isso :P

    Código:
    Private Sub btn_euromilhoes_gerar1_Click()
        Dim vec1(5) [B]As Integer[/B], vec2(2) As Integer
        Dim i [B]As Integer[/B], j As Integer
     
        For i = 0 To 4
            vec1(i) = Int(49 * Rnd + 1)
            numeros_euromilhoes1.Text = numeros_euromilhoes1.Text  & CStr([B][U]vec1[/U][/B](i)) & " "
        Next [B]i[/B]
     
        For j = 0 To 1
            vec2(j) = Int(8 * Rnd + 1)
            estrelas_euromilhoes.Text = estrelas_euromilhoes.Text  & CStr([B][U]vec2[/U][/B](i)) & " "
        Next [B]j[/B]
     
    End Sub
    
    Isto deve estar certo agora. Devido ao avançado da hora no meu post anterior, não estava com disposição para ver o código todo, por isso estes erros todos escaparam-me (limitei-me a corrigir o problema que mostravas, e mais algumas coisas que apanhei a olho).
     
    Última edição: 20 de Maio de 2007
  9. willie22

    willie22 I'm cool cuz I Fold

    Forneceram-me o seguinte código para a resoluçao do problema já com a verificação dos dados incutida:
    Código:
    Private Sub btn_euromilhoes_gerar1_Click()             Dim vec1(5), vec2(2) As Integer             Dim n, i, j As Integer             Dim ja_saiu As Boolean              Cls 'limpa o form             i = 0             Do While i < 5                ja_saiu = False                n = Int(49 * Rnd) + 1                For j = 0 To 4                    If n = vec1(j) And ja_saiu = False Then ja_saiu = True                Next                If ja_saiu = False Then                   vec1(i) = n                   i = i + 1                End If                Loop              i = 0             Do While i < 2                ja_saiu = False                n = Int(9 * Rnd) + 1                For j = 0 To 1                    If n = vec2(j) And ja_saiu = False Then ja_saiu = True                Next                If ja_saiu = False Then                   vec2(i) = n                   i = i + 1                End If             Loop             For i = 0 To 4                 numeros_euromilhoes1.Text = numeros_euromilhoes.Text + vec1(i) & " "             Next             Print             Print vec2(0) & " " & vec2(1) End Sub 
    Queria mostrar o resultado em textboxes em vez do print...Alguém sabe como poderei fazer isto?Desde já o meu muito obrigado.
     
    Última edição: 20 de Maio de 2007
  10. willie22

    willie22 I'm cool cuz I Fold

    Desculpem mas não sei como pôr o código indentado...
     
  11. Triston

    Triston Aku Soku Zan SM

    Ja lhe adicionei as tags CODE e /CODE mas convem dares uns enters para pelo menos separares as linhas de codigo ;)
     

Partilhar esta Página