Presentation is loading. Please wait.

Presentation is loading. Please wait.

Debugging, Static Variables, ByRef, ByValue Chapt. 6 in Deitel, Deitel and Nieto.

Similar presentations


Presentation on theme: "Debugging, Static Variables, ByRef, ByValue Chapt. 6 in Deitel, Deitel and Nieto."— Presentation transcript:

1 Debugging, Static Variables, ByRef, ByValue Chapt. 6 in Deitel, Deitel and Nieto

2 Debugging Debug.Print: prints messages or variable values to the Intermediate window Example: Debug.Print “Loop”, i would indicate how many times one was in a loop P. 559 in Deitel, Deitel and Nieto

3 Debugging Instead of running a program by clicking the Start (  ) and encountering a problem at an unknown place, one can step through a program. Click the F8 key, it will take you through the program statement by statement If nothing is happening, it’s probably waiting for an event Place the cursor over a variable in the program to see its current value

4 Debugging Debug.Assert(condition)

5 Scope Recall that variable’s scope is the parts of the program which have access to a variable and understand what is meant by that variable A local variable is understood only within the the method (subroutine or function) in which it is declared

6 Scope (Cont.) A global variable is declared at the top of a Module (a form is the only example we have of a module so far) and is understood by all the methods in that module A public variable is declared using the keyword Public instead of Dim, such a variable can be understood by other modules (forms) –To be used on another form, one must put before it the form on which it is declared –frmOrigin.Balance

7 Scope example

8 Scope Example

9 Option Explicit Public Balance As Double Dim Interest As Double Dim Years As Integer Global public

10 Scope Example Private Sub txtBalance_Validate(Cancel As _ Boolean) If IsNumeric(txtBalance.Text) Then Balance = txtBalance.Text Else txtBalance.Text = "" Cancel = True End If End Sub ‘Similar subroutines for Interest and Years

11 Scope Example Private Sub cmdCalculate_Click() Dim i As Integer For i = 1 To Years Balance = Balance * (1 + Interest / 100) Next i Me.Hide frmDerivative.Show End Sub Local

12 Scope Example Option Explicit Private Sub Form_Initialize() txtResult.Text = "" txtResult.Text = "With $" & frmOrigin.txtBalance.Text & _ " invested for " & frmOrigin.txtYears.Text & " years " & _ " at " & frmOrigin.txtInterest.Text & "% would result in “ _ & Format$(frmOrigin.Balance, "Currency") End Sub

13 Automatic Variables If an automatic variable is declared (Dimmed) in a subroutine (or function) then a memory location is associated with that variable only for the duration of the subroutine If the subroutine is returned to later, a new memory location is associated with the variable, which means the value is re- initialized rather than remembered

14 Static variables If you want a variable to be local to a subroutine (or function) because it is used only a that subroutine, but you also want the variable’s value to be remembered from call to call, then you want a static variable

15 Static vs. Automatic Variables Remains zero

16 Static vs. Automatic Variables Option Explicit Private Sub cmdStart_Click() If Timer1.Enabled Then Timer1.Enabled = False cmdStart.Caption = "Start" Else Timer1.Enabled = True cmdStart.Caption = "Stop" End If End Sub

17 Static vs. Automatic Variables Private Sub Timer1_Timer() Static StaticCount As Single Dim AutomaticCount As Single txtStatic.Text = Format$(StaticCount, "Fixed") txtAutomatic.Text = Format$( _ AutomaticCount, “Fixed”) StaticCount = StaticCount + 0.01 AutomaticCount = AutomaticCount + 0.01 End Sub The static variable is remembered from call to call

18 ByRef The default in VB is that arguments passed to a method are passed “by reference” This means that if the argument is a variable, then the method has access to the original variable’s memory location and can change the value therein

19 ByRef Example Option Explicit Dim Balance As Double Dim Years As Integer Dim Interest As Double Private Sub Command1_Click() Dim i As Integer Balance = 1000 Years = 10 Interest = 6.5

20 ByRef Example For i = 1 To Years Call AddInterest(Balance, Interest) Debug.Print Balance Next i End Sub Private Sub AddInterest(Balance As Double, _ Interest As Double) Balance = Balance * (1 + Interest / 100) End Sub Passed by reference, balance can change in subroutine

21 By Ref Example

22 ByVal If a variable is passed to a method “by value”, then the method makes its own local copy (a distinct memory location) of the variable, any changes to the variable in the method happen only to the local copy and not the original

23 ByVal Example Dim Interest As Double Private Sub Command1_Click() Dim i As Integer Balance = 1000 Years = 10 Interest = 6.5

