Parameter Passing Mechanisms - PowerPoint PPT Presentation

About This Presentation
Title:

Parameter Passing Mechanisms

Description:

Parameter Passing Mechanisms Reference Parameters 10.1 - 10.3 * – PowerPoint PPT presentation

Number of Views:89
Avg rating:3.0/5.0
Slides: 29
Provided by: Larr76
Learn more at: https://cs.calvin.edu
Category:

less

Transcript and Presenter's Notes

Title: Parameter Passing Mechanisms


1
Parameter Passing Mechanisms
Reference Parameters 10.1 - 10.3
1
2
Problem
Find/locate IP address
ipv6 16 bytes
IPv4 (Internet Protocol) addresses are expressed
using "dotted decimal" notation aaa.bbb.ccc.ddd
where aaa, bbb, ccc, and ddd are 1-byte (8-bit)
integers that provide network or host information.
  • Using OCD, design and implement a function that,
    given a string containing an IP address,
    decomposes it into its four network/host
    information blocks (aaa, bbb, ccc, ddd) and
    returns these values.

2
3
Preliminary Analysis
  • Our function can receive the IP address through a
    string parameter.
  • This problem requires that our function somehow
    communicate four values (the network/host
    information blocks ) back to its caller.
  • A function cannot return multiple values the
    return statement only returns one
    value return expression

3
4
Behavior
  • Our subprogram should receive from its caller an
    IP address (a string). It should compute and
    pass back its four network/host information
    blocks or halt execution if it did not receive a
    valid IP address.

4
5
Objects
Movement
  • Description Type
    Name

IP address string ipAddr first block string
info1 second block string info2 third
block string info3 fourth block string info4
to back back back back
5
6
Operations
  • Description Predefined? Library? Name

receive a string yes built-in none select part of
a yes string substr()string search a
string yes string find() halt if
error yes cassert assert()
yes
pass back 4strings
??
built-in
6
7
Algorithm
  • 0. Receive ipAddress from caller and declare four
    variables info1, info2, info3, and info4.
  • 1. Fill info1 with appropriate substring of
    ipAddr or halt if it can't be found.
  • 2. Fill info2 with appropriate substring of
    ipAddr or halt if it can't be found.
  • 3. Fill info3 with appropriate substring of
    ipAddr or halt if it can't be found.
  • 4. Fill info4 with appropriate substring of
    ipAddr or halt if it can't be found.

7
8
Discussion
  • Since a function cannot return 4 strings, we
    will instead require the caller to pass it four
    string variables as arguments, which our function
  • will then assign values.
  • Parameters used up to now are called value
    parameters they are built as copies of their
    arguments.
  • Changing a value parameter changes the copy,
  • not its corresponding argument.
  • So, we need a different kind of parameter.

8
9
Solution Reference Parameters
  • A reference parameter is an alias (i.e., another
    name) for its corresponding argument.
  • They share memory locations.
  • Changing the value of a reference parameter
    changes the value of its corresponding argument.
  • In C, reference parameters are declared with an
    ampersand () following the parameters type (and
    before its name).

is also the"address of"operator
9
10
Coding
void chopIPAddress(string ipAddr, // value
TO string info1, //
reference BACK string
info2, // reference BACK
string info3, // reference BACK
string info4) // reference BACK
int dot1 ipAddr.find(".", 0) assert(dot1
! stringnpos) info1 ipAddr.substr(0,
dot1) int dot2 ipAddr.find(".", dot1 1)
assert(dot2 ! stringnpos) info2
ipAddr.substr(dot1 1, dot2 - dot1 - 1) int
dot3 ipAddr.find(".", dot2 1) assert(dot3
! stringnpos) info3 ipAddr.substr(dot2
1, dot3 - dot2 - 1) assert(ipAddr.find(".",
dot3 1) stringnpos) info4
ipAddr.substr(dot3 1, ipAddr.size() - dot3 -
1)
10
11
Testing
  • The caller must now supply a variable for each
    reference parameter, to be "filled in" by the
    function.

cout ltlt "Enter an IP address "string
ipAddress, part1, part2, part3, part4cin gtgt
ipAddress
chopIPAddress(ipAddress, part1, part2,
part3, part4)
cout ltlt "Network/Host blocks are\n" ltlt
part1 ltlt endl ltlt part2 ltlt endl ltlt part3 ltlt
endl ltlt part4 ltlt endl
11
12
Notes
  • When function chopIDAddress() is called
  • ipAddr is allocated a memory location and a copy
    of the argument ipAddress is stored there
  • Each of the parameters info1, info2, info3, info4
    is an alias of the corresponding argument
    part1, part2, part3, part4 they share the same
    memory location that is,info1 and part1 are
    names of the same memory location, as areinfo2
    and part2, info3 and part3,info4 and part4.

