ошибка переполнения cint в моем скрипте VB

#vbscript

#vbscript

Вопрос:

Я новичок в программировании и изучаю базовый курс программирования на скриптах VB в качестве требования для получения степени, над которой я работаю. У меня есть эта программа, которая преобразует числа по Цельсию в Фаренгейты и делает это с шагом и количеством, которое нужно просмотреть. Эта программа отлично работает в visual logic flow chart, и я потратил более 25 часов, просто пытаясь заставить эту программу работать. Я знаю, что это должно быть что-то совершенно глупое, но, будучи новичком в мире программирования, я в растерянности и не знаю ответов. Не мог бы кто-нибудь взглянуть на этот скрипт, он очень простой, и посмотреть, не упускаю ли я чего-нибудь. Ошибка всегда появляется после Else при fahtemp = (9/5) * tempaccum 32. Буду признателен за любую вставку. Заранее благодарю вас за ваше время. Джон

 Option Explicit
Dim celtemp, amttemp, increment 
Dim newtemp, tempaccum, fahtemp, loopnum, templist

celtemp = inputbox("What is your starting Temp?")
amttemp = inputbox("How many temperatures do you want displayed?")
increment = inputbox("What temperature increments do you want?")

Do while loopnum < amttemp

    loopnum = loopnum  1
    If loopnum = 1 then
        tempaccum = celtemp
        fahtemp = (9/5) * (tempaccum)  32
        templist = "1." amp; "Cel Temp: " amp;tempaccum amp; "- " amp; "Fah Temp: " amp;fahtemp
    else
        tempaccum = tempaccum   increment
        fahtemp = (9/5) * tempaccum   32
        templist = templist amp;" " amp;loopnum amp; "." amp; "Cel Temp: " amp;tempaccum amp; "- " amp; "Fah Temp: " amp;fahtemp
    End If

    newtemp = celtemp   increment

Loop

Document.write "We are starting at Temp: " amp;celtemp
Document.write "<br> We are displaying " amp;amttemp amp; "times."
Document.write "<br> We are incrementing by: " amp;increment
Document.write "<br> The Temperature Table is as follows: " amp;templist
  

Комментарии:

1. Я добавил обновление к своему ответу после вашего последнего комментария. Надеюсь, это поможет. 🙂

Ответ №1:

Ошибка переполнения возникает при попытке сохранить значение, превышающее допустимое типом данных.

Если ваши входные данные слишком велики, вы столкнетесь с этой ошибкой.

Комментарии:

1. Хорошо, у меня есть эта часть. Итак, я думаю, что это не имеет никакого отношения к строке fahtemp, в которой она продолжает выходить из строя, и чему-то еще. Я говорю это только потому, что, если я введу 0 для моей начальной температуры и 5 для обоих приращений и количества, я все равно получу ту же ошибку. Если то, что вы говорите, верно, то 0-20 не может быть достаточно высоким значением, чтобы вызвать сбой. Это должно быть как-то связано с циклом или местом в памяти tempaccum. Спасибо за ответ

2. @Джон Гэммон: Смотрите мой ответ ниже для объяснения и исправлений.

Ответ №2:

@Jon Gammon: tempaccum = tempaccum increment вычисляется не так, как вы могли бы подумать, вместо того, чтобы добавлять приращение как число, оно объединялось как строка, т. Е. если начальная температура равна 10 , приращение равно 5 и количество отображаемых раз равно 3 , вы ожидаете, что ваш результат будет

 1. Cel Temp: 10 - Fah Temp: 50
2. Cel Temp: 15 - Fah Temp: 59
3. Cel Temp: 20 - Fah Temp: 68
  

Вместо этого вы получите

 1. Cel Temp: 10 - Fah Temp: 50
2. Cel Temp: 105 - Fah Temp: 221
3. Cel Temp: 1055 - Fah Temp: 1931
  

Это то, что вызвало переполнение, потому что tempaccum стало огромным, и дальнейшие умножения на нем нарушили бы работу скрипта. Document.Write также недопустимый код VBScript, поэтому я превратил это в MsgBox .

