Как исправить этот код VB? [Аргумент не указан для параметра]

Я изо всех сил пытаюсь заставить этот код работать:

Module Module1 
    Function BMI(ByVal H, ByVal W)
        BMI = (W / H) ^ 2
        Return BMI
    End Function
    Function reading(ByVal BMI)
        If BMI <= 19 Then
            reading = "Underweight"
        ElseIf BMI >= -20 <= 25 Then
            reading = "Perfect"
        ElseIf BMI >= 26 <= 30 Then
            reading = "Slightly Overweight"
        ElseIf BMI >= 31 <= 40 Then
            reading = "Overweight"
        ElseIf BMI >= 41 Then
            reading = "Obese"
        End If
        Return reading
    End Function
    Sub Main()
        Dim height, weight As Integer
        Console.Write("What is your height? ")
        height = Console.ReadLine
        Console.Write("What is your weight? ")
        weight = Console.ReadLine
        BMI(height, weight)
        reading(BMI)
    End Sub
End Module

Мне сообщили, что «чтение (BMI)» имеет «аргумент, не указанный для параметра «W» в «Public Function BMI (H As Object, W As Object) As Object».

Пожалуйста, может кто-нибудь помочь мне исправить это?


person Ryan Grainger    schedule 03.02.2015    source источник
comment
у вас есть ИМТ как функция, которая принимает 2 аргумента. reading(BMI(height, weight)) должно работать, но вы получите еще одну ошибку/плохие результаты. ElseIf BMI >= -20 <= 25 Then - это не то, как построить оператор IF   -  person Ňɏssa Pøngjǣrdenlarp    schedule 03.02.2015
comment
Пожалуйста, используйте Option Strict On.   -  person OneFineDay    schedule 03.02.2015
comment
Вам нужно почистить код и использовать хорошо продуманные имена. Использование одного и того же имени для функции и параметра другой функции — плохая идея, как вы выяснили.   -  person Panagiotis Kanavos    schedule 03.02.2015
comment
Я умоляю вас ознакомиться с соглашениями об именах .NET. msdn.microsoft.com/en-us/library /ms229002(v=vs.110).aspx   -  person TyCobb    schedule 03.02.2015


Ответы (4)


Вот ваш код немного переработан. У него нет проверки ошибок на пользовательских входах. Если вы работаете в метрических единицах, удалите часть * 703 в формуле:

Module Module1

    Sub Main()
        Dim height, weight As Integer
        Console.Write("What is your height in inches? ")
        height = Console.ReadLine
        Console.Write("What is your weight in pounds? ")
        weight = Console.ReadLine

        Dim BMI As Integer = CalculateBMI(height, weight)
        Dim Category As String = reading(BMI)

        Console.WriteLine(String.Format("Your BMI is {0}, which is {1}.", BMI, Category))
        Console.Write("Press Enter to Quit")
        Console.ReadLine()
    End Sub

    Function CalculateBMI(ByVal H As Integer, ByVal W As Integer) As Integer
        Return CDbl(W * 703) / Math.Pow(H, 2)
    End Function

    Function reading(ByVal BMI As Integer) As String
        Select Case BMI
            Case Is <= 19
                Return "Underweight"
            Case 20 To 25
                Return "Perfect"
            Case 26 To 30
                Return "Slightly Overweight"
            Case 31 To 40
                Return "Overweight"
            Case Else
                Return "Obese"
        End Select
    End Function

End Module
person Idle_Mind    schedule 03.02.2015

Для того, чтобы передать результат BMI-функции методу reading, вам нужно сохранить результат в переменной вместо того, чтобы снова использовать имя функции BMI (соответствующие изменения содержатся в последних двух строках):

Sub Main()
    Dim height, weight As Integer
    Console.Write("What is your height? ")
    height = Console.ReadLine
    Console.Write("What is your weight? ")
    weight = Console.ReadLine
    Dim result = BMI(height, weight)
    reading(result)
