Jump to content

Recommended Posts

Posted
Private Sub geracomb(ByVal contador As Long)
	If contador <= 100000 Then
		If numeros(6) = 11 And numeros(5) <> 10 Then
			numeros(5) += 1
			numeros(6) = numeros(5) + 1
		ElseIf numeros(6) < 11 Then
			numeros(6) += 1
		ElseIf numeros(5) = 10 And numeros(6) = 11 And numeros(4) < 50 Then
			numeros(4) += 1
			numeros(5) = 1
			numeros(6) = 2
		ElseIf numeros(4) = 50 And numeros(3) < 49 Then
			numeros(3) += 1
			numeros(4) = numeros(3) + 1
			numeros(5) = 1
			numeros(6) = 2
		End If
		geracomb(contador + 1)
	Else
		Me.Text = contador
	End If


End Sub

Eu tenho este codigo. basicamente o que faz e fazer algumas combinaçoes do euromilhoes entre outros jogos. o problema e que ao correr o programa dá-me o seguinte erro. An unhandled exception of type 'System.StackOverflowException' occurred in WindowsApplication1.exe.

Alguem me consegue explicar o porque? Ele nao entra num ciclo infinito certo?

Cumprimentos

Posted

dei uma vista de olhos bem rápida pelo código mas não vejo nenhum ciclo infinito (apesar de não perceber o que o código faz)

onde está a chamada inicial da função ? assim como a função numeros ?

a chamada do geracomb está num button que esta assim:geracomb(1).

os numeros estao declarados no formload. numeros(0) = 1 : numeros(1) = 2 : numeros(2) = 3 : numeros(3) = 4 : numeros(4) = 5 : numeros(5) = 1 : numeros(6) = 1

depois o que o programa deve fazer é acresenta 1 valor ao numeros(6) até que ele seja 11, quando o for e se o numeros(5)<10 ele acresenta 1 aos numeros(5)....

o problema e que o programa dá-me aquele erro e nao sei de onde vem....

Posted

Nao sei se percebi o que queres fazer mas será que não obtinhas o resultado que queres com um ciclo FOR?

isto não te dá o que queres?

Private Sub geracomb(ByVal contador As Long)
		    for i=0 to 100000
				    If numeros(6) = 11 And numeros(5) <> 10 Then
						    numeros(5) += 1
						    numeros(6) = numeros(5) + 1
				    ElseIf numeros(6) < 11 Then
						    numeros(6) += 1
				    ElseIf numeros(5) = 10 And numeros(6) = 11 And numeros(4) < 50 Then
						    numeros(4) += 1
						    numeros(5) = 1
						    numeros(6) = 2
				    ElseIf numeros(4) = 50 And numeros(3) < 49 Then
						    numeros(3) += 1
						    numeros(4) = numeros(3) + 1
						    numeros(5) = 1
						    numeros(6) = 2
				    End If
end for
    End Sub
Posted (edited)

Nao sei se percebi o que queres fazer mas será que não obtinhas o resultado que queres com um ciclo FOR?

isto não te dá o que queres?

sim um ciclo for ou um while dão. Mas eu andava a testar como e que funcionavam as funçoes recursivas. nao sabia que existia um limite.

Muito obrigada pelos esclarecimentos

A solução é mesmo utilizar um ciclo. O Windows não permite 100K chamadas recursivas! Não sei de cor quantas são, mas acho que nem chega às 200.

Realmente nao sabia do limite de chamadas das funções ja agora aproveito para colocar outra pergunta. quando eu faço um ciclo for com 1000000 de calculos dentro do mesmo o programa deixa de responder. no entanto continua a fazer o que é devido. Isto é normal?

Edited by Leudassdf
Posted

Realmente nao sabia do limite de chamadas das funções ja agora aproveito para colocar outra pergunta. quando eu faço um ciclo for com 1000000 de calculos dentro do mesmo o programa deixa de responder. no entanto continua a fazer o que é devido. Isto é normal?

imagna que o teu computador só pode dar 3 saltos por segundo. quando pedes para saltar 90 vezes, ele irá saltar o mais rápido que pode, logo irá saltar 3 vezes por segundo durante 30 segundos.

