Jump to content
Chamuanza

[Resolvido] Erro no Load da Form

Recommended Posts

Chamuanza

Um Bem Aja a Todos

Estou a criar um jogo de Cartas e deparo-me com este erro "An unhandled exception of type 'System.StackOverflowException' occurred in Jogo_King.exe" que so apareceu a partir do prenchimento da picturebox25

Estou a utilizar este código - Testei com os dois métodos, com o ciclo For Next e com PictureBox1.Image linha a linha

Devo estar a fazer algo mal. Agradecia uma dica

Obrigado

//
Public Class Form1
   Private imgs As List(Of Integer) = New List(Of Integer)  'Variavel da Lista d imageList
   Private Function getNextNewImage(ByRef T As List(Of Integer), ByVal limit As Integer) As Integer

    Dim distribuirCartas As New Random
    Dim randomNumber As Integer
    randomNumber = distribuirCartas.Next(0, limit)
    If T.Contains(randomNumber) Then
	    Return getNextNewImage(T, limit)
    End If
    T.Add(randomNumber)
    Return randomNumber
   End Function
   Private Sub btnSair_Click(sender As Object, e As EventArgs) Handles btnSair.Click
    Me.Close()
   End Sub
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    'PictureBox1.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox2.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox3.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox4.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox5.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox6.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox7.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox8.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox9.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox10.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox11.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox12.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox13.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox14.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox15.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox16.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox17.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox18.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox19.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox20.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox21.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox22.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox23.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox24.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    'PictureBox25.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    ''PictureBox26.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    ''PictureBox27.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    ''PictureBox28.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    ''PictureBox29.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    ''PictureBox30.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    Dim Carta() As PictureBox = New PictureBox() {PictureBox1, PictureBox2, PictureBox3, PictureBox4, PictureBox5, PictureBox6, PictureBox7, PictureBox8, PictureBox9, _
												  PictureBox10, PictureBox11, PictureBox12, PictureBox13, PictureBox14, PictureBox15, PictureBox16, PictureBox17, PictureBox18, _
												  PictureBox19, PictureBox20, PictureBox21, PictureBox22, PictureBox23, PictureBox24, PictureBox25}
    ', PictureBox26, PictureBox27, PictureBox28, _
    ' PictureBox29, PictureBox30, PictureBox31, PictureBox32}

    For X As Integer = 1 To 25
	    Dim Y As PictureBox = CType(Me.Controls("PictureBox" & X), PictureBox)
	    Y.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
    Next
   End Sub

End Class

Share this post


Link to post
Share on other sites
ribeiro55

Este tipo de problemas é facílimo de apanhar com step-debug.

Mete um breakpoint (F9) perto da linha que suspeitas estar com problema e vai executando instruções (F8)

StackOverflow deve-se tipicamente a um ciclo sem fim ou chamadas recursivas mal "guardadas".

Meto as minhas fichas todas na chamada recursiva que tens lá em cima, repara:

Estás a chamar a própria função sempre que a lista contenha um número que já saiu.

Isto já de si é mau porque num cenário verdadeiramente aleatório poderia nunca calhar um número que não estivesse na lista, e lá saia por StackOverflow de vez em quando.

A recursão condicionada por um acontecimento aleatório não é boa ideia. Sugiro algo bem mais simples, como um ciclo While:

randomNumber = distribuirCartas.Next(0, limit)
While T.Contains(randomNumber)
   randomNumber = distribuirCartas.Next(0, limit)
End While

Agora, até mesmo com o While (principalmente com um While) tens de te proteger daquilo que está potencialmente a "lixar-te" o esquema.

Se fizeres step-debug deverás chegar à conclusão que mesmo com a lista toda preenchida, ele continua a entrar no ciclo até morrer.

Repara que não estás a proteger-te contra o caso da lista T já ter tantos items quanto o valor na tua variável limit.

Quando o número de itens na lista que estás a passar por referência é igual ao valor de limit, não vai entrar mais nenhum, e já existem todos.

O teu T.contains vai avaliar sempre "True".

Resolves isto com um simples:

If T.Count = limit Then Exit Function

Algumas sugestões:

1. Se tens o array de pictureboxes, para quê o ciclo numérico e a conversão de tipo?

Podes obter o mesmo assim:

For Each pb As PictureBox In Cartas
   pb.Image = ImageList1.Images(getNextNewImage(imgs, ImageList1.Images.Count))
Next

2. Tira o New Random da função getNextNewImage e mete-o num âmbito geral, ou dá-lhe uma seed baseada na hora do sistema.

Como está, vai gerar sempre as mesmas sequências "aleatórias". Irias reparar que saiam sempre as mesmas cartas quando paravas e arrancavas a aplicação.

3. Não precisas de passar a lista imgs por referência: ela está fora do âmbito do método Form_Load e getNextNewImage. Não a precisas de passar de todo. Podes aceder-lhe normalmente.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.