24 ByVal Example For i = 1 To Years Balance = Balance + CalculateInterest(Balance, _ Interest) Debug.Print Balance Next i End Sub Private Function CalculateInterest(ByVal Balance As _ Double, ByVal Interest As Double) As Double CalculateInterest = Balance * Interest / 100 Balance = 999999999 End Function Change balance in method, doesn’t affect original Balance changed here, not in function

25 ByVal Example

26 “Functions” that return more than one thing One can use ByRef arguments to have a method return more than one value How? Send what you want returned as if it were an argument and it can be changed within the method

27 Multiple returns example Option Explicit Private Sub Command1_Click() Dim A As Double Dim B As Double Dim C As Double Dim Root1 As Double Dim Root2 As Double A = 3.01 B = 16.021 C = 2.11

28 Multiple returns example Call CalculateRoots(A, B, C, Root1, Root2) Debug.Print Root1, Root2 End Sub Private Sub CalculateRoots(A As Double, B As Double, _ C As Double, Root1 As Double, Root2 As Double) Dim Discrim As Double Discrim = B ^ 2 - 4 * A * C Root1 = (-B + Discrim) / (2 * A) Root2 = (-B - Discrim) / (2 * A) End Sub

29 Recursion Recursion is when a function calls itself If a function calls itself under all conditions, then there will be an unending cycle of function calls and the program will not end properly There must be a “base case” which in which the function does not call itself P. 214 Deitel, Deitel and Nieto

30 Greatest Common Divisor as an Example of Recursion The greatest common divisor (gcd) of two integers is the largest number that divides into both evenly (that is, both numbers can be divided by the gcd without any remainder) “In Euclid's Elements (Book VII) we find a way of calculating the gcd of two numbers, without listing the divisors of either number. It is now called Euclid's Algorithm.”

31 Euclid’s Algorithm Example “We will find the gcd of 36 and 15. Divide 36 by 15 (the greater by the smaller), getting 2 with a remainder of 6.” “Then we divide 15 by 6 (the previous remainder) and we get 2 and a remainder of 3.” “Then we divide 6 by 3 (the previous remainder) and we get 2 with no remainder.” “The last non-zero remainder (3) is our gcd. Note we are only interested in the remainders of the division

32 Euclid’s Algorithm Example Here it is in general: a/b gives a remainder of r b/r gives a remainder of s r/s gives a remainder of t... w/x gives a remainder of y x/y gives no remainder In this case, y is the gcd of a and b. If the first step produced no remainder, then b (the lesser of the two numbers) is the gcd. http://www.mcn.net/~jimloy/euclids.html

33 Euclid’s Algorithm Example Note the procedure is recursive, the operation on the first set of numbers leads to the same operation on a second set of numbers and so on The “base case” occurs when the second (lower) number is zero

34 Euclid’s Algorithm Example

35 Option Explicit Private Sub txtNumber_Validate(Index As Integer, Cancel As Boolean) If Not IsNumeric(txtNumber(Index).Text) Then MsgBox ("Please enter a number.") txtNumber(Index).Text = "" Cancel = True End If End Sub This is your basic validation method but on an array of inputs

36 Euclid’s Algorithm Example Private Sub cmdGCD_Click() Dim Number1 As Integer Dim Number2 As Integer Dim Swap As Integer Dim GreatComDiv As Integer Number1 = txtNumber(0).Text Number2 = txtNumber(1).Text

37 Euclid’s Algorithm Example 'order the two numbers If Number1 < Number2 Then Swap = Number1 Number1 = Number2 Number2 = Swap End If We exchange the numbers like in the shuffle method but only if the first one is smaller

38 Euclid’s Algorithm Example GreatComDiv = _ CalculateGCD(Number1, Number2) lblGCD.Caption = lblGCD.Caption & _ "of " & Number1 & " and " & _ Number2 & " is " & GreatComDiv End Sub Call our greatest common divisor function

39 Euclid’s Algorithm Example Private Function CalculateGCD(ByVal _ Number1 As Integer, ByVal Number2 _ As Integer) As Integer Dim Remainder As Integer Debug.Print Number1, Number2 Make a copy of the numbers, don’t change the originals Print out our progress to the Intermediate window, this will print the local copies of Number1 and Number2, not the originals

40 Euclid’s Algorithm Example If Number2 = 0 Then CalculateGCD = Number1 Else Remainder = Number1 Mod Number2 Number1 = Number2 Number2 = Remainder CalculateGCD = CalculateGCD(_ Number1, Number2) End If End Function Base case!!!! Recursive call

41 Intermediate Window


Download ppt "Debugging, Static Variables, ByRef, ByValue Chapt. 6 in Deitel, Deitel and Nieto."

Similar presentations


Ads by Google