1 / 28

Parameter Passing Mechanisms

Parameter Passing Mechanisms. Reference Parameters §10.1 - §10.3. 1. Find/locate IP address. ipv6 16 bytes. Problem.

Download Presentation

Parameter Passing Mechanisms

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Parameter Passing Mechanisms Reference Parameters §10.1 - §10.3 1

  2. Find/locate IP address ipv6 16 bytes Problem IPv4 (Internet Protocol) addresses are expressed using "dotted decimal" notation:aaa.bbb.ccc.dddwhere 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. Where? main() or in function Objects Movement Description Type Name IP addressstring 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 stringyes string find() halt if erroryes 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 thecopy, 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 parameterchanges the value of its corresponding argument. In C++, reference parameters are declared with anampersand (&)following the parameter’s 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 != string::npos); info1 = ipAddr.substr(0, dot1); int dot2 = ipAddr.find(".", dot1 + 1); assert(dot2 != string::npos); info2 = ipAddr.substr(dot1 + 1, dot2 - dot1 - 1); int dot3 = ipAddr.find(".", dot2 + 1); assert(dot3 != string::npos); info3 = ipAddr.substr(dot2 + 1, dot3 - dot2 - 1); assert(ipAddr.find(".", dot3 + 1) == string::npos); 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 << "Enter an IP address: ";string ipAddress, part1, part2, part3, part4;cin >> ipAddress; chopIPAddress(ipAddress, part1, part2, part3, part4); cout << "Network/Host blocks are:\n" << part1 << endl << part2 << endl << part3 << endl << part4 << 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, info4is an alias of the corresponding argument — part1, part2, part3, part4; they sharethe 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 << "Enter an IP address: ";string ipAddress, part1, part2, part3, part4;cin >> 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 ipAddr 153.106.4.23 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 ipAddr 153.106.4.23 Memory int dot1 = ipAddr.find(".", 0); assert(dot1 != string::npos); info1 = ipAddr.substr(0, dot1); 16

  17. 4. The function computesinfo2, changing part2 ipAddress 153.106.4.23 part1 153 info1 part2 106 info2 part3 ? ? info3 part4 info4 ipAddr 153.106.4.23 Memory int dot2 = ipAddr.find(".", dot1 + 1); assert(dot2 != string::npos); 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 4 info3 part4 ? info4 ipAddr 153.106.4.23 Memory int dot3 = ipAddr.find(".", dot2 + 1); assert(dot3 != string::npos); 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 4 info3 part4 23 info4 ipAddr 153.106.4.23 Memory assert(ipAddr.find(".", dot3 + 1) == string::npos); 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 << "Network/Host blocks are:\n" << part1 << endl << part2 << endl << part3 << endl << part4 << 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 function’s 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 ipAddress 153.106.4.23 ipAddr 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

More Related