Title: Parameter Passing Mechanisms
1Parameter Passing Mechanisms
Reference Parameters 10.1 - 10.3
1
2Problem
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
3Preliminary 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
4Behavior
- 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
5Objects
Movement
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
6Operations
- 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
7Algorithm
- 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
8Discussion
- 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
9Solution 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
10Coding
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
11Testing
- 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
12Notes
- 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
130. 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
141. 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)
152. 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)
163. 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
174. 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
185. 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
196. 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
207. 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
218. 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
22Notes
- 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
23An 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
250. Before the function call
ipAddress
153.106.4.23
? ? ? ?
part1
part2
part3
part4
Memory
25
261. ipAddr is created as aconst reference of
original
ipAddr
ipAddress
153.106.4.23
part1
read-only
part2
part3
part4
Memory
26
272. 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
28Discussion
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