320 likes | 443 Views
Lab 2: The Unix environment, Using vi, C programming SITE, uOttawa. Practical tools. Editor Vi (emac) Compiler gcc Makefile make Debugging gdb. Using C/Unix/Linux at SITE. $ ssh linux. Vi Editor. A screen-based editor used by Unix users An experience with vi Starting the editor
E N D
Lab 2: The Unix environment, Using vi, C programming SITE, uOttawa
Practical tools • Editor • Vi (emac) • Compiler • gcc • Makefile • make • Debugging • gdb
Using C/Unix/Linux at SITE $ ssh linux
Vi Editor • A screen-based editor used by Unix users • An experience with vi • Starting the editor • Cutting and Pasting/Deleting text • Inserting New Text • Moving the Cursor Within the File • Moving the Cursor Around the Screen • Replacing Text • Searching for Text or Characters • Saving and Quitting • http://www.eng.hawaii.edu/Tutor/vi.html#intro • http://www.brezeale.com/technical_notes/vim_notes.shtml
Vi Basic Commands • mkdir <dirname> - create a directory • cp <filename> <target> - copy a file • rm <filename> - delete a file • vi <filename> - open a file • pressing the <Esc> key turns off the Insert mode • :q – quit with saving • :x – quit without saving • :i – insert text before cursor, until <Esc> hit • :a – append text before cursor, until <Esc> hit • $ - move cursor to the end of the current line • :w – move cursor to the beginning of next word • 0 – move cursor to the start of current line • :o – open and put text in a new line after the cursor • y1 – copy current character • Yn – copy n characters • yy – copy current line • p - paste characters • x – delete single character under cursor • dd – delete the current line • u – undo the last action • :w – save a file • /<string> - search the string forward • ?<string> - search the string backward
Avi Exercise • Create and edit test.c file #include <stdio.h> main() { printf(“Hello world, …\n”); }
C programming/Unix #include <stdio.h> main() { printf(“hello, wolrd…\n”); } $ mkdir csi3130 $cd csi3130 $ vi test.c $cc test.c $a.out
Compiler • GNU Compiler Collection • A compiler system produced by the GNU Project supporting various programming languages • includes front ends for C (gcc), C++ (g++), Java (gcj), and Fortran (gFortran) • http://pages.cs.wisc.edu/~beechung/ref/gcc-intro.html
GCC • Compile C code to an executable • gcc -o <executable-name> <.c files> • Reporting all warning messages • gcc -Wall -o <executable-name> <.c files>
GCC (Cont’d) • An example of compiling two .c files into an executable program • gcc -Wall -o assign1prob1 main.c list.c • An example of compiling two files and then link them separately • gcc -Wall -o main.o -c main.c • gcc -Wall -o list.o -c list.c • gcc -Wall -o assign1prob1 main.o list.o
Make command • make automates the process of compiling a program • Makefile • $ make • $ make clean
Debugging • gdb is GNU Debugger • A debugger for several languages • Inspecting what the program is doing at a certain point during execution • Errors like segmentation faults may be easier to find with the help of gdb • http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_toc.html
GDB • enable built-in debugging support • gcc [other flags] -g <source files> -o <output file> • generating an expanded symbol table for use with gdb • Example:gcc -Wall -Werror -ansi -pedantic-errors -g prog1.c -o prog1.x
GDB (Cont’d) • enter gdb • gdb • enter gdb • quit • printing line from a source file • list • running a program • run • breakpoint at a line number • break <c file name>:<line number> • break <line number> • break at a particular function • break <c file name>:<functionname> • set a breakpoint with condition • break <function or file name> if <condition> • deleting breakpoints • delete • proceed onto the next breakpoint • continue • Single step • step
debugging exercise • Reverse a string #include <string.h> #include <stdio.h> char * reverse(char s[]) { int c, i, j; For(i =0, j=strlen(s)-1; i< j; i++, j--) { c = s[i]; S[i] =s[j]; S[j]=c; } } Main() { printf(“%s \n”,reverse(“database”)); }
GDB debugging exercise Program failed, why??? Load the program into GDB
GDB debugging exercise Here failed? What is the value of i
GDB debugging exercise Track your program step by step, inspect the variables.. Try the basic GDB commands here!
Correct code #include <string.h> #include <stdio.h> char * reverse(char s[]) { int c, i, j; for(i =0, j=strlen(s)-1; i< j; i++, j--) { c = s[i]; s[i] =s[j]; s[j]=c; } return s; } int main() { char myStr[9]="database"; printf("%s \n",reverse(myStr)); return 0; }
Types, Operators and Expressions • Data type char, int, float, double, short int, long int • Constants #define PI 3.1415926 • Typedef: assigning alternative names to existing typedef int myInteger; • Relational and logical operators > >= < <= == != • Increment and decrement operators b = a++; b = ++a; b = a--; b = --a;
Control Flow • The semicolon is a statement terminator • If-Else, Else-If if (expression) if (expression) statement1 statement1 else else if (expression) statement2 statement2 else statement3 • For loop you need to define the counter variable before the loop for(expr1; expr2; expr3) statement • While-Do expr1; While(expr2) statement expr3; • Do-While do statement While(expression);
Control Flow (Cont’d) • Switch switch (expression){ case const-expr : statements case const-expr : statements default: statements } • Conditional expressions (expr1 ? expr2 : expr3) if(a>b) z=a; z = (a > b) ? a : b ; else z=b;
Function declaration • Return value • Default return value of a function in C is int • Java • The use of function may appear earlier than its definition • C program • Should be declared somewhere earlier than their invocations int power(int b, int e) { int r = 1; while (e-- > 0) r *= b; return r; } main() { ... /* call power() here */ } int power(int b, int e); … /* call power() here */ … int power(int b, int e) { int r = 1; while (e-- > 0) r *= b; return r; }
Input and Output • printf(“the int value is %d”, var); • printf(“the string value is %s”, var); • printf(“the charactr and double values are %c and %e”, var); • printf(“the double value is %e”, var); • scanf(“enter an int: %d”, var); • scanf(“enter a string: %s”, var); • scanf(“enter a character and a double: %c %e”, var); • scanf(“enter a string: %s”, var); • Do not forget including <stdio.h>
Variable scope int globalVar = 34; myFun() { int x =1; } Global; outside of the function Local
Some details about C • No boolean type in C • No explicit boolean type #define TRUE 1 #define FALSE if (a){ … } • No function overloading in C • Two functions cannot have the same name • Variables must be declared at the top of a basic block (for some c systems) • The following may not pass the compiler { int a; printf("Hello world\n");char b; } • Lack of exceptions • Illegal activity may not be told (e.g. access memory that hasn’t been allocated in some way) • No automated garbage collection in C • you must free the memory
Standard library • <stdlib.h> • dynamic memory allocation • <stdio.h> • Input/output • <string.h> • String handling • <math.h> • Mathematical functions • <ctype.h> • Characters • http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html
Some common errors • if (a=1){ some stuff } == Boolean evaluation = Variable assignment operator • void myfunc(int a) { /* ... */ } void myfunc(float b) { /* ... */ } error: myfunc already defined
Exercise • Write a program that • Accepts an input “x” (A value to progress up to) • Starting at 0 and 1, outputs the Fibonacci sequence up to “x” permutations. • There should be two functions, for clarity. • (main) Accepts the input and calls the fibonacci function. • (fibonacci) One that accepts the value of x and outputs the sequence.
Fibonacci in Java import java.io class Fibonacci { public static void main(String args[]) { System.out.println("How many numbers of the sequence would you like?"); InputStreamReader sr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(sr); try { String input = br.readLine(); int n = Integer.valueOf(input).intValue(); fibonacci(n); } catch (NumberFormatException e){System.out.println("That is not an integer. Please enter an integer value"); } catch (IOException e) { System.out.println("I did not recieve an input"); } } public static void fibonacci(int n){ int a=0,b=1; for (int i=0;i<n;i++){ System.out.println(a); a=a+b; b=a-b; } } }
Fibonacci in C #include <stdio.h> int main () { int n; printf("\nHow many numbers of the sequence would you like?\n"); scanf("%d",&n); fibonacci(n); return 0; } int fibonacci(int n) { int a = 0; int b = 1; int sum; int i; for (i=0;i<n;i++) { printf("%d\n",a); sum = a + b; a = b; b = sum; } return 0; }