C For Java Programmers
C For Java Programmers
Advanced Programming
Credits
Software Construction (J. Shepherd) Operating Systems at Cornell (Indranil Gupta)
18-Mar-14
Overview
Why learn C after Java? A brief background on C C preprocessor Modular C programs
18-Mar-14
18-Mar-14
Philosophical considerations:
Being multi-lingual is good! Should be able to trace program from UI to assembly (EEs: to electrons)
18-Mar-14
C pre-history
1960s: slew of new languages
COBOL for commercial programming (databases) FORTRAN for numerical and scientific programs PL/I as second-generation unified language LISP, Simula for CS research, early AI Assembler for operating systems and timingcritical code
Operating systems:
OS/360 MIT/GE/Bell Labs Multics (PL/I)
18-Mar-14 Advanced Programming Spring 2002 6
C pre-history
Bell Labs (research arm of Bell System -> AT&T -> Lucent) needed own OS BCPL as Multics language Ken Thompson: B Unix = Multics bits Dennis Ritchie: new language = B + types Development on DEC PDP-7 with 8K 16-bit words
18-Mar-14
C history
C
Dennis Ritchie in late 1960s and early 1970s systems programming language
make OS portable across hardware platforms not necessarily for real applications could be written in Fortran or PL/I
C++
Bjarne Stroustrup (Bell Labs), 1980s object-oriented features
Java
James Gosling in 1990s, originally for embedded systems object-oriented, like C++ ideas and some syntax from C
18-Mar-14 Advanced Programming Spring 2002 8
(More) C disadvantages:
language is portable, APIs are not memory and handle leaks preprocessor can lead to obscure errors
18-Mar-14 Advanced Programming Spring 2002 9
C vs. C++
Well cover both, but C++ should be largely familiar Very common in Windows Possible to do OO-style programming in C C++ can be rather opaque: encourages clever programming
18-Mar-14
10
18-Mar-14
11
C vs. Java
Java object-oriented C function-oriented
strongly-typed
polymorphism (+, ==)
can be overridden
very limited (integer/float)
(mostly) single name space, fileoriented
byte-stream I/O
18-Mar-14
12
C vs. Java
Java automatic memory management no pointers C function calls (C++ has some support) pointers (memory addresses) common
by-reference, by-value
exceptions, exception handling concurrency (threads)
by-value parameters
if (f() < 0) {error} OS signals library functions
18-Mar-14
13
C vs. Java
Java
length of array string as type dozens of common libraries
C
on your own just bytes (char []), with 0 end OS-defined
18-Mar-14
14
C vs. Java
Java program
collection of classes class containing main method is starting class running java StartClass invokes StartClass.main method
JVM loads other classes as required
18-Mar-14
15
C program
collection of functions one function main() is starting function running executable (default name a.out) starts main function typically, single program with all user code linked in but can be dynamic libraries (.dll, .so)
18-Mar-14
16
C vs. Java
public class hello { public static void main (String args []) { System.out.println (Hello world); } } #include <stdio.h> int main(int argc, char *argv[]) { puts(Hello, World); return 0; }
18-Mar-14
17
18-Mar-14
18
18-Mar-14
19
Simple example
#include <stdio.h> void main(void) { printf(Hello World. \n \t and you ! \n ); /* print out a message */ return; }
void main(void){ } is the only code executed printf( /* message you want printed */ ); \n = newline, \t = tab \ in front of other special characters within printf.
18-Mar-14
21
18-Mar-14
22
Executing a C program
Name of executable + space-separated arguments $ a.out 1 23 third arg
argc
4 argv
a.out
18-Mar-14
23
third arg
23
Executing a C program
If no arguments, simplify:
int main() { puts(Hello World); exit(0); }
18-Mar-14
24
Executing C programs
Scripting languages are usually interpreted
perl (python, Tcl) reads script, and executes it sometimes, just-in-time compilation invisible to user
Executing C programs
x.pl perl data x.java javac args java results
x.c, x.cc
gcc, g++
a.out
18-Mar-14
26
18-Mar-14
27
gcc
Behavior controlled by command-line switches:
-o file -Wall -c -g -p -l -E output file for object or executable all warnings use always! compile single module (non-main) insert debugging code (gdb) insert profiling code library preprocessor output only
18-Mar-14
28
Using gcc
Two-stage compilation
pre-process & compile: gcc c hello.c link: gcc o hello hello.o
18-Mar-14
29
18-Mar-14
30
18-Mar-14
31
gcc errors
Produces object code for each module Assumes references to external names will be resolved later Undefined names will be reported when linking:
undefined symbol first referenced in file _print program.o ld fatal: Symbol referencing errors No output written to file.
18-Mar-14
32
C preprocessor
The C preprocessor (cpp) is a macroprocessor which
manages a collection of macro definitions reads a C program and transforms it Example:
#define MAXVALUE 100 #define check(x) ((x) < MAXVALUE) if (check(i) { }
becomes
if ((i) < 100) {}
18-Mar-14
33
C preprocessor
Preprocessor directives start with # at beginning of line:
define new macros input files with C code (typically, definitions) conditionally compile parts of file
18-Mar-14
34
C preprocessor
#define name const-expression #define name (param1,param2,) expression #undef symbol replaces name with constant or expression textual substitution symbolic names for global constants in-line functions (avoid function call overhead)
mostly unnecessary for modern compilers
type-independent code
18-Mar-14 Advanced Programming Spring 2002 35
C preprocessor
Example: #define MAXLEN 255
Lots of system .h files define macros invisible in debugger getchar(), putchar() in stdio library Caution: dont treat macros like function calls
#define valid(x) ((x) > 0 && (x) < 20) if (valid(x++)) {} valid(x++) -> ((x++) > 0 && (x++) < 20)
18-Mar-14
36
inserts contents of filename into file to be compiled filename relative to current directory <filename> relative to /usr/include gcc I flag to re-define default import function prototypes (cf. Java import) Examples:
#include <stdio.h> #include mydefs.h #include /home/alice/program/defs.h
18-Mar-14
37
C preprocessor - ifdef
For boolean flags, easier:
#ifdef name code segment 1 #else code segment 2 #endif
Advice on preprocessor
Limit use as much as possible
subtle errors not visible in debugging code hard to read
much of it is historical baggage there are better alternatives for almost everything:
#define INT16 -> type definitions #define MAXLEN -> const #define max(a,b) -> regular functions comment out code -> CVS, functions
Comments
/* any text until */ // C++-style comments careful! no /** */, but doc++ has similar conventions Convention for longer comments:
/* * AverageGrade() * Given an array of grades, compute the average. */
long long
float double
8
4 8
18-Mar-14
42
char = 1 character, but only true for ASCII and other Western char sets
18-Mar-14
43
Example
#include <stdio.h> void main(void) { int nstudents = 0; /* Initialization, required */ printf(How many students does Columbia have ?:); scanf (%d, &nstudents); /* Read input */ printf(Columbia has %d students.\n, nstudents); return ; } $ How many students does Columbia have ?: 20000 (enter) Columbia has 20000 students.
18-Mar-14 Advanced Programming Spring 2002 44
Type conversion
#include <stdio.h> void main(void) { int i,j = 12; /* i not initialized, only j */ float f1,f2 = 1.2;
i = (int) f2; f1 = i;
18-Mar-14
45
If either is float, the other is made float, etc. Explicit: type casting (type) Almost any conversion does something but not necessarily what you intended
18-Mar-14 Advanced Programming Spring 2002 46
Type conversion
int x = 100000; short s; s = x; printf(%d %d\n, x, s); 100000 -31072
18-Mar-14
47
C no booleans
C doesnt have booleans Emulate as int or char, with values 0 (false) and 1 or non-zero (true) Allowed by flow control statements:
if (n = 0) { printf(something wrong); }
18-Mar-14
48
User-defined types
typedef gives names to types:
typedef short int smallNumber; typedef unsigned char byte; typedef char String[100]; smallNumber x; byte b; String name;
18-Mar-14
49
18-Mar-14
50
Enumerated types
Define new integer-like types as enumerated types:
typedef enum { Red, Orange, Yellow, Green, Blue, Violet } Color; enum weather {rain, snow=2, sun=4};
look like C identifiers (names) are listed (enumerated) in definition treated like integers
can add, subtract even color + weather cant print as symbol (unlike Pascal) but debugger generally will
18-Mar-14
51
Enumerated types
Just syntactic sugar for ordered collection of integer constants:
typedef enum { Red, Orange, Yellow } Color;
is like
#define Red 0 #define Orange 1 #define Yellow 2
18-Mar-14
52
Variables defined in {} block are active only in block Variables defined outside a block are global (persist during program execution), but may not be globally visible (static)
18-Mar-14 Advanced Programming Spring 2002 53
Data objects
Variable = container that can hold a value
in C, pretty much a CPU word or similar
Data objects
Every data object in C has
a name and data type (specified in definition) an address (its relative location in memory) a size (number of bytes of memory it occupies) visibility (which parts of program can refer to it) lifetime (period during which it exists)
Warning:
int *foo(char x) { return &x; } pt = foo(x); *pt = 17;
18-Mar-14 Advanced Programming Spring 2002 55
Data objects
Unlike scripting languages and Java, all C data objects have a fixed size over their lifetime
except dynamically created objects
18-Mar-14
56
Memory allocation
Note: malloc() does not initialize data
void *calloc(size_t n, size_t elsize)
does initialize (to zero) Can also change size of allocated memory blocks:
void *realloc(void *ptr, size_t size) ptr points to existing block, size is new size
Header info
100 Code 400
all malloc()s
560
Data - Heap
Dynamic memory
1010
Data - stack
1200
Advanced Programming Spring 2002
18-Mar-14
61
&x int *
18-Mar-14
42
int
Advanced Programming Spring 2002 62
void pointers
Generic pointer Unlike other pointers, can be assigned to any other pointer type:
void *v; char *s = v;
18-Mar-14
64
Control structures
Same as Java sequencing: ; grouping: {...} selection: if, switch iteration: for, while
18-Mar-14
65
18-Mar-14
66
The if statement
Same as Java
if (condition1) {statements1} else if (condition 2) {statements2} else if (condition n-1) {statements else {statementsn}
n-1}|
evaluates statements until find one with nonzero result executes corresponding statements
18-Mar-14
67
The if statement
Can omit {}, but careful
if (x > 0) printf(x > 0!); if (y > 0) printf(x and y > 0!);
18-Mar-14
68
Effect: evaluates integer expression looks for case with matching value executes corresponding statements (or defaults)
18-Mar-14 Advanced Programming Spring 2002 69
Repetition
C has several control structures for repetition
Statement while(c) {} do {...} while(c)
for (start; cond; upd)
repeats an action... zero or more times, while condition is 0 one or more times, while condition is 0
zero or more times, with initialization and update
18-Mar-14
71
18-Mar-14
72
18-Mar-14
73
18-Mar-14
74
Arrays
Arrays are defined by specifying an element type and number of elements
int vec[100]; char str[30]; float m[10][10];
For array containing N elements, indexes are 0..N-1 Stored as linear arrangement of elements Often similar to pointers
18-Mar-14
75
Arrays
C does not remember how large arrays are (i.e., no length attribute) int x[10]; x[10] = 5; may work (for a while) In the block where array A is defined:
sizeof A gives the number of bytes in array can compute length via sizeof A /sizeof A[0]
Arrays
Array elements are accessed using the same syntax as in Java: array[index] Example (iteration over array):
int i, sum = 0; ... for (i = 0; i < VECSIZE; i++) sum += vec[i];
C does not check whether array index values are sensible (i.e., no bounds checking)
vec[-1] or vec[10000] will not generate a compiler
Arrays
C references arrays by the address of their first element array is equivalent to &array[0] can iterate through arrays using pointers as well as indexes:
int *v, *last; int sum = 0; last = &vec[VECSIZE-1]; for (v = vec; v <= last; v++) sum += *v;
18-Mar-14
78
2-D arrays
2-dimensional array
int weekends[52][2];
[0][0]
[0][1]
[1][0]
[1][1]
[2][0]
[2][1]
[3][0]
. . .
weekends
18-Mar-14
79
Arrays - example
#include <stdio.h> void main(void) { int number[12]; /* 12 cells, one cell per student */ int index, sum = 0; /* Always initialize array before use */ for (index = 0; index < 12; index++) { number[index] = index; } /* now, number[index]=index; will cause error:why ?*/ for (index = 0; index < 12; index = index + 1) { sum += number[index]; /* sum array elements */ } return; }
18-Mar-14
80
18-Mar-14
82
structs
Similar to fields in Java object/class definitions components can be any type (but not recursive) accessed using the same syntax struct.field Example:
struct {int x; char y; float z;} rec; ... r.x = 3; r.y = a; r.z= 3.1415;
18-Mar-14
83
structs
Record types can be defined
using a tag associated with the struct definition wrapping the struct definition inside a typedef
Examples:
struct complex {double real; double imag;}; struct point {double x; double y;} corner; typedef struct {double real; double imag;} Complex; struct complex a, b; Complex c,d;
a and b have the same size, structure and type a and c have the same size and structure, but different types
18-Mar-14 Advanced Programming Spring 2002 84
structs
Overall size is sum of elements, plus padding for alignment:
struct { char x; int y; char z; } s1; sizeof(s1) = ? struct { char x, z; int y; } s2; sizeof(s2) = ?
18-Mar-14
85
structs - example
struct person { char name[41]; int age; float height; struct { /* embedded structure */ int month; int day; int year; } birth; }; struct person me; me.birth.year=1977; struct person class[60]; /* array of info about everyone in class */ class[0].name=Gun; class[0].birth.year=1971;
18-Mar-14
86
structs
Often used to model real memory layout, e.g.,
typedef struct unsigned int unsigned int unsigned int unsigned int unsigned int u_int16 seq; u_int32 ts; } rtp_hdr_t; { version:2; p:1; cc:4; m:1; pt:7;
18-Mar-14
87
18-Mar-14
88
Bit fields
On previous slides, labeled integers with size in bits (e.g., pt:7) Allows aligning struct with real memory data, e.g., in protocols or device drivers Order can differ between little/big-endian systems Alignment restrictions on modern processors natural alignment Sometimes clearer than (x & 0x8000) >> 31
18-Mar-14 Advanced Programming Spring 2002 89
Unions
Like structs:
union u_tag { int ival; float fval; char *sval; } u;
but occupy same memory space can hold different types at different times overall size is largest of elements
18-Mar-14
90
More pointers
int month[12]; /* month is a pointer to base address 430*/
month[3] = 7;
ptr = month + 2; /* ptr points to month[2], => ptr is now (430+2 * int elements)= 438 */ ptr[5] = 12; /* ptr address + 5 int elements => int at address (434+5*4) is now 12. Thus, month[7] is now 12 */ ptr++; /* ptr <- 438 + 1 * size of int = 442 */ (ptr + 4)[2] = 12; /* accessing ptr[6] i.e., array[9] */
Now , month[6], *(month+6), (month+4)[2], ptr[3], *(ptr+3) are all the same integer variable.
18-Mar-14 Advanced Programming Spring 2002 91
18-Mar-14
92
Functions
Prototypes and functions (cf. Java interfaces)
extern int putchar(int c); putchar(A); int putchar(int c) { do something interesting here }
If defined before use in same file, no need for prototype Typically, prototype defined in .h file Good idea to include <.h> in actual definition
18-Mar-14 Advanced Programming Spring 2002 93
Functions
static functions and variables hide them to those outside the same file:
static int x; static int times2(int c) { return c*2; }
18-Mar-14
94
Functions - extern
#include <stdio.h> extern char user2line [20]; /* global variable defined in another file */ /* global for this file */
18-Mar-14
96
18-Mar-14
97
Overloading functions
must include <stdarg.h>:
#include <stdarg.h> double product(int number, ...) { va_list list; double p; int i; va_start(list, number); for (i = 0, p = 1.0; i < number; i++) { p *= va_arg(list, double); } va_end(list); }
Overloading functions
Limitations:
cannot access arguments in middle
needs to copy to variables or local array
18-Mar-14
99
hw.c
mypgm.c
void myproc(void); int mydata;
Library headers
Standard User-defined
18-Mar-14
mypgm.h
Advanced Programming Spring 2002 100
Data hiding in C
C doesnt have classes or private members, but this can be approximated Implementation defines real data structure:
#define QUEUE_C #include queue.h typedef struct queue_t { struct queue_t *next; int data; } *queue_t, queuestruct_t; queue_t NewQueue(void) { return q; }
18-Mar-14
101
Pointer to function
func(); /*function returning integer*/ *func(); /*function returning pointer to integer*/ (*func)(); /*pointer to function returning integer*/ *(*func)(); /*pointer to func returning ptr to int*/
18-Mar-14
102
Function pointers
int (*fp)(void); double* (*gp)(int); int f(void) double *g(int); fp=f; gp=g;
/* alternative */
103
#include <stdio.h>
void myproc (int d); void mycaller(void (* f)(int), int param); void main(void) { myproc(10); /* call myproc with parameter 10*/ mycaller(myproc, 10); /* and do the same again ! */ } void mycaller(void (* f)(int), int param){ (*f)(param); /* call function *f with param */ } void myproc (int d){ . . . }
18-Mar-14
/* do something with d */
Advanced Programming Spring 2002 104
Libraries
C provides a set of standard libraries for
numerical math functions
character strings character types I/O
<math.h>
<string.h> <ctype.h> <stdio.h>
-lm
18-Mar-14
105
4*math.pow(x,3) 4*pow(x,3)
18-Mar-14
106
Characters
The char type is an 8-bit byte containing ASCII code values (e.g., A = 65, B = 66, ...) Often, char is treated like (and converted to) int <ctype.h> contains character classification functions:
isalnum(ch)
isalpha (ch) isdigit(ch) ispunct(ch) isspace(ch) isupper(ch) islower(ch)
18-Mar-14
alphanumeric
alphabetic digit punctuation white space upper-case lower-case
Advanced Programming Spring 2002
[a-zA-Z0-9]
[a-zA-Z] [0-9] [~!@#%^&...] [ \t\n] [A-Z] [a-z]
107
Strings
In Java, strings are regular objects In C, strings are just char arrays with a NUL (\0) terminator c a t \0 a cat = a A literal string (a cat)
is automatically allocated memory space to contain it and the terminating \0 has a value which is the address of the first character cant be changed by the program (common bug!)
All other strings must have space allocated to them by the program
18-Mar-14
108
Strings
char *makeBig(char *s) { s[0] = toupper(s[0]); return s; } makeBig(a cat);
18-Mar-14
109
Strings
We normally refer to a string via a pointer to its first character:
char *str = my string; char *s; s = &str[0]; s = str;
Strings
Can treat like arrays:
char c; char line[100]; for (i = 0; i < 100 && line[c]; i++) { if (isalpha(line[c]) ... }
18-Mar-14
111
Copying strings
Copying content vs. copying pointer to content s = t copies pointer s and t now refer to the same memory location strcpy(s, t); copies content of t to s
char mybuffer[100]; ... mybuffer = a cat;
18-Mar-14
113
string.h library
Assumptions:
#include <string.h>
Operations:
char *strcpy(char *dest, char *source) copies chars from source array into dest array up to NUL char *strncpy(char *dest, char *source, int num) copies chars; stops after num chars if no NUL before that; appends NUL
18-Mar-14 Advanced Programming Spring 2002 114
string.h library
int strlen(const char *source) returns number of chars, excluding NUL char *strchr(const char *source, const char ch) returns pointer to first occurrence of ch in source; NUL if none char *strstr(const char *source, const char *search) return pointer to first occurrence of search in source
18-Mar-14
115
Formatted strings
String parsing and formatting (binary from/to text)
int sscanf(char *string, char *format, ...) parse the contents of string according to format placed the parsed items into 3rd, 4th, 5th, ... argument return the number of successful conversions int sprintf(char *buffer, char *format, ...) produce a string formatted according to format place this string into the buffer the 3rd, 4th, 5th, ... arguments are formatted return number of successful conversions
18-Mar-14
116
Formatted strings
The format strings for sscanf and sprintf contain
plain text (matched on input or inserted into the output) formatting codes (which must match the arguments)
The sprintf format string gives template for result string The sscanf format string describes what input should look like
18-Mar-14 Advanced Programming Spring 2002 117
Formatted strings
Formatting codes for sscanf
Code
%c %d
meaning
matches a single character matches an integer in decimal
variable
char int
%f
%s
float
char *
char *
18-Mar-14
118
Formatted strings
Formatting codes for sprintf Values normally right-justified; use negative field width to get left-justified Code %nc meaning char in field of n spaces variable char
%nd
%n.mf %n.mg %n.ms
18-Mar-14
int, long
float, double
precision
18-Mar-14
120
can be connected to file system files for reading and writing represent a buffered stream of chars (bytes) to be written or read
18-Mar-14
122
int putchar(int c)
write the character c onto stdout; returns c or EOF
read the next line from in into buffer buf halts at \n or after size-1 characters have been read the \n is read, but not included in buf returns pointer to strbuf if ok, NULL otherwise do not use gets(char *) buffer overflow
int fputs(const char *str, FILE *out)
writes the string str to out, stopping at \0 returns number of characters written or EOF
18-Mar-14 Advanced Programming Spring 2002 124
18-Mar-14
125
18-Mar-14
126