Lotto ohjelma VB:llä

Olen tekemässä lotto ohjelmaa ja tämän koodin pitäisi lajitella arvotut numerot numero järjestykseen, mutta se ei toimi.
Mitä vikaa tässä koodissa siis on?

Run-time error '13':
Type mismatch

Sub Lajittele()
MsgBox Pallot
liLen = Pallot
For Y% = 0 To Pallot
numbers(Y%) = lblNumber(Y%).Caption 'Tässä rivissä se näyttää että olisi jokin vika?
Next
Do
liSwitch = 0
For liX = 0 To liLen - 2
If numbers(liX) > numbers(liX 1) Then
liTemp = numbers(liX)
numbers(liX) = numbers(liX 1)
numbers(liX 1) = liTemp
liSwitch = 1
End If
Next liX
liLen = liLen - 1
Loop Until liSwitch = 0
For Y% = 0 To Pallot
lblNumber(Y%).Caption = numbers(Y%)
Next
End Sub
7995
Äänestä

Muut lukivat myös

Vastaukset 7

Vanhimmat

Vaikea arvoida kun ei näy miten käsittelet
koodia ennen tätä proseduuria.

Virheilmoitus ei kuitenkaan suoraan viittaa
"muistihäiriöön" mutta jollet varaa muistia
matriisille numbers() muuaalla koodissasi niin kokeile:

MsgBox Pallot
liLen = Pallot
For Y% = 0 To Pallot

ReDim numbers(Y) 'TÄSSÄ MUUTOS

numbers(Y%) = lblNumber(Y%).Caption 'Tässä rivissä se näyttää että olisi jokin vika?
Next
Do
.
.
.
jne

Äänestä

Tässä vielä vähän tarkemmin koodiisi.


Oletan, että sinulla on blNumber() indexoitu
0 - 6 .

Oletan myös että lotossasi on arvottu 7 palloa.

Näillä tiedoilla alla olevan koodin tulisi toimia.


Sub Lajittele()

pallot = 7
'MsgBox pallot
liLen = pallot
Dim numbers() As Integer
For y = 0 To pallot - 1
ReDim Preserve numbers(y)
numbers(y) = lblNumber(y).Caption Next
Do
liSwitch = 0
For liX = 0 To liLen - 2
If numbers(liX) > numbers(liX 1) Then
liTemp = numbers(liX)
numbers(liX) = numbers(liX 1)
numbers(liX 1) = liTemp
liSwitch = 1
End If
Next liX
liLen = liLen - 1
Loop Until liSwitch = 0
For y = 0 To pallot - 1
lblNumber(y).Caption = numbers(y)
Next
end sub

