Arrays

General Array Processing – Part 2

 

Passing an Array to a Function or Sub

 

The following sample program demonstrates how to pass an array to a Sub or Function, so that the Sub or Function can process the data in the array. In the sample program, the Main procedure declares the following array:

 

Dim aintTemps(6) As Integer

 

The Main procedure prompts the user to enter 7 temperatures, which are stored in the array. After all the temperatures are entered, the Sub "PrintTemps" is called, using this syntax:

 

PrintTemps(aintTemps)

 

Note that in the syntax above, only the name of the array is specified; no parentheses or bounds are specified.

 

The header of the "PrintTemps" Sub looks like this:

 

Private Sub PrintTemps(ByVal paintTemps() As Integer)

 

Note that the Sub header must specify the array parameter with an empty set of parentheses.

 

To loop through the array contents, note that the UBound function is used in the For statement to determine how many elements need to be processed:

 

        For intX = 0 To UBound(paintTemps)

            Console.WriteLine(CStr(paintTemps(intX)))

        Next

 

The program code and corresponding output is shown below:

 

VB Code:

Screen-shot of run:

Module Module1

 

    Public Sub Main()

 

        Dim aintTemps(6) As Integer

        Dim intX As Integer

 

        For intX = 0 To 6

            Console.Write("Enter temperature #" & (intX + 1) & ": ")

            aintTemps(intX) = Val(Console.ReadLine())

        Next

 

        PrintTemps(aintTemps)

 

        Console.WriteLine()

        Console.WriteLine("Press Enter to close this window.")

        Console.ReadLine()

 

    End Sub

 

    Private Sub PrintTemps(ByVal paintTemps() As Integer)

 

        Dim intX As Integer

 

        Console.WriteLine()

        Console.WriteLine("You entered:")

        Console.WriteLine()

 

        For intX = 0 To UBound(paintTemps)

            Console.WriteLine(CStr(paintTemps(intX)))

        Next

 

    End Sub

 

End Module

 

Download the VB project code for the example above here.

 

Passing a Structure Array to a Function or Sub

 

The rules for passing a Structure array to a Function or Sub follows the same principles as those for passing other types of arrays to a function or subroutine. Just make sure the proper user-defined Type is specified in the "As" clause of the parameter being passed in the Sub or Function header.

 

The sample program below is a modification of the sample program from the previous topic's section on "Loading a Structure Array from a File and Displaying Its Contents". In this version, the displaying of the structure array's contents takes place in a separate Sub called "PrintEmps". The call to PrintEmps passes the structure array as follows:

 

      PrintEmps(maudtEmpRecord)

 

Note that the Sub header expects an array of type "EmployeeRecord" to be passed in:

 

      Private Sub PrintEmps(ByVal paudtEmps() As EmployeeRecord)

 

 

The program code and corresponding output is shown below:

 

VB Code:

Screen-shot of run:

Module Module1

 

    Private Structure EmployeeRecord

        Dim EmpName As String

        Dim DeptNbr As Integer

        Dim JobTitle As String

        Dim HireDate As Date

        Dim HrlyRate As Single

    End Structure

 

    Private maudtEmpRecord() As EmployeeRecord

 

    Public Sub Main()

 

        Dim strEmpFileName As String

        Dim intEmpFileNbr As Integer

 

        Dim intArrX As Integer

 

        strEmpFileName = My.Application.Info.DirectoryPath & "\EMPLOYEE.DAT"

        intEmpFileNbr = FreeFile()

 

        FileOpen(intEmpFileNbr, strEmpFileName, OpenMode.Input)

 

        intArrX = -1

 

        Do Until EOF(intEmpFileNbr)

            intArrX += 1

            ReDim Preserve maudtEmpRecord(intArrX)

            With maudtEmpRecord(intArrX)

                Input(intEmpFileNbr, .EmpName)

                Input(intEmpFileNbr, .DeptNbr)

                Input(intEmpFileNbr, .JobTitle)

                Input(intEmpFileNbr, .HireDate)

                Input(intEmpFileNbr, .HrlyRate)

            End With

        Loop

 

        FileClose(intEmpFileNbr)

 

        PrintEmps(maudtEmpRecord)

 

        Console.WriteLine()

        Console.WriteLine("Press Enter to close this window.")

        Console.ReadLine()

 

    End Sub

 

    Private Sub PrintEmps(ByVal paudtEmps() As EmployeeRecord)

 

        Dim intX As Integer

 

        For intX = 0 To UBound(paudtEmps)

            With maudtEmpRecord(intX)

                Console.WriteLine(.EmpName.PadRight(20) _

                                & .DeptNbr.ToString.PadRight(6) _

                                & .JobTitle.PadRight(20) _

                                & Format(.HireDate, "MM/dd/yyyy").PadRight(12) _

                                & Format(.HrlyRate, "Standard"))

            End With

        Next

 

    End Sub

 

