Leudassdf Posted September 29, 2012 at 11:09 AM Report #477019 Posted September 29, 2012 at 11:09 AM 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
HappyHippyHippo Posted September 29, 2012 at 11:30 AM Report #477024 Posted September 29, 2012 at 11:30 AM (edited) 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 ? Edited September 29, 2012 at 11:31 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted September 29, 2012 at 11:37 AM Author Report #477026 Posted September 29, 2012 at 11:37 AM 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....
thoga31 Posted September 29, 2012 at 08:44 PM Report #477079 Posted September 29, 2012 at 08:44 PM (edited) O erro ocorre porque excedeste o limite de chamadas recursivas: A StackOverflowException exception is thrown when the execution stack overflows by having too many nested method calls. in http://msdn.microsoft.com/en-us/library/w6sxk224(v=vs.80).aspx Edited September 29, 2012 at 08:44 PM by thoga31 Knowledge is free!
Kline777 Posted September 29, 2012 at 08:55 PM Report #477081 Posted September 29, 2012 at 08:55 PM 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
thoga31 Posted September 29, 2012 at 09:08 PM Report #477085 Posted September 29, 2012 at 09:08 PM 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. Knowledge is free!
Leudassdf Posted September 30, 2012 at 09:25 AM Author Report #477126 Posted September 30, 2012 at 09:25 AM (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 September 30, 2012 at 09:23 AM by Leudassdf
HappyHippyHippo Posted September 30, 2012 at 09:40 AM Report #477129 Posted September 30, 2012 at 09:40 AM 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 Portugol Plus
Kline777 Posted October 1, 2012 at 08:17 AM Report #477275 Posted October 1, 2012 at 08:17 AM Podes é fazer noutra thread para que o computador consiga responder a outras acções enquanto faz o calculo
HappyHippyHippo Posted October 1, 2012 at 09:25 AM Report #477286 Posted October 1, 2012 at 09:25 AM 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 Portugol Plus
Kline777 Posted October 1, 2012 at 09:56 AM Report #477290 Posted October 1, 2012 at 09:56 AM 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
Leudassdf Posted October 1, 2012 at 01:40 PM Author Report #477313 Posted October 1, 2012 at 01:40 PM Podes é fazer noutra thread para que o computador consiga responder a outras acções enquanto faz o calculo Como assim fazer noutra thread? Nao percebi...
Kline777 Posted October 1, 2012 at 01:53 PM Report #477316 Posted October 1, 2012 at 01:53 PM https://pt.wikipedia.org/wiki/Thread_(ciência_da_computação) Desculpa dar só assim o link a seco mas estou enterrado em trabalho agora 😕
thoga31 Posted October 1, 2012 at 09:32 PM Report #477362 Posted October 1, 2012 at 09:32 PM 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/ Knowledge is free!
Leudassdf Posted October 1, 2012 at 11:02 PM Author Report #477381 Posted October 1, 2012 at 11:02 PM Em 01/10/2012 às 15:53, Kline777 disse: https://pt.wikipedia.org/wiki/Thread_(ciência_da_computação) Desculpa dar só assim o link a seco mas estou enterrado em trabalho agora 😕 obrigada a mesma. deu para entender algumas coisas...
Leudassdf Posted October 1, 2012 at 11:16 PM Author Report #477384 Posted October 1, 2012 at 11:16 PM 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.
thoga31 Posted October 2, 2012 at 03:08 PM Report #477441 Posted October 2, 2012 at 03:08 PM 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. Knowledge is free!
Leudassdf Posted October 2, 2012 at 07:56 PM Author Report #477476 Posted October 2, 2012 at 07:56 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now