12
13
0. Before the function call
ipAddress
153.106.4.23
? ? ? ?
part1
part2
part3
part4
Memory
cout ltlt "Enter an IP address "string
ipAddress, part1, part2, part3, part4cin gtgt
ipAddress
13
14
1. ipAddr is created as a copy of ipAddress
ipAddress
153.106.4.23
? ? ? ?
part1
part2
part3
part4
ipAddr
153.106.4.23
Memory
14
chopIPAddress(ipAddress, part1, part2 part3,
part4)
15
2. info1, ..., info4 are created as aliases for
part1, ..., part4
ipAddress
153.106.4.23
? ? ? ?
part1
info1
part2
info2
part3
info3
part4
info4
153.106.4.23
ipAddr
Memory
15
chopIPAddress(ipAddress, part1, part2 part3,
part4)
16
3. The function computesinfo1, changing part1
ipAddress
153.106.4.23
153
part1
info1
? ? ?
part2
info2
part3
info3
part4
info4
153.106.4.23
ipAddr
Memory
int dot1 ipAddr.find(".", 0) assert(dot1
! stringnpos) info1 ipAddr.substr(0,
dot1)
16
17
4. The function computesinfo2, changing part2
ipAddress
153.106.4.23
part1
153
info1
part2
info2
106
part3
info3
? ?
part4
info4
153.106.4.23
ipAddr
Memory
int dot2 ipAddr.find(".", dot1 1)
assert(dot2 ! stringnpos) info2
ipAddr.substr(dot1 1, dot2 - dot1 - 1)
17
18
5. The function computesinfo3, changing part3
ipAddress
153.106.4.23
part1
153
info1
part2
106
info2
part3
info3
4
part4
?
info4
153.106.4.23
ipAddr
Memory
int dot3 ipAddr.find(".", dot2 1)
assert(dot3 ! stringnpos) info3
ipAddr.substr(dot2 1, dot3 - dot2 - 1)
18
19
6. The function computesinfo4, changing part4
ipAddress
153.106.4.23
part1
153
info1
106
part2
info2
part3
info3
4
part4
info4
23
153.106.4.23
ipAddr
Memory
assert(ipAddr.find(".", dot3 1)
stringnpos) info4 ipAddr.substr(dot3 1,
ipAddr.size() - dot3 - 1)
19
20
7. The function returns, destroying all parameters
ipAddress
153.106.4.23
part1
153
info1
106
part2
info2
part3
4
info3
part4
23
info4
ipAddr
153.106.4.23
Memory
. . .
20
21
8. part1, ... , part4now contain the information!
ipAddress
153.106.4.23
part1
153
106
part2
part3
4
part4
23
Memory
cout ltlt "Network/Host blocks are\n" ltlt
part1 ltlt endl ltlt part2 ltlt endl ltlt part3 ltlt
endl ltlt part4 ltlt endl
21
22
Notes
  • By default, parameters are value parameters.
  • Reference parameters are specified by placing an
    ampersand after the parameters type.
  • Reference parameters must be specified in both a
    functions prototype and its definition, or a
    linking error will occur.
  • Variables must be passed as arguments for
    reference parameters to fill, or a compiler error
    will occur.

22
23
An Alternative to Value Parameters
  • Copying argument ipAddress consumes time.
  • Creating an alias for an argument takes almost no
    time.
  • We could speed up calls to our function by making
    parameter ipAddr a reference parameter.
  • However, we then run the risk of changing
    ipAddress if we mistakenly change ipAddr.

23
24
  • Constant reference parameters are reference
    parameters whose declaration is preceded by the
    keyword const.

void chopIPAddress(const string ipAddr, //
TO string info1, //
BACK string info2,
// BACK string info3,
// BACK string info4)
// BACK // ...
Const reference parameters are read-only
reference parameters -- aliases of their
arguments -- but they cannot be changed.
24
25
0. Before the function call
ipAddress
153.106.4.23
? ? ? ?
part1
part2
part3
part4
Memory
25
26
1. ipAddr is created as aconst reference of
original
ipAddr
ipAddress
153.106.4.23
part1
read-only
part2
part3
part4
Memory
26
27
2. The rest of the function proceeds as before,
except
  • all accesses to ipAddr now access ipAddress
    instead of the copy.
  • Any attempt to change ipAddr will generate a
    compiler error (which makes sense, since its
    movement is IN, not OUT).

27
28
Discussion
Copying time is not significant for simple types
(e.g., int, char, double, ...), but it is
significant for class types (e.g., string,
RandomInt, ...).So use value parameters to store
simple type arguments whose movement is TO. Use
reference parameters for arguments whose movement
is BACK or TO BACK Use const reference
parameters to store class arguments whose
movement is TO.
28
Write a Comment
User Comments (0)
About PowerShow.com