End Module

 

 

Download the VB project code for the example above here.

 

Using ParamArray

 

The ParamArray keyword is used in the Sub or Function header for procedures that will accept an arbitrary number of arguments of the same data type and process them as an array.

 

Consider the following Sub:

 

    Private Sub SumThem(ByVal ParamArray paintNums() As Integer)

 

        Dim intX As Integer

        Dim intSum As Integer

 

        For intX = 0 To UBound(paintNums)

            intSum += paintNums(intX)

        Next

 

        Console.WriteLine("The sum is " & intSum)

 

    End Sub

 

On the surface, the above Sub looks like a procedure which accepts an array of Integer values and sums them.  However, the presence of the keyword ParamArray means that this Sub can be called with any number of arguments. When you call this Sub, you would pass it not an array, but any number of individual values.

 

Following are some sample calls and the results that they would produce:

 

        SumThem(1, 3, 5, 8)   ' SumThem will print 17

        SumThem(3, 4, 2)      ' SumThem will print 9

        SumThem(3, 7)         ' SumThem will print 10     

 

 

The program code and corresponding output is shown below:

 

VB Code:

Screen-shot of run:

Module Module1

 

    Public Sub Main()

 

        Dim intValueA As Integer

        Dim intValueB As Integer

 

        intValueA = 3

        intValueB = 7

 

        Console.WriteLine()

        Console.WriteLine("*** ParamArray - Call #1 ***")

        SumThem(1, 3, 5, 8)

 

        Console.WriteLine()

        Console.WriteLine("*** ParamArray - Call #2 ***")

        SumThem(intValueA, 4, 2)

 

        Console.WriteLine()

        Console.WriteLine("*** ParamArray - Call #3 ***")

        SumThem(intValueA, intValueB)

 

        Console.WriteLine()

        Console.WriteLine("Press Enter to close this window.")

        Console.ReadLine()

 

    End Sub

 

    Private Sub SumThem(ByVal ParamArray paintNums() As Integer)

 

        Dim intX As Integer

        Dim intSum As Integer

 

        For intX = 0 To UBound(paintNums)

            intSum += paintNums(intX)

        Next

 

        Console.WriteLine("The sum is " & intSum)

 

    End Sub

 

End Module

 

Download the VB project code for the example above here.

 

The For Each/Next Loop

 

There is a variation of the For/Next loop (the For Each/Next loop) that allows you to traverse a either the elements of an array or a set of objects in a collection. Objects and Collections will come into play a little later in your travels with VB; here we will look at how the For Each/Next loop can be used to process the elements of an array. The syntax of the For Each/Next loop is as follows:

 

      For Each ElementVariable In ArrayName

          ' process the current ElementVariable

      Next

 

The example below is a variation of the previous example, using For/Each in the SumThem routine:

 

VB Code:

Screen-shot of run:

Module Module1

 

    Public Sub Main()

 

        Dim intValueA As Integer

        Dim intValueB As Integer

 

        intValueA = 3

        intValueB = 7

 

        Console.WriteLine()

        Console.WriteLine("*** ParamArray - Call #1 ***")

        SumThem(1, 3, 5, 8)

 

        Console.WriteLine()

        Console.WriteLine("*** ParamArray - Call #2 ***")

        SumThem(intValueA, 4, 2)

 

        Console.WriteLine()

        Console.WriteLine("*** ParamArray - Call #3 ***")

        SumThem(intValueA, intValueB)

 

        Console.WriteLine()

        Console.WriteLine("Press Enter to close this window.")

        Console.ReadLine()

 

    End Sub

 

    Private Sub SumThem(ByVal ParamArray paintNums() As Integer)

 

        Dim intNumX As Integer

        Dim intSum As Integer

 

        For Each intNumX In paintNums

            intSum += intNumX

        Next

 

        Console.WriteLine("The sum is " & intSum)

 

    End Sub

 

End Module

 

Download the VB project code for the example above here.