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
Scarica

Esercitazione: OpenGL & Visual Studio