cs222
DESCRIPTION
Week 5 - Monday. CS222. Last time. What did we talk about last time? Processes Lab 4. Questions?. Project 2. Quotes. A C program is like a fast dance on a newly waxed dance floor by people carrying razors. Waldi Ravens. Arrays. Declaration of an array. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/1.jpg)
CS222Week 5 - Monday
![Page 2: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/2.jpg)
Last time
What did we talk about last time? Processes Scope Lab 4
![Page 3: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/3.jpg)
Questions?
![Page 4: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/4.jpg)
Project 2
![Page 5: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/5.jpg)
Quotes
A C program is like a fast dance on a newly waxed dance floor by people carrying razors.
Waldi Ravens
![Page 6: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/6.jpg)
extern declarations
What if you want to use a global variable declared in another file?
No problem, just put extern before the variable declaration in your file
There should only be one true declaration, but there can be many extern declarations referencing it
Function prototypes are implicitly extern
int count;
extern int
count;
extern int
count;extern int
count;
file1.c
file2.c
file3.c
program.c
![Page 7: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/7.jpg)
static declarations
The static keyword causes confusion in Java because it means a couple of different (but related) things
In C, the static keyword is used differently, but also for two confusing things Global static declarations Local static declarations
![Page 8: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/8.jpg)
Global static variables
When the static modifier is applied to a global variable, that variable cannot be accessed in other files
A global static variable cannot be referred to as an extern in some other file
If multiple files use the same global variable, each variable must be static or an extern referring to a single real variable Otherwise, the linker will complain that it's got
variables with the same name
![Page 9: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/9.jpg)
Local static variables
You can also declare a static variable local to a function
These variables exist for the lifetime of the program, but are only visible inside the method
Some people use these for bizarre tricks in recursive functions
Try not to use them! Like all global variables, they make code harder
to reason about They are not thread safe
![Page 10: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/10.jpg)
Local static example
#include <stdio.h>
void unexpected(){static int count = 0;count++;printf("Count: %d", count);}
int main(){unexpected(); //Count: 1unexpected(); //Count: 2unexpected(); //Count: 3return 0;}
![Page 11: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/11.jpg)
The register modifier
You can also use the register keyword when declaring a local variable
It is a sign to the compiler that you think this variable will be used a lot and should be kept in a register
It's only a suggestion You can not use the reference operator (which we
haven't talked about yet) to retrieve the address of a register variable
Modern compilers are better at register allocation than humans usually are
register int value;
![Page 12: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/12.jpg)
Arrays
![Page 13: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/13.jpg)
Declaration of an array
To declare an array of a specified type with a given name and a given size:
Example with a list of type int:
type name[ size ];
int list[ 100 ];
![Page 14: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/14.jpg)
Differences from Java
When you declare an array, you are creating the whole array
There is no second instantiation step It is possible to create dynamic arrays using
pointers and malloc(), but we haven't talked about it yet
You must give a fixed size (literal integer or a #define constant) for the array
These arrays sit on the stack in C Creating them is fast, but inflexible You have to guess the maximum amount of space
you'll need ahead of time
![Page 15: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/15.jpg)
Accessing elements of an array You can access an element of an array by
indexing into it, using square brackets and a number
Once you have indexed into an array, that variable behaves exactly like any other variable of that type
You can read values from it and store values into it Indexing starts at 0 and stops at 1 less than
the length Just like Java
list[9] = 142;printf("%d", list[9]);
![Page 16: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/16.jpg)
Length of an array
The length of the array must be known at compile time Our version of gcc has looser rules about this, but C90
insists on true constants There is no length member or length() method It is possible to find out how many bytes a
statically allocated array uses with sizeof But you can only be sure that works in the function
where the array is defined!
int list[100];int size = sizeof(list); //400int length = size/sizeof(int); //100
![Page 17: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/17.jpg)
Arrays start filled with garbage
When you create an array, it is not automatically filled with any particular value
Inside the array (like any variable in C) is garbage
With regular variables, you might get a warning if you use a variable before you initialize it
With an array, you won't
![Page 18: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/18.jpg)
Explicit initialization
Explicit initialization can be done with a list:
You can omit the size if you use an explicit initialization because the compiler can figure it out
int primes[10] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };
char grades[] = { 'A', 'B', 'C', 'D', 'F'};
![Page 19: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/19.jpg)
memset()
The C standard library has a function called memset() that can set all the bytes in a chunk of memory to a particular value
Using it is guaranteed to be no slower than using a loop to initialize all the values in your array It usually uses special instructions to set big chunks of
memory at the same time
int values[100];memset(values, 0, sizeof(int)*100); //zeroes out arraychar letters[26];memset(letters, 'A', sizeof(char)*26);//sets array to all 'A's
![Page 20: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/20.jpg)
memcpy()
memset() is mostly useful for initialization (and usually only for zeroing things out)
memcpy() is a fast way to copy values from one array to another Again, it's at least as fast as using your own loop Again, it's somewhat dangerous since it lets you write
memory places en masse
int cubes[100];int copy[100];int i = 0;for( i = 0; i < 100; i++)cubes[i] = i*i*i;
memcpy(copy, cubes, sizeof(cubes));
![Page 21: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/21.jpg)
Passing arrays to functions Using an array in a function where it wasn't created is a
little different You have to pass in the length The function receiving the array has no other way to
know what the length is sizeof will not work because it is based on what is known at
compile time The function should list an array parameter with empty
square brackets on the right of the variable No brackets should be used on the argument when the
function is called Like Java, arguments are passed by value, but the
contents of the array are passed by reference Changes made to an array in a function are seen by the caller
![Page 22: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/22.jpg)
Array to function example
Calling code:
int values[100];int i = 0;for( i = 0; i < 100; i++ )values[i] = i + 1;
reverse(values, 100);
![Page 23: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/23.jpg)
Array to function example
Function:void reverse(int array[], int length){int start = 0;int end = length – 1;int temp = 0;while( start < end ){
temp = array[start];array[start++] = array[end];array[end--] = temp;
}}
![Page 24: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/24.jpg)
Returning arrays
In C, you can't return the kind of arrays we're talking about Why?
They are allocated on the stack When a function returns, all its
memory disappears If you dynamically allocate an array
with malloc(), you can return a pointer to it
![Page 25: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/25.jpg)
Array Memory
![Page 26: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/26.jpg)
Memory
An array takes up the size of each element times the length of the array
Each array starts at some point in computer memory
The index used for the array is actually an offset from that starting point
That’s why the first element is at index 0
![Page 27: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/27.jpg)
A look at memory
We can imagine that we have an array of type int of length 10
Let’s say the array starts at address 524
12 43 -9 6 789 0 -23 23 10 6
0 1 2 3 4 5 6 7 8 9
524 528 532 536 540 544 548 552 556 560
Addresses
Indexes
![Page 28: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/28.jpg)
Multidimensional arrays
It is legal to declare multidimensional arrays in C
They'll work just as you would expect Except! You have to give the second dimension when
passing to a function (otherwise, it won't know how big of a step to take when going from row to row)
char board[8][8];
void clearBoard( char board[][8]){int i = 0;int j = 0;for( i = 0; i < 8; i++ )
for( j = 0; j < 8; j++ )board[i][j] = ' ';
}
![Page 29: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/29.jpg)
Array example
Write a program that reads an integer from the user saying how many values will be in a list Assume no more than 100 If the user enters a value larger than 100, tell them to
try a smaller value Read these values into an array Find
Maximum Minimum Mean Variance Median Mode
![Page 30: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/30.jpg)
Review of Compiling Multiple Files
![Page 31: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/31.jpg)
Components
C files All the sources files that contain executable
code Should end with .c
Header files Files containing extern declarations and
function prototypes Should end with .h
Makefile File used by Unix make utility Should be named either makefile or Makefile
![Page 32: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/32.jpg)
C files
You can have any number of .c files forming a program
Only one of them should have a main() function
If the functions in a .c file will be used in other files, you should have a corresponding .h file with all the prototypes for those functions whatever.c should have a matching whatever.h
Both the .c file that defines the functions and any that use them should include the header
![Page 33: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/33.jpg)
Header files
Sometimes header files include other header files For this reason, it is wise to use conditional
compilation directives to avoid multiple inclusion of the contents of a header file
For a header file called wombat.h, one convention is the following:
#ifndef WOMBAT_H#define WOMBAT_H
//maybe some #includes of other headers//lots of function prototypes
#endif
![Page 34: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/34.jpg)
Compiling
When compiling multiple files, you can do it all on one line:
Alternatively, you can compile files individually and then link them together at the end
gcc main.c utility.c wombat.c –o program
gcc –c main.cgcc –c utility.cgcc –c wombat.c gcc main.o utility.o wombat.o –o program
![Page 35: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/35.jpg)
Makefile
Compiling files separately is more efficient if you are only changing one or two of them
But it's a pain to type the commands that recompile only the updated files
That's why makefiles were inventedprogram: main.o utility.o wombat.o
gcc main.o utility.o wombat.o –o program
main.o: main.c utility.h wombat.hgcc –c main.c
utility.o: utility.c utility.hgcc –c utility.c
wombat.o: wombat.c wombat.hgcc –c wombat.c
clean:rm –f *.o program
![Page 36: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/36.jpg)
Upcoming
![Page 37: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/37.jpg)
Next time…
Strings
![Page 38: CS222](https://reader035.vdocuments.net/reader035/viewer/2022062723/56813b74550346895da481d1/html5/thumbnails/38.jpg)
Reminders
Keep reading K&R chapter 5 Keep working on Project 2
Due Friday Exam 1 next Monday