End Sub
person Markus    schedule 03.02.2015
comment
Это решает проблему только наполовину. Куда направляется возвращаемое значение read()?... - person Idle_Mind; 03.02.2015

Было несколько ошибок. Попробуйте то, что у меня есть ниже, и посмотрите, работает ли оно так, как вы ожидали. Я прокомментировал код относительно внесенных мной изменений.

Module Module1
    Function BMI(ByVal H As Integer, ByVal W As Integer) As Integer   ' set a return type and specify the parameter types
        BMI = (W / H) ^ 2
        ' Dont need this here, you can return the value by simply assinging the function name the return value
        ' Return BMI 
    End Function
    Function reading(ByVal _BMI As Integer) As String   ' set a return type and specify the parameter types
        'This was not the correct syntax for an If statement.
        If _BMI <= 19 Then
            reading = "Underweight"
        ElseIf _BMI >= 20 And _BMI <= 25 Then   ' ElseIf BMI >= -20 <= 25 Then   ' Also killed the -20 and made it just 20
            reading = "Perfect"
        ElseIf _BMI >= 26 And _BMI <= 30 Then   ' ElseIf BMI >= 26 <= 30 Then
            reading = "Slightly Overweight"
        ElseIf _BMI >= 31 And _BMI <= 40 Then   ' ElseIf BMI >= 31 <= 40 Then
            reading = "Overweight"
        ElseIf _BMI >= 41 Then
            reading = "Obese"
        Else
            reading = "Unknown"    ' Just in case...
        End If
        ' Again, don't need this here
        ' Return reading

    End Function
    Sub Main()
        Dim height, weight As Integer
        Try
            Console.Write("What is your height? ")
            height = Integer.Parse(Console.ReadLine) ' make sure it's an integer
        Console.Write("What is your weight? ")
            weight = Integer.Parse(Console.ReadLine) ' make sure it's an integer 

            Dim result As String = reading(BMI(height, weight)) ' Need to feed the reading function an actual value. Before it was trying to call the BMI function with no parameters hence why it was failing.
            Console.Write(String.Format("Your result is: {0}", result)) ' Output 
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Console.ReadLine()
        End Try
    End Sub

End Module
person вʀaᴎᴅᴏƞ вєнᴎєƞ    schedule 03.02.2015

В дополнение к тому, что Маркус написал:

Удалите операторы «возврата» в самих функциях. Я не верю, что vba любит их. Вы присвоили значение имени функции.. это все, что вам нужно сделать:

поэтому удалите:

Return BMI
Return reading
person Ditto    schedule 03.02.2015
comment
Вопрос помечен vb.net, и я не вижу в коде ничего, что указывало бы на то, что это vba. В любом случае удаление операторов return не повлияет на ошибку, о которой идет речь. - person Blackwood; 03.02.2015
comment
Забавно, протестировал на своей стороне, воспроизвел ошибку, убрал возврат, ошибка ушла.. пожал плечами . похоже, это была одна из его проблем. Я не видел смысла в том, чтобы повторять то, что сказал Маркус... пометить меня за то, что я указал на ошибку, которую он допустил, но еще не осознал? как очень странно. - person Ditto; 03.02.2015
comment
Я также тестировал. С Option Strict On код в исходном вопросе получает 16 ошибок сборки (и было бы хорошо, если бы OP устранил это). С Option Strict Off есть две ошибки, обе являются ошибками, не указанными аргументом, и ни одна из них не исчезает, если операторы return удаляются. - person Blackwood; 03.02.2015
comment
И, конечно же, я должен добавить, что Return — это совершенно правильное утверждение в vb.net. На самом деле это стандартный способ возврата значения функцией. Использование имени функции в качестве возвращаемой переменной также поддерживается для тех, кто больше знаком с VB 6 и более ранними версиями. - person Blackwood; 04.02.2015