Overflow hjääälp!|Programmering / Grafisk formgivning|Forum|Nordichardware

Search
Forum Scope


Match



Forum Options



Minimum search word length is 3 characters - maximum search word length is 84 characters
Lost password?
The forums are currently locked and only available for read only access
sp_Feed sp_TopicIcon
Overflow hjääälp!
pompougnac
Member
Medlem
Forum Posts: 3109
Member Since:
January 20, 2003
sp_UserOfflineSmall Offline
1
September 12, 2003 - 1:31 pm
sp_Permalink sp_Print

Varför står det:

Run-time error '6':

Overflow

När jag skriver in ett värde i Text1.Text som ÖVERSTIGER 50???

Private Sub Command4_Click()
If Val(Text1.Text) < 11 Then
Text6.Text = 1000 * Val(Text1.Text) + (Val(Text3.Text) * 20) + Val(Text4.Text)
Else
If Val(Text1.Text) < 21 Then
Text6.Text = 1000 * 10 + 900 * (Val(Text1.Text) - 10) + (Val(Text3.Text) * 20) + Val(Text4.Text)
Else
If Val(Text1.Text) < 51 Then
Text6.Text = 1000 * 10 + 900 * 10 + 800 * (Val(Text1.Text) - 20) + (Val(Text3.Text) * 20) + Val(Text4.Text)
Else
If Val(Text1.Text) < 101 Then
Text6.Text = 1000 * 10 + 900 * 10 + 800 * 30 + 650 * (Val(Text1.Text) - 50) + (Val(Text3.Text) * 20) + Val(Text4.Text)
Else
If Val(Text1.Text) > 100 Then
Text6.Text = 1000 * 10 + 900 * 30 + 800 * 30 + 650 * 50 + 450 * (Val(Text1.Text) - 100) + (Val(Text3.Text) * 20) + Val(Text4.Text)
End If
End If
End If
End If
End If
End Sub

då måste det vär vara nåt fel på 4e o 5e if-satserna???
jättetacksam om hjälp!!

yojimbo3D
It’s a first time for everybody
Medlem
Forum Posts: 8
Member Since:
September 28, 2002
sp_UserOfflineSmall Offline
410945
September 12, 2003 - 2:04 pm
sp_Permalink sp_Print

Du får köra lite beräkningar åt gången, exempel:
Dim majs, majs2 As Long
majs = (1000 * 10) + (900 * 10)
majs = majs + (800 * 30)
majs2 = 650 * (Int(Text1.Text) - 50) + (Int(Text3.Text) * 20) + Int(Text4.Text)
Text6.Text = majs + majs2

Givetvis går att göra på andra sätt, men det funkar iaf 🙂
tips: använd elseif istället för if följt av else

pompougnac
Member
Medlem
Forum Posts: 3109
Member Since:
January 20, 2003
sp_UserOfflineSmall Offline
411000
September 12, 2003 - 3:45 pm
sp_Permalink sp_Print

förstår inte riktigt men... blir min kod för mycket för datorn att hantera eller?
finns det andra enkla sätt att åtgärda detta på?

yojimbo3D
It’s a first time for everybody
Medlem
Forum Posts: 8
Member Since:
September 28, 2002
sp_UserOfflineSmall Offline
411017
September 12, 2003 - 4:18 pm
sp_Permalink sp_Print

Jag tror det har nåt med '*'-operatorn att göra, att den använder sig automagiskt av integers eller nåt.

En annan lösning är att sätta 'CLng' framför talen, exempel:
(CLng(1000) * 10) + (CLng(900) * 10) + (CLng(800) * 30)
Detta fungerar dock endast om resultatet läggs i en variabel av typen long, dvs att man inte lägger resultatet i textfältet direkt.

Avatar
dae
Kommer du hit ofta?
Medlem
Forum Posts: 410
Member Since:
July 28, 2003
sp_UserOfflineSmall Offline
411400
September 13, 2003 - 9:43 am
sp_Permalink sp_Print

Jag tror att VB's Integers är 16-bitars, dvs. de kan representera tal -32768 <= x <= 32767. Medan Long är 32-bitars klarar av tal 2147483648 <= x <= 2147483647. Dina uträkningar i fall 4 och 5 blir större än 32767, därav "overflow".

yojimbo3D
It’s a first time for everybody
Medlem
Forum Posts: 8
Member Since:
September 28, 2002
sp_UserOfflineSmall Offline
411584
September 13, 2003 - 1:09 pm
sp_Permalink sp_Print

Textfälten har inte den begränsningen, de klarar av större tal än 32767 (precis som Long).
Däremot klarar inte *-operatorn av att summan blir högre.
Därför Fungerar inte:
Dim x as Long
x = 5000*500
Men följande fungerar:
Text1.Text = CLng(3000) * 500
För då tvingar man *-operatorn att använda Long på summan.

