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
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
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
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
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
Kiitos todella paljon avusta :)
“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
Niin sama juttu tässä koodissa että kuinka saan että se lajittelee max 10 palloa?