Download presentation
Presentation is loading. Please wait.
1
Software Engineering 3156 28-Nov-01 #23: OS, Language, Design Patterns Phil Gross
2
2 Administrivia Integration prototype is up JSP and Servlets – Wednesday, Nov 28 th, 6-8pm Final exam – Very little C++/OS – A bit of C Research Fair this Friday
3
3 More on C Will be on next homework Need to be able to do basic stuff Simple C++ is generally easier than C – Although C++ is capable of being much more complicated
4
4 Miscellany on structs Since not everything happens in main, malloc’ing structs is very common – The sizeof operator works on pretty much any datatype, be it structs or primitive datatypes – Guaranteed tip: you will come across PointP myP = (PointP)malloc(sizeof(PointP)); – and be glad that you were attending this class…
5
5 Miscellany on structs (*myP).x is messy – C has a shortcut: myP -> x – Always remember that a -> b is equivalent to (*a).b – Precedence of operators It’s cumbersome to have to say struct Point every time – Use typedefs: define “aliases” typedef struct Point PointT; – or even typedef struct Point *PointP;
6
6 Function prototypes As I said, C’s compiler is not all that smart If you have: int main(void) { int i = foo(); } int foo(void) { return 5; } It will not work
7
7 Function prototypes (II) Need to clue in the compiler by putting the following prototype before main: int foo(void); Looks like a Java interface construct Often, you collect the prototypes into a header (.h) file, then #include it into your various source (.c) files
8
8 On various.c files… A common way to build multi-source-file code in C is to – build a set of.h files that export functionality (i.e. “public” methods) – #include these.h files – Compile and link the.c files together As long as you have a prototype, the compiler will not care about the definition – Like compiling against an Interface – The Linker will, though…
9
9 Useful libc commands (I) printf: Output text: like System.out.println printf(“%d\n”, intval); printf(“%d%f\n”, intval, floatval); man printf scanf: Input text: no BufferedReader scanf(“%d”, &intval) – note the ampersand Also, fprintf/fscanf and sprintf/sscanf
10
10 Useful libc commands (II) gets(string) gets a line of text and puts it in string Janak says: Should technically use fgets(stdin, string) Phil says: Never use gets(). Or if you do, never complain about Microsoft bugs again. Why not &string? puts() also exists: more like println, actually Can’t use + to concatenate
11
11 Streams in C FILEs (almost always FILE *) Open with fopen(), close with fclose() Have fread() and fwrite() Plus fprintf() and fscanf() And ftell()/fseek() for random access Are buffered Have pushback
12
12 Text to int atoi(string) – Roughly equivalent to Integer.parseInt, although not nearly as smart – No exceptions Can also use sscanf() – Slower, but much more programmable
13
13 STL Again Really quite cool Often can do away with most explicit loops Which is a good thing
14
14 The Idea How to iterate through an array Method 1: by index Method 2: using pointers See stl_1.cc Next step is obviously templates See stl_2.cc
15
15 What About Vectors? Need something “pointer-like” for vectors Has to support *, ++, ==, != Plus some way of getting begin and end values All Standard Library containers (including vectors) support this! “Pointer-Like-Thingies” are called Iterators Defined inside the container class
16
16 A Note On Scope Scope = where a variable is visible C++ allows you to explicitly specify scope using the :: operator foo::bar – bar is defined inside class or namespace foo ::baz – baz is global See scope.cc
17
17 What Do Iterators Look like? vector svec; vector ::iterator iter = svec.begin(); What is the type of iter? – Answer: “the iterator type defined inside class vector ” All container types have functions begin() and end() that return iterators
18
18 Sooo…. Suppose we templatize our find() function on both elemType and iterType Now it works on arrays And all containers in the standard library See stl_3.cc
19
19 What are These Function Objects? find_if() takes a predicate function Returns values for which it is true How do we do that, exactly? Naïve filter implementation: stl_4.cc Function pointer implementation: stl_5.cc Function objects: zero overhead function- pointer-like thingies supplied with STL
20
20 Such As? Arithmetic – plus, minus, negate, multiplies, divides, modulus Relational – less, less_equal, greater, greater_equal, equal_to, not_equal_to Logical – logical_and, logical_or, logical_not
21
21 Example Create a new sequence that is the sum of fib and pell transform(fib.begin(), fib.end(), pell.begin(), target.begin(), plus () );
22
22 Seems Kind of Limited Function adapters add flexibility Bind1st and bind2nd fix the values of the first or second parameters of a binary function find_if(iter, vec.end(), bind2nd(less, 10)) – Finds first item that is less than 10 You can make your own function objects
23
23 Maps and Sets map words; words[“Vermeer”] = 7; if (words[“Rembrandt”] == 3) {… set modern; if (modern.count(“Mondriaan”)) {…
24
24 What If Our Target is Initially Empty? Iterator inserters Act like output iterators, but actually call insertion methods back_inserter(C), front_inserter(C), inserter(C,i) unique_copy(ivec.begin(), ivec.end(), back_inserter(result_vec));
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.