se vier outra pessoa e pedir para o computador saltar mais 90 vezes, ele não vai conseguir saltar 6 vezes por segundo. primeiro salta os teus 30 e só depois salta os outros 30 segundos.

IRC : sim, é algo que ainda existe >> #p@p
Posted

Podes é fazer noutra thread para que o computador consiga responder a outras acções enquanto faz o calculo

o computador dá realmente essa ilusão, no entanto o que acontece é que terás os teus 30 segundos espalhados por mais tempo (isto é referência ao meu último post)

claro que não deixa de teres a vantagens de poderes fazer mais coisas, que irão responder mais lentamente que o normal porque pediste para dar o saltos

IRC : sim, é algo que ainda existe >> #p@p
Posted

Sim é verdade... a operação vai demorar mais tempo na realidade... mas não pendura o computador por todo esse tempo, e podes sempre mostrar uma msg a dizer que está a processar.

Os utilizadores quando esperam mais de 5s com o computador parado a pensar por uma operação começam à procura do botão do reset xD

Posted
Em 01/10/2012 às 23:32, thoga31 disse:

Não é preciso sair do P@P para se aprender algo sobre Background Workers. Eis o documento que me introduziu neste mundo porreiro 😉

https://wiki.portugal-a-programar.pt/dev_net/vb.net/backgroundworkers/

Excelente post.

Muito obrigada

Só nao compreendo uma situaçao. No meu programa eu tenho o seguinte codigo

 Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
       Dim max As Integer = e.Argument
       While contador < max

           '59399
           contador += 1
           If numeros(6) = 11 And numeros(5) <> 10 Then
               numeros(5) += 1
               numeros(6) = numeros(5) + 1
           ElseIf numeros(6) < 11 Then
               numeros(6) += 1
           ElseIf numeros(5) = 10 And numeros(6) = 11 And numeros(4) < 50 Then
               numeros(4) += 1
               numeros(5) = 1
               numeros(6) = 2
           ElseIf numeros(4) = 50 And numeros(3) < 49 Then
               numeros(3) += 1
               numeros(4) = numeros(3) + 1
               numeros(5) = 1
               numeros(6) = 2
           ElseIf numeros(3) = 49 And numeros(2) < 48 Then
               numeros(2) += 1
               numeros(3) = numeros(2) + 1
               numeros(4) = numeros(3) + 1
               numeros(5) = 1
               numeros(6) = 2
           ElseIf numeros(2) = 48 And numeros(1) < 47 Then
               numeros(1) += 1
               numeros(2) = numeros(1) + 1
               numeros(3) = numeros(2) + 1
               numeros(4) = numeros(3) + 1
               numeros(5) = 1
               numeros(6) = 2
           ElseIf numeros(1) = 47 And numeros(0) < 46 Then
               numeros(0) += 1
               numeros(1) = numeros(0) + 1
               numeros(2) = numeros(1) + 1
               numeros(3) = numeros(2) + 1
               numeros(4) = numeros(3) + 1
               numeros(5) = 1
               numeros(6) = 2
           End If
           BGW.ReportProgress(CInt((contador * 100) / max))
           '  table.Rows.Add(contador, numeros(0), numeros(1), numeros(2), numeros(3), numeros(4), numeros(5), numeros(6))

O que acontece e o seguinte. se eu nao colocar o BGW.ReportProgress(CInt((contador * 100) / max)) em comentario o programa continua nao respondendo. como se nao tivesse em thread. Qual a possivel razao?

O valor Max é de 60000000 mas mesmo que seja or ex 100000 acontece o mesmo.

Posted

Existe uma propriedade que faz com que o Background Worker faça report do progresso. Se essa propriedade não estiver a True, não o fará. Talvez seja esse o teu problema.

Essa propriedade está activa. Depois do codigo que deixei anteriormente tenho

 Debug.Print(contador)
           escreve.Write(contador & "]" & numeros(0) & "-" & numeros(1) & "-" & numeros(2) & "-" & numeros(3) & "-" & numeros(4) & "-" & numeros(5) & "-" & numeros(6) & vbNewLine)

So que se eu retirar o debug.print o programa bloqueia. como se a UTI estive-se ocupada.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.