Äänestä
  • Nyt tämä toimii kun on arvottu 7 palloa, mutta lotto ohjelmassani on myöskin järjestelmä eli siinä voi arpoa valinnan mukaan 7, 8, 9 tai 10 palloa jolloin se ei enää lajittelekkaan niitä numerojärjestykseen jos otan siis enemmän kuin 7 palloa.

    Äänestä

  • 123 kirjoitti:

    Nyt tämä toimii kun on arvottu 7 palloa, mutta lotto ohjelmassani on myöskin järjestelmä eli siinä voi arpoa valinnan mukaan 7, 8, 9 tai 10 palloa jolloin se ei enää lajittelekkaan niitä numerojärjestykseen jos otan siis enemmän kuin 7 palloa.

    Ok.
    Pallojen määrällä esimerkissäsi
    ei ole merkitystä.

    Kutsu Lajittele -proseduuria
    sieltä missä suoritat pallojen
    arvonnan.
    (siellä sinulla on tieto
    montako palloa on arvottu)


    Eli kutsu on

    Lajittele 7

    ...jos arvottu 7 palloa






    Sub Lajittele(pallot as single) 'määrittele pallot muuttuja sulkujen sisään

    MsgBox pallot
    liLen = pallot
    Dim numbers() As Integer
    For y = 0 To pallot - 1
    ReDim Preserve numbers(y)
    numbers(y) = lblNumber(y).Caption
    Next
    Do
    liSwitch = 0
    For liX = 0 To liLen - 2
    If numbers(liX) > numbers(liX 1) Then
    liTemp = numbers(liX)
    numbers(liX) = numbers(liX 1)
    numbers(liX 1) = liTemp
    liSwitch = 1
    End If
    Next liX
    liLen = liLen - 1
    Loop Until liSwitch = 0
    For y = 0 To pallot - 1
    lblNumber(y).Caption = numbers(y)
    Next
    end sub

    Äänestä

  • sasu kirjoitti:

    Ok.
    Pallojen määrällä esimerkissäsi
    ei ole merkitystä.

    Kutsu Lajittele -proseduuria
    sieltä missä suoritat pallojen
    arvonnan.
    (siellä sinulla on tieto
    montako palloa on arvottu)


    Eli kutsu on

    Lajittele 7

    ...jos arvottu 7 palloa






    Sub Lajittele(pallot as single) 'määrittele pallot muuttuja sulkujen sisään

    MsgBox pallot
    liLen = pallot
    Dim numbers() As Integer
    For y = 0 To pallot - 1
    ReDim Preserve numbers(y)
    numbers(y) = lblNumber(y).Caption
    Next
    Do
    liSwitch = 0
    For liX = 0 To liLen - 2
    If numbers(liX) > numbers(liX 1) Then
    liTemp = numbers(liX)
    numbers(liX) = numbers(liX 1)
    numbers(liX 1) = liTemp
    liSwitch = 1
    End If
    Next liX
    liLen = liLen - 1
    Loop Until liSwitch = 0
    For y = 0 To pallot - 1
    lblNumber(y).Caption = numbers(y)
    Next
    end sub

    Kiitos todella paljon avusta :)

    Äänestä

“Run-time error '13': Type mismatch”

Kun sijoitat tekstiä numeromuuttujaan, eli numbers() on numeromuuttuja ja kontrollin arvo .Caption on tekstiä, tulee tuo virhe. Muuta rivi seuraavaksi: numbers(Y%) = val(lblNumber(Y%).Caption)


Mutta jos sinulla on ruudussa seitsemän Label-kontrollia, joiden indeksit on 0..6, suosittelen käytettäväksi yksinkertaisempaa lajittelurutiinia. Itse käytän tätä yleensä, koska se on helppo muistaa ulkoa. Suurilla tietomäärillä tämä on hitaampi, mutta normaaliohjelmissa tärkeämpää on selkeä koodi.

Eli tässä Lajittelu, joka järjestää arvot suoraan Label-kontrolleissa ilman aputaulukkoa:

Sub lajittele()
Dim I%, J%, n% ’nämä Integerejä
Dim Apu As Variant

n = 6 'lukumäärä 0..6

For I = 0 To n - 1
For J = I + 1 To n
If Val(Me.lblNumber(J)) < Val(Me.lblNumber(I)) Then
Apu = Me.lblNumber(J)
Me.lblNumber(J) = Me.lblNumber(I)
Me.lblNumber(I) = Apu
End If
Next J
Next I

End Sub

Äänestä
  • Niin sama juttu tässä koodissa että kuinka saan että se lajittelee max 10 palloa?

    Äänestä

Kommentoi aloitusta


123 kirjoitti:

Olen tekemässä lotto ohjelmaa ja tämän koodin pitäisi lajitella arvotut numerot numero järjestykseen, mutta se ei toimi.
Mitä vikaa tässä koodissa siis on?

Run-time error '13':
Type mismatch

Sub Lajittele()
MsgBox Pallot
liLen = Pallot
For Y% = 0 To Pallot
numbers(Y%) = lblNumber(Y%).Caption 'Tässä rivissä se näyttää että olisi jokin vika?
Next
Do
liSwitch = 0
For liX = 0 To liLen - 2
If numbers(liX) > numbers(liX 1) Then
liTemp = numbers(liX)
numbers(liX) = numbers(liX 1)
numbers(liX 1) = liTemp
liSwitch = 1
End If
Next liX
liLen = liLen - 1
Loop Until liSwitch = 0
For Y% = 0 To Pallot
lblNumber(Y%).Caption = numbers(Y%)
Next
End Sub

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu