Jag befinner mig i ett stadie då jag kan vissa saker ganska bra och många andra inte ALLS! Så jag satte mig idag och tänkte fräscha upp lite gamla saker jag gjort när jag började lära mig ASP/VBScript. En tidig sak jag gjorde var ett script som skrev ut hur många ggr det skulle ta att slå t.ex. 12 med 2 6:or. Jag optimierade koden idag, och låter nu även användaren mata in egna värden för antal tärningar och antal sidor på dessa. Men så måste jag ju även kolla så att det inte matas in några tecken... Provade med IsNumeric, men får det härliga meddelandet:
Type mismatch: '[string: "f"]'
If isEmpty(intAntal) or not isNumeric(intAntal) or isEmpty(intSidor) or not isNumeric(intSidor) then
Response.Write "Du har inte skickat några giltliga uppgifter ännu"
Else
intAntal = clng(intAntal)
intSidor = clng(intSidor)
if intAntal < 0 or intSidor < 0 then
response.write "Värdena måste vara positiva"
else
'allt ok
end if
end if
------------------ essentitia preter non sans multiplicandum
...Det funkar ju.. Men varför? Det hela känns så ologiskt. Varför ska man konvertera variablerna EFTER raden som genererar felet? Jag fattar ingenting. Och varför ska den konverteras över huvudtaget? För att den skickas som en sträng?
------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"
Ursäkta om jag verkar tjatig, men nu diskuterar du med en person vars första rader VBScript bankades in med hjälp av IDGs ASP-kurs (VÄLDIGT grundläggande). Skulle du kunna utveckla det där lite grand? :)
Implicit? Men alltså.. om jag konverterar till Long precis efter jag deklarerat variablerna så får jag ett liknande felmeddelande. Varför då?
Frågar man ingenting, får man ingenting veta
------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"
Ahh... nu tror jag det börjar klarna :)
Förenklat: Det jag försöke göra var att jämföra två olika datatyper, en string (eller kanske variant) och en int? Jag jämförde alltså ett tecken och ett värde? Om det är så, varför kan jag inte konvertera variablerna i början av koden, efter jag ? Eller gäller konverteringen bara operationen som följer direkt efter?
------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"
Nu förstår jag inte vad du menar, t.ex. när du pratar om tecken och värde.
Alla värden är av typen variant, men man kan sätta en subtyp (int string etc). De olika subtyperna tillåter olika värdemängder och om man konverterar från en subtyp till annan så kontrolleras att värdet tillhör den tillåtna värdemängden.
------------------ essentitia preter non sans multiplicandum
Hmm.. om jag säger så här då?
1. Är anledningen till att det inte fungerade från början att jag försökte jämföra två olika datatyper som inte gick att jämföras?
2. I så fall, varför genereras ett fel om man försöker konvertera variablerna i början av koden?
3. Går det inte att jämföra en sträng som innehåller siffra, tecken (eller hur jag nu ska beskriva det) med ett värde?
Exempel:
a = "1"
b = 1
If a = 1 Then
Tack för att du tar dig tid :)
------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"
Aha.. då fattar jag allt FÖRUTOM den fråga jag ställt 3 ggr (tror jag) :)
Varför fungerar det inte om man konverterar variablerna i början av koden istället?
<%
Dim intAntal, intSidor, intVillHa, intUtfall, intKast
intAntal = Trim(Request.Form("Antal"))
intSidor = Trim(Request.Form("Sidor"))
' FLYTTA HIT: intAntal = CLng(intAntal)
' FLYTTA HIT: intSidor = CLng(intSidor)
intUtfall = 0
intKast = 0
With Response
.Write "<form method=post action=dice.asp>"
.Write " <input type=text size=3 name=Antal value=" & intAntal & "> T "
.Write " <input type=text size=3 name=Sidor value=" & intSidor & ">"
.Write " <input type=submit value=Kasta>"
.Write "</form>"
End With
If isEmpty(intAntal) Or Not IsNumeric(intAntal) Or IsEmpty(intSidor) Or Not IsNumeric(intSidor) Then
Response.Write "Du har inte skickat några giltliga uppgifter ännu"
Else
'KLIPP UT intAntal = CLng(intAntal)
'KLIPP UT intSidor = CLng(intSidor)
If intAntal < 0 or intSidor < 0 then
response.write "Värdena måste vara positiva"
Else
intVillHa = intAntal*intSidor
Do Until intUtfall = intVillHa
Randomize
intUtfall = Round(Rnd * intSidor * intAntal)
Response.Write intUtfall & "<br>"
intKast = intKast + 1
Loop
End If
Response.Write "<br>Det behövdes <b>" & intKast & "</b> kast med <b>" & intAntal & "T" & intSidor & "</b> för att slå <b>" & intVillHa & "</b>."
End If
%>
------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"
Det var inget. Nu märkte jag att det fungerar utmärkt utan att konvertera variablerna till en annan subtyp.
Men tack ska du ha, kul att få svar så snabbt och ofta :)
------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"