Вот рабочая и протестированная копия вашего скрипта, которую я немного переписал, чтобы исправить вышеупомянутые проблемы и немного улучшить его:

 Option Explicit
Dim celtemp, amttemp, increment 
Dim tempaccum, fahtemp, loopnum, templist

celtemp   = inputbox("What is your starting temperature?")
amttemp   = inputbox("How many temperatures do you want displayed?")
increment = inputbox("What temperature increments do you want?")

' Formula to converts Celcius to Fahrenheit
Function fahrenheit(ByRef celcius)
    fahrenheit = ((9 / 5)* celcius)   32
End Function

' Some error checking
If NOT IsNumeric(amttemp) Then 
    amttemp = 1
Else
    amttemp = Fix(amttemp) ' only interested in integer part '
End If

For loopnum = 1 To amttemp
    If loopnum = 1 then
        tempaccum = celtemp
        fahtemp   = fahrenheit(tempaccum)
        templist  = "1. " amp; "Cel Temp: " amp; tempaccum amp; _
                    " - " amp; "Fah Temp: " amp; fahtemp amp; vbCrLf
    Else
        tempaccum = celtemp   (increment * (loopnum - 1))
        fahtemp   = fahrenheit(tempaccum)
        templist  = templist amp; loopnum amp; ". " amp; _
                    "Cel Temp: " amp; tempaccum amp; " - " amp; _
                    "Fah Temp: " amp; fahtemp amp; vbCrLf
    End If
Next

MsgBox "Starting at temperature: " amp; celtemp amp; vbCrLf amp; _
"Displaying " amp;amttemp amp; " times." amp; vbCrLf amp; _
"Incrementing by: " amp;increment amp; vbCrLf amp; vbCrLf amp; _
"The temperature table is as follows: " amp; vbCrLf amp; templist, 0, _
"Temperature Converter"
  

Обновить

Мой класс довольно простой, мы не работали с функциями, и на самом деле единственное, что мы сделали, это входные данные, циклы while, выбор регистра и If . ИТАК, у меня было полно дел, пытаясь это закодировать. Хотя ваш работает блестяще, я боюсь, что он немного более продвинутый, чем тот, на котором мы находимся.

Я вижу, хорошо, я вернулся к исходному скрипту и обновил только те части, которые нарушали его, как упоминалось ранее. Вот новая рабочая копия:

 Option Explicit
Dim celtemp, amttemp, increment 
Dim tempaccum, fahtemp, loopnum, templist

celtemp   = inputbox("What is your starting temperature?")
amttemp   = inputbox("How many temperatures do you want displayed?")
increment = inputbox("What temperature increments do you want?")

loopnum = 1

Do While loopnum < CInt(amttemp)
    If loopnum = 1 Then
        tempaccum = celtemp
        fahtemp   = ((9 / 5) * tempaccum)   32
        templist  = "1. Cel Temp: " amp; tempaccum amp; " - " amp; "Fah Temp: " amp; fahtemp amp; vbCrLf
    Else
        tempaccum = celtemp   (increment * loopnum)
        fahtemp   = ((9 / 5) * tempaccum)   32
        templist  = templist amp; loopnum amp; ". Cel Temp: " amp; tempaccum amp; " - " amp; "Fah Temp: " amp; fahtemp amp; vbCrLf
    End If

    loopnum = loopnum   1
Loop

MsgBox "Starting at temperature: " amp; celtemp amp; vbCrLf amp; _
"Displaying " amp; amttemp amp; " times." amp; vbCrLf amp; _
"Incrementing by: " amp; increment amp; vbCrLf amp; vbCrLf amp; _
"The temperature table is as follows: " amp; vbCrLf amp; templist, 0, _
"Temperature Converter"
  

Комментарии:

1. Потрясающе, это отлично работает, и это соответствует тому, где мы находимся в классе. Большое спасибо за вашу помощь. Я был близок, просто пропустил некоторые ключевые части. Ценю, что вы смотрите на это для меня. Джон