Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Trubbel med tärningsfunktion

Postades av 2004-07-26 12:09:26 - Mikael Björkefall, i forum visual basic - allmänt, Tråden har 13 Kommentarer och lästs av 758 personer

Halloj!
Håller i min VB-kurs på Malmöhögskola på att programmera en tärningsfunktion.
De hela bygger egentligen på två tärningar vars värden slumpas fram med hjälp av Rnd().

Användaren av programmet ska också kunna ange hur många gånger de två tärningarna ska kastas och därefter få ett svar på hur många gånger värdena på de två tärningarna blev likadana och hur många gånger de fått dubbel sexor.

Mitt program genererar dessvärre 0 i de båda resultat rutorna hela tiden :(
Så här ser min kod ut:

<code>
Option Explicit

' Read indata
Function readData(ByVal intAmount As Integer) As Boolean
Dim txtRawValue As String
Dim blnOkey As Boolean

txtRawValue = txtDiceAmount.Text
If IsNumeric(txtRawValue) Then
intAmount = Int(txtRawValue)
blnOkey = True
Else
MsgBox "Du måste ange ett tal i siffror!"
txtDiceAmount.SetFocus
txtDiceAmount.SelStart = 0
txtDiceAmount.SelLength = Len(txtDiceAmount.Text)

blnOkey = False
End If

readData = blnOkey
End Function

' Hit the dice!
Function hitDice(ByVal rangeStart As Integer, ByVal rangeEnd As Integer) As Integer
Dim rndAmount As Integer
rndAmount = Int(Rnd * (rangeStart - rangeEnd + 1) + rangeEnd)

hitDice = rndAmount
End Function

' Get dice results
Function getResults(ByVal int6 As Integer, ByVal intSame As Integer, ByRef intAmount As Integer) As Boolean
Dim rndNumber1 As Integer
Dim rndNumber2 As Integer
Dim i As Integer
Dim tmp6 As Integer
Dim tmpSame As Integer

i = 1
tmp6 = 0
tmpSame = 0

Do While i <= intAmount
rndNumber1 = hitDice(1, 6)
rndNumber2 = hitDice(1, 6)

' Check Amounts
If rndNumber1 = rndNumber2 Then

' Same amount
If tmpSame = 0 Then
tmpSame = 1
Else
tmpSame = tmpSame + 1
End If

' Both 6?
If rndNumber1 = 6 And rndNumber2 = 6 Then

' Both 6, count
If tmp6 = 0 Then
tmp6 = 1
Else
tmp6 = tmp6 + 1
End If

End If
End If

i = i + 1
Loop

int6 = tmp6
intSame = tmpSame

getResults = True

End Function

Sub displayResult(ByRef intB6 As Integer, ByRef intS As Integer)
lblResultSame.Caption = CStr(intS)
lblResult6.Caption = CStr(intB6)

' Reset amount field
txtDiceAmount.Text = ""
End Sub

Private Sub cmdDice_Click()
Dim intDiceAmount As Integer
Dim intBoth6 As Integer
Dim intBothSame As Integer

' Read indata
If readData(intDiceAmount) Then
' Get result data
If getResults(intBoth6, intBothSame, intDiceAmount) Then
' Display results
Call displayResult(intBoth6, intBothSame)
End If
End If
End Sub

Private Sub Form_Load()
Randomize
End Sub
</code>


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 13:10:13 - Thomas Vanhaniemi

Du måste nog anropa Randomize före varje gång du anropar Rnd...

Mvh,
Thomas


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 13:11:12 - Mikael Jönsson

Din slumpfunktion är fel, det ska vara "(rangeEnd - rangeStart + 1)" och inte "(rangeStart - rangeEnd + 1)".
Och sen har du glömt ByRef i två funktioner där du ändrar variablerna.

Har satt ihop hela koden:

<code>
Option Explicit

' Read indata
Function readData(ByRef intAmount As Integer) As Boolean
Dim txtRawValue As String
Dim blnOkey As Boolean

txtRawValue = txtDiceAmount.Text
If IsNumeric(txtRawValue) Then
intAmount = Int(txtRawValue)
blnOkey = True
Else
MsgBox "Du måste ange ett tal i siffror!"
txtDiceAmount.SetFocus
txtDiceAmount.SelStart = 0
txtDiceAmount.SelLength = Len(txtDiceAmount.Text)

blnOkey = False
End If

readData = blnOkey
End Function

' Hit the dice!
Function hitDice(ByVal rangeStart As Integer, ByVal rangeEnd As Integer) As Integer
Dim rndAmount As Integer
rndAmount = Int(Rnd * (rangeEnd - rangeStart + 1) + rangeEnd)

hitDice = rndAmount
End Function

' Get dice results
Function getResults(ByRef int6 As Integer, ByRef intSame As Integer, ByRef intAmount As Integer) As Boolean
Dim rndNumber1 As Integer
Dim rndNumber2 As Integer
Dim i As Integer
Dim tmp6 As Integer
Dim tmpSame As Integer

i = 1
tmp6 = 0
tmpSame = 0

Do While i <= intAmount
rndNumber1 = hitDice(1, 6)
rndNumber2 = hitDice(1, 6)

' Check Amounts
If rndNumber1 = rndNumber2 Then

' Same amount
If tmpSame = 0 Then
tmpSame = 1
Else
tmpSame = tmpSame + 1
End If

' Both 6?
If rndNumber1 = 6 And rndNumber2 = 6 Then

' Both 6, count
If tmp6 = 0 Then
tmp6 = 1
Else
tmp6 = tmp6 + 1
End If

End If
End If

i = i + 1
Loop

int6 = tmp6
intSame = tmpSame

getResults = True

End Function

Sub displayResult(ByRef intB6 As Integer, ByRef intS As Integer)
lblResultSame.Caption = CStr(intS)
lblResult6.Caption = CStr(intB6)

' Reset amount field
txtDiceAmount.Text = ""
End Sub

Private Sub cmdDice_Click()
Dim intDiceAmount As Integer
Dim intBoth6 As Integer
Dim intBothSame As Integer

' Read indata
If readData(intDiceAmount) Then
' Get result data
If getResults(intBoth6, intBothSame, intDiceAmount) Then
' Display results
Call displayResult(intBoth6, intBothSame)
End If
End If
End Sub

Private Sub Form_Load()
Randomize
End Sub
</code>

/Micke


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 13:22:04 - Thomas Vanhaniemi

Hmm, din hitDice funktion är ändå lite fel...

<code>
' Hit the dice!

Function hitDice(ByVal rangeStart As Integer, ByVal rangeEnd As Integer) As Integer
Dim rndAmount As Integer
Randomize()
rndAmount = Int(Rnd * (rangeEnd - rangeStart + 1) + rangeStart)

hitDice = rndAmount
End Function
</code>

Mvh,
Thomas


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 13:45:36 - Sven Åke Persson

Randomize behöver bara startas en gång som han gjort i Form_Load
Sen tycker jag att du skall ändra alla Integer till Long.
Gillar inte kommentaren om ByRef kan ställa till problem om du ändrar värdet i någon Funktion.
Skicka ByVal som du gjort det är säkrast för att ej komma i konflikt med Alias vi kompilering.


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 16:59:09 - Mikael Björkefall

Det där fungerade fint! Tack..
Vad exakt är det du har ändrat? Något mer än hitDice() funktionen och lite ByVal till ByRef?
Hur ska jag förstå mer exakt när jag ska använda ByRef resp. ByVal?


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 17:52:39 - Mikael Jönsson

Jag ändrade bara hitDice, getResults och readData.

Här får du reda på vad ByRef och ByVal är: FAQ:ByVal och ByRef förklarat!

/Micke


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 20:05:41 - Sven Åke Persson

>Hur ska jag förstå mer exakt när jag ska använda ByRef resp. ByVal?

Enl min uppfattning kan du alltid köra med ByVal.Kan i skrivande stund inte
se nått fall där det skulle vara en fördel att kör ByRef.Vi har diskuterat detta förut
och kom då på att det finns något fall där ByRef skulle passa bättre.
Om du kollar API funktionerna som VB kan använda så måste du i 99 % av fallen skicka ByVal
ByRef är default i VB så det behöver du inte skriva ut.


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 20:44:11 - Mikael Jönsson

Svenpon, om du provar hans kod med ByVal så kommer du se att det inte fungerar. Vet dock inte varför.

/Micke


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 21:43:34 - Niklas Jansson

Jag förstår inte riktigt vad som är problemet - ni vet väl vad ByRef och ByVal betyder?
Då är det ju bara att tänka vad som är lämpligt.

För små datatyper, integer, long, double, etc. så är det ingen prestandavinst med att använda ByRef, men det är det för "tyngre" datatyper, som användarskapade eller klasser. Men å andra sidan skickas de väl alltid som ByRef, om jag inte minns fel?

Skall värdet ändras använder man ByRef, annars ByVal, fast oftast är det bättre att försöka ha en funktion som returnerar värden istället.


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-26 22:55:50 - Sven Åke Persson

>Men å andra sidan skickas de väl alltid som ByRef, om jag inte minns fel?

Ja det är riktig , där satt den tex. måste du alltid skicka en Array ByRef.


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-28 11:09:52 - Jan Bulér

Med ByVal så skapas en kopia av det värde du skickade som parameter (ByVal = By Value, alltså skickas endast variabelns värde)

Med ByRef så skickas en referens till din variabel och ev ändringar av värdet kommer att påverka originalvariabeln.

ex.

<code>
Sub exByVal(ByVal x as integer)
'Variabeln x har en egen minnesarea och innehåller samma
'värde som den variabel som användes i anropet
x = x + 10
End Sub

Sub exByRef(ByRef x as integer)
'Variabeln x använder samma minnesarea som den variabel som användes i anropet
'och en ändring av värdet på x ändrar därför värdet på den variabel som användes som parameter
'I VB kan exByRef(ByRef x as integer) även skrivas som exByRef( x as integer) då default är ByRef
x = x + 10
End Sub

Sub Main()
Dim y As Integer
y = 1
Call exByVal(y)
Debug.Print y 'y = 1,

Call exByRef(y)
Debug.Print y 'y = 11,
End Sub
</code>


Din function
Function getResults(ByVal int6 As Integer, ByVal intSame As Integer, ByRef intAmount As Integer) As Boolean

bör i ditt fall skrivas som
Function getResults(int6 As Integer, intSame As Integer, ByVal intAmount As Integer) As Boolean


Hoppas det klarnade lite

Janne


Svara

Sv: Trubbel med tärningsfunktion

Postades av 2004-07-29 20:47:11 - Sven Åke Persson

Just så, undvik ByRef om du vill ha kontroll över förloppen. Kör allt Lokalt så länge det går.
Det blir nästan hopplöst att debugga om man inte har kontroll på vem som ändrar variabelns värde.


Svara

Nyligen

  • 13:18 Website builder
  • 17:03 Getmancar your go-to carsharing
  • 14:07 Games
  • 17:54 Vegastars New Zealand
  • 16:56 Verde Casino Danmark
  • 13:54 Vegastars: Top Australian Online C
  • 21:28 Chicken Road Casino Game
  • 21:21 1xBet Promo Code 2025

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 571 446
27 965
271 786
922
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies