Difference between revisions of "NO/Documentation/BASIC Guide/Conversion Functions (Runtime Library)"
| Line 75: | Line 75: | ||
Hvis v er et heltall vil CSng(v) og CDbl(v) ikke endre verdien slik  | Hvis v er et heltall vil CSng(v) og CDbl(v) ikke endre verdien slik  | ||
at CDbl(4) blir 4.0.  | at CDbl(4) blir 4.0.  | ||
| − | |||
Enkelte konverteringer blir meningsløse og  | Enkelte konverteringer blir meningsløse og  | ||
| Line 95: | Line 94: | ||
End If  | End If  | ||
</source>  | </source>  | ||
| − | + | For [[NO/Documentation/BASIC_Guide/Date_and_Time_(Runtime_Library)|datatypen Date fins måter å gardere seg mot feil på]].  | |
| − | + | Ellers er det ikke alle har en slik is..() tester.  | |
En selvlaget boolsk tester er:  | En selvlaget boolsk tester er:  | ||
<source lang="oobas">  | <source lang="oobas">  | ||
Latest revision as of 09:16, 15 December 2009
Ved utregning skal alle operandene ha samme type. Selv om interpreteren konverterer alle operandene til den best egnede typen, kan en eksplisitt konvertere med funksjoner.
Et eksempel på slik (stilltiende) implisitt konvertering er:
Dim A As String
Dim B As Integer
B = 101 
A = B
I uttrykket "A = B" blandes typer, da man forsøker å legge et heltall (B) inn i en string (A). Interpreteren konverterer derfor (implisitt) B til en string, slik at det er "101" som legges inn i A.
At dette er "risikabelt" illustreres under:
Dim A As String
Dim B As Integer
Dim C As Integer
B = 2
C = 3
A = B + C
Vil strengen A få verdien "5" eller "2"+"3", altså en kobling som gir resultatet "23"? Ved bruk av varianter (variabler som ikke har typen angitt) er resultatene av og til uklare, som i:
Dim A 
Dim B 
Dim C 
B = 2
C = "3"
A = B + C
A blir enten 2 + 3 = 5 (sum av to heltall), eller "2" + "3" = "23" (summen av to strenger).
Uforutsigbarhet er ikke ønskelig. En kan la være å bruke variant som datatype, altså alltid angi datatype. Og en kan bruke funksjoner for eksplisitt konvertering:
- CStr(v) gir en String
 - CInt(v) gir en Integer
 - CLng(v) gir en Long
 - CSng(v) gir en Single
 - CDbl(v) gir en Double
 - CBool(v) gir en Boolean
 - CDate(v) gir en Date
 
Det som skal konverteres (v) blir da etter "beste evne" konvertert.
Dim A As String
Dim B As Integer
Dim C As Integer
B = 2 
C = 3
A = CStr(B + C)         ' gir "t" (heltallene adderes før konvertering)
A = CStr(B) + CStr(C)   ' gir "23" (tallene konverteres før de "adderes")
Konvertering kan også endre presisjon. Hvis v er et desimaltall vil CInt(v) ta bort desimalene, altså redusere presisjon. Den vil dog først avrunde, slik at CInt(4.2) blir 4 og CInt(-3.99) blir -4. Hvis v er et heltall vil CSng(v) og CDbl(v) ikke endre verdien slik at CDbl(4) blir 4.0.
Enkelte konverteringer blir meningsløse og vil avstedkomme feil (som bør handteres). Eksempel er CDate("test") eller CBool("test"). Ved å sjekke på forhånd kan disse unngås. Slike testfunksjoner er boolske:
- IsNumeric(v) sjekker om v er et tall
 - IsDate(v) sjekker om v er en dato
 - IsArray(v) sjekker om v er en tabell
 
Ofte brukes disse når man er usikker på om inndata er brukbare
Dim v 
If IsNumeric(brukerInput) Then
  v = brukerInput
Else
  v = 0
  MsgBox "Feil type data (skal være tall)"
End If
For datatypen Date fins måter å gardere seg mot feil på. Ellers er det ikke alle har en slik is..() tester. En selvlaget boolsk tester er:
Function isBoolean( v ) As Boolean
  On Error Goto feilTakler: ' aktiver feiltakling
  Dim dummy As Boolean
  dummy = v                 ' dette kan gå galt!
  isBoolean = True          ' gikk fint (hurra!)
  On Error Goto 0           ' deaktiver 
  Exit Sub                  ' avslutt!
  feilTakler:
    isBoolean = False
  On Error Goto 0           ' deaktiver
End Function
Den "risikable" del av denne testeren forsøker å legge den ukjente datatypen inn i en boolsk variabel "dummy". Hvis dette feiler startes feilTakler.
| Content on this page is licensed under the Public Documentation License (PDL). |