Avatar
dae
Kommer du hit ofta?
Medlem
Forum Posts: 410
Member Since:
July 28, 2003
sp_UserOfflineSmall Offline
411601
September 13, 2003 - 1:22 pm
sp_Permalink sp_Print

Problemet är inte *-operatorn, utan hur VB gör automatiska typomvandlingar. Utan Clng omvandlar VB till integer (implicit type casting), vilken har begränsningen jag nämnde ovan. När man själv talar om för VB att omvandla till Long (explicit type casting) slipper man det problemet. Dessutom kan man inte säga att textfält har ett begränsat talområde eftersom de inte har ett talområde överhuvud taget. Text-fält kan bara innehålla text, inget annat. De kan däremot ha en begränsning för hur lång texten får vara. Den brukar dock vara betydligt längre än 5 (längden på "32767").

yojimbo3D
It’s a first time for everybody
Medlem
Forum Posts: 8
Member Since:
September 28, 2002
sp_UserOfflineSmall Offline
411613
September 13, 2003 - 1:37 pm
sp_Permalink sp_Print

Vb gör om till integers när man använder *-operatorn, på vilket sätt är det då inte operatorn som är problemet? (jag vet att vb gör om det till en integer vid användande av *)
Long = 456456456 , fungerar till exempel, men inte Long = 5000*500.

Textfält klarar visst av stora tal, sedan att dom hanterar det som text är en annan fråga och jag har inte påstått något annat.

Avatar
dae
Kommer du hit ofta?
Medlem
Forum Posts: 410
Member Since:
July 28, 2003
sp_UserOfflineSmall Offline
411617
September 13, 2003 - 1:42 pm
sp_Permalink sp_Print

Det är inte användatet av operatorn som gör att VB omvandlar till int. När VB ser konstanterna 5000/500 eller what ever... ser VB det som en int. Om du skriver:

Long a = 5000 * 500, ser VB det som:
Long a = (Int) 5000 * (Int) 500.

Om du däremot gör:

Long b = 5000
Long c = 500
Long a = b * c, ska det inte vara några problem.

yojimbo3D
It’s a first time for everybody
Medlem
Forum Posts: 8
Member Since:
September 28, 2002
sp_UserOfflineSmall Offline
411620
September 13, 2003 - 1:46 pm
sp_Permalink sp_Print

Det sker enbart vid användande av *-operatorn (eller andra operatorer)
Long = 6445435 blir ju inte Long = int(6444..)
Däremot blir det så vid användande av *-operatorn, precis på det sätt du skrev.

Avatar
dae
Kommer du hit ofta?
Medlem
Forum Posts: 410
Member Since:
July 28, 2003
sp_UserOfflineSmall Offline
411632
September 13, 2003 - 1:59 pm
sp_Permalink sp_Print

Att det inte blir det när du skriver
Long a = 28687324 beror på att i det fallet omvandlar VB det automatiskt till Long....

Så varför omvandlar VB det till ints när man gör uträkningar? Bra fråga. Det är dessutom ganska dumt att göra det, eftersom dagens datorer är 32-bitars och därför är snabbare med 32-bitars tal, dvs. long. Antagligen är det något som har hängt med sedan 16-bitars-datorerna... rätta mig om jag har fel här... har inte använt VB på många år nu.

Troligen vill VB minimera antalet typomvandlingar, varför den först tittar på den första operationen som ska göras

ex:

Long a = 5000 * 500

Här är första operationen *. För att kunna göra den behöver inte VB göra någon typomvandling... både 5000 och 500 är ju redan int:ar (att operationen genererar ett overflow kan ju inte VB veta). När operationen har gjorts tittar VB på nästa steg, '='. Där behövs det en typomvandling (Int --> Long). Tyvärr har redan *-operationen gjorts, så overflow har redan skett...

I fallet

Long a = 123456789

ser VB direkt att 123456789 måste omvandlas till Long. Inget overflow sker.

Forum Timezone: Europe/Stockholm
Most Users Ever Online: 1030
Currently Online:
Guest(s) 61
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Andreas Galistel: 16287
Jonas Klar: 15897
ilg@dd: 10810
Nyhet: 10607
Mind: 10550
Ctrl: 10355
Gueno: 9881
Guest: 9344
Snorch: 8881
Callister: 8468
Newest Members:
PetrbonFU PetrbonFU
Karine Bembry
Dolores Mcdaniels
Anibal McLeish
Francisca Alt
Alfie Everhart
Lester Huitt
Orlando Jorgensen
Mikki Lundgren
Dakota Kozlowski
Forum Stats:
Groups: 11
Forums: 59
Topics: 146630
Posts: 1300967

 

Member Stats:
Guest Posters: 2
Members: 79425
Moderators: 0
Admins: 11
Administrators: nordicadmin, Henrik Berntsson, Anton Karmehed, Carl Holmberg, Joel Oscarsson, Mikael Linnér, Mikael Schwartz, Andreas Paulsson, Nickebjrk, Mattias Pettersson, EmxL