Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini Il linguaggio C • • • • Strutture di alto livello Controllo a basso livello Programmi efficienti Può essere compilato su un'ampia gamma di computer e SO Il linguaggio C - Intro • Programma minimo – main() { } • Ogni programma C deve contenere una e una sola funzione main(). Struttura di un programma C • Comandi per il preprocessore – #define, #include, #if, #endif, etc. • Definizione di tipi – typedef, struct, etc... • Prototipi di funzioni (dichiarazione) – int myFunc(int a, char b, float c); • Variabili (globali) • Funzioni (implementazione) – int myFunc(int a, char b, float c) { // implementazione } • Main Esempio (parte 1) #define MY_CONST 50 // Pre-processor #include <stdio.h> // Pre-processor typedef int vecInt[3]; // type definition // function declarations void printVec(vecInt vec); int nPrint(vecInt vec, int times); Esempio (parte 2) // function implementation void printVec(vecInt vec) { printf(“%d,%d,%d”,vec[0],vec[1],vec[2]); } Esempio (parte 3) int nPrint(vecInt vec, int times) { int i; // local var for(i=0;i<times;i++) { printVec(vec); printf(“\n”); } return i+1; } Esempio (parte 4) int main(int argc, char *argv[]) { vecInt myVect; int res; myVec[0] = 1; myVec[1] = 8; res = nPrint (myVec, 4); return 0; } myVec[2] = 4; Struct typedef struct MiaStruttura { char c; int num1; float num2; } MiaStrutt; • Viene allocata una stringa, un intero, un float – MiaStrutt s //s variabile di tipo MiaStrutt • Accesso ai campi – s.c = ‘D’; s.num1 = 26; s.num2 = 77.7 Union typedef union MiaUnion { char c; int num1; float num2; } MiaUn; • Viene allocata un float (il più “grande” dei tre) – MiaUn u //u variabile di tipo union • Accesso ai campi come in struct • In vari momenti posso utilizzare una delle tre “possibilità” (devo applicare il casting) Casting • “Forzatura” del tipo di una variabile int numint; float numfl=6.34; char let='A'; numint=(int)numflt; //assegna il valore 6 (parte intera) numint=(int)let;//assegna il valore 65 (codice ASCII) Puntatori - 1 • Un puntatore è una variabile che contiene l'indirizzo di memoria di un'altra variabile puntata int int int p = z = z; *p; val=7; //mettiamo che l’indirizzo di memoria sia 6F0 &val; //p ha valore 6F0 *p; //z ha valore 7 • Utilizzati per – Gestione dinamica della memoria – Passaggio di parametri per indirizzo Puntatori - 2 Indirizzo memoria Valore int z; int *p; int val=7; val 6F0 7 p 6F1 6F0 z 6F2 7 p = &val; z = *p; Puntatori - 3 • Gestione dinamica della memoria float *misure; void allocaMisure(int numero) { misure = (float*)malloc(numero * sizeof(float)); } … allocaMisure(15); misure[10] = 3.14; Puntatori - 4 • Passaggio di parametri per indirizzo void cambia(int numero) { numero = 15; } void cambiaPtr(int *numero) { *numero = 5; } int i=10; cambia(i); // i vale sempre 10; ho passato il VALORE della var cambiaPtr(&i); // i vale 5; ho passato l’INDIRIZZO di mem Dichiarazioni e Header Files • Separare implementazione e dichiarazioni in diversi files #include <functions.h> Header File // implementation // functions.h void printVec(vecInt vec); int nPrint(vecInt vec, int times); Link #include <functions.h> // call Compilazione e Link • Compilazione – File .c compilati in file oggetto (.obj) – In generale un file .obj per ogni file .c • Link – “Unisce” i file .obj più eventuale codice delle librerie Bibliografia • A. Kelley, I. Pohl, C Didattica e Programmazione, Addison-Wesley Italia, 1996. • R. Sedgewick, Algoritmi in C, Addison-Wesley Italia, 1993. • http://alpha.science.unitn.it/~fiorella/guidac/indexc.html