Esiste però anche un ambiente globale:! quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali!

Documenti analoghi
Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

per costruire specifici componenti software

PROCEDURE. Una procedura permette di. void p(int x) { x = x * 2; printf( %d, x); }

STRUTTURA DI UN PROGRAMMA

Programmi con argomenti passati da linea di comando

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Classi di memorizzazione

Lezione 6. Visibilità degli identificatori e tempo di vita degli oggetti

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Università degli Studi di Cassino Corso di Fondamenti di Informatica Visibilità e tempo di vita delle variabili

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Il C nel C++: Funzioni

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Linguaggio C: PUNTATORI

Funzioni, Stack e Visibilità delle Variabili in C

Lezione 8. Visibilità degli identifcatori e tempo di vita degli oggetti

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Programmazione (imperativa)

Modelli di interazione tra processi

ARRAY E TYPEDEF. A volte è utile definire un nuovo tipo di dato come array. Si usa la solita sintassi del linguaggio C

Introduzione al C. Tipi derivati

Verso i puntatori: Cosa è una variabile?

parametri attuali ricopiati parametri formali

Visibilità e tempo di vita delle variabili. (più sintesi di alcuni concetti della prima parte del corso)

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

IL PRIMO PROGRAMMA IN C

Scope, Memoria e Tabella dei Simboli

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Allocazione dinamica della memoria

Struttura di un Programma C

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Unità F1. Obiettivi. Il linguaggio C. Il linguaggio C++ Linguaggio C. Pseudolinguaggio. Primi programmi

Definizione di classi. Walter Didimo

Corso sul linguaggio Java

Associazione Variabile-Indirizzo

La gestione della memoria dinamica Heap

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Puntatori. Fondamenti di Programmazione

AMBIENTI DI PROGRAMMAZIONE

Programmazione ad oggetti

C: panoramica. Violetta Lonati

Concetto di Funzione e Procedura METODI in Java

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Primi passi col linguaggio C

Il linguaggio C Strutture

Tempo di vita e scope delle variabili

Debug di un programma

Il linguaggio C. Notate che...

Linguaggio C - sezione dichiarativa: costanti e variabili

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Laboratorio di programmazione

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Modulo 2: Strutture fondamentali della programmazione Java

Strategie di programmazione

4 GLI ARRAY E LE STRINGHE

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

1 PANORAMICA SUL LINGUAGGIO C

I puntatori (richiamo)

Il linguaggio C funzioni e puntatori

Visibilità e tempo di vita delle variabili

Il linguaggio C. Puntatori e Array

Lezione 6 programmazione in Java

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Il linguaggio C Il linguaggio C. Caratteristiche del C. Caratteristiche del C. Linguaggi di Programmazione I. Ferdinando Cicalese

Esercizi su. Istruzioni di scelta multipla. Overflow

Applicando lo stesso meccanismo al tipo puntatore, possiamo dichiarare un array di puntatori:

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Strutture Dati. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Strutture Dati 1 / 16

I Linguaggi di Programmazione

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

La Gestione della Memoria. Carla Binucci e Walter Didimo

Funzioni in C. Architetture multi-componente

Il puntatore. Il puntatore

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

Introduzione ai puntatori in C Definizione

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

La classe java.lang.object

Introduzione al linguaggio C Puntatori

Puntatori in C Lucidi della Pof.ssa Pazienza

Le classi. Per questo introduciamo le classi. Una classe è un nuovo tipo di dato che integra insieme i dati e le funzioni che possono agire sui dati.

I CARATTERI E LE STRINGHE

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Linguaggio C: le funzioni. Introduzione e sintassi

Procedura. Procedure e funzioni. Esempio di procedura in C. Procedure in C. Esempio con prototipo. Esecuzione del codice

Introduzione. Le funzioni in C. Funzioni. Cosa succede

Strutture. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Struttura dei programmi C

Tipi di dato semplici

Laboratorio di Programmazione Anno Accademico

Calcolatori Elettronici Parte VIII: linguaggi assemblativi

Laboratorio di linguaggi

Passare argomenti al programma

Java Native Interface Appunti

Transcript:

In C, ogni funzione ha il suo ambiente locale che comprende i parametri e le variabili definite localmente alla funzione" Esiste però anche un ambiente globale:! quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali! La denominazione "globale" deriva dal fatto che l'environment di definizione di queste variabili non coincide con quello di nessuna funzione (neppure con quello del main) 1! Una variabile globale è dunque definita fuori da qualunque funzione ( a livello esterno )! tempo di vita = intero programma! scope = il file in cui è dichiarata dal punto in cui è scritta in avanti int trentadue = 32; float fahrtocelsius( float F ){ float temp = 5.0 / 9; return temp * ( F - trentadue ); 2

Anche per le variabili globali, come per le funzioni, si distingue fra dichiarazione e definizione! al solito, la dichiarazione esprime proprietà associate al simbolo, ma non genera un solo byte di codice o di memoria allocata! la definizione invece implica anche allocazione di memoria, e funge contemporaneamente da dichiarazione 3 int trentadue = 32; float fahrtocelsius(float); Definizione (e inizializzazione) della variabile globale int main(void) { float c = fahrtocelsius(86); float fahrtocelsius(float f) { return 5.0/9 * (f-trentadue); Uso della variabile globale 4

Come distinguere la dichiarazione di una variabile globale dalla sua definizione?!!nelle funzioni è facile perché la dichiarazione ha un ";" al posto del corpo {.!!ma qui non c è l analogo.. si usa l'apposita parola chiave extern! int trentadue = 10; è una definizione (con inizializzazione)! extern int trentadue; è una dichiarazione (la variabile sarà definita in un altro file sorgente appartenente al progetto) 5 extern int trentadue; Dichiarazione variabile globale float fahrtocelsius(float f) { return 5.0/9 * (f-trentadue); Uso della var globale int main(void) { float c = fahrtocelsius(86); int trentadue = 32; Definizione della variabile globale 6

! Il cliente deve incorporare la dichiarazione della variabile globale che intende usare: extern int trentadue;! Uno dei file sorgente nel progetto dovrà poi contenere la definizione (ed eventual -mente l inizializzazione) della variabile globale int trentadue = 10; 7 File main.c float fahrtocelsius(float f); int main(void) { float c = fahrtocelsiu s(86); File f2c.c extern int trentadue; float fahrtocelsius(float f) { return 5.0/9 * (f-trentadue); File 32.c int trentadue = 32; 8

A che cosa servono le variabili globali?! per scambiare informazioni fra cliente e servitore in modo alternativo al passaggio dei parametri!! per costruire specifici componenti software dotati di stato! 9 Nel primo caso, le variabili globali:! sono un mezzo bidirezionale: la funzione può sfruttarle per memorizzare una informazione destinata a sopravviverle (effetto collaterale o side effect)!! ma introducono un accoppiamento fra cliente e servitore che limita la riusabilità!!rendendo la funzione stessa dipendente dall'ambiente esterno"!!la funzione opera correttamente solo se l'ambiente globale definisce tali variabili con quel preciso nome, tipo e significato! 10

Si vuole costruire un componente software numeridispari che fornisca una funzione!!!int prossimodispari(void)! che restituisca via via il "successivo" dispari! Per fare questo, tale componente deve tenere memoria al suo interno dell'ultimo valore fornito!! Dunque, non è una funzione in senso mate -matico, perché, interrogata più volte, dà ogni volta una risposta diversa! 11! un file dispari.c che definisca la funzione " e una variabile globale che ricordi lo stato!! un file dispari.h che dichiari la funzione! dispari.c int ultimovalore = 0; int prossimodispari(void){ return 1 + 2 * ultimovalore++; (sfrutta il fatto che i dispari hanno la forma 2k+1) dispari.h int prossimodispari(void); 12

Il fatto che le variabili globali in C siano" potenzialmente visibili in tutti i file dell#appli-" cazione pone dei problemi di protezione:!! Che cosa succede se un componente dell'applicazione altera una variabile globale?!! Nel nostro esempio: cosa succede se qualcuno altera ultimovalore?" 13 Potrebbe essere utile avere variabili!! globali nel senso di permanenti come tempo di vita (per poter costruire componenti dotati di stato)...!! ma anche protette, nel senso che non tutti possano accedervi! VARIABILI STATICHE 14

In C, una variabile può essere dichiarata! static:!! è permanente come tempo di vita!! ma è protetta, in quanto è visibile solo entro il suo scope di definizione! Nel caso di una variabile globale static, ogni" tentativo di accedervi da altri file, tramite" dichiarazioni extern, sarà impedito dal" compilatore" 15 Realizzazione alternativa del componente: dispari.c static int ultimovalore = 0; int prossimodispari(void){ return 1 + 2 * ultimovalore++; (dispari.h non cambia) 16

In che senso la variabile static è "protetta"?!! La variabile ultimovalore è ora inaccessibile dall'esterno di questo file: l#unico modo di accedervi è tramite prossimodispari()! Se anche qualcuno, fuori, tentasse di accedere tramite una dichiarazione extern, il linker non troverebbe la variabile!! Se anche un altro file definisse un#altra variabile globale di nome ultimovalore, non ci sarebbe comunque collisione fra le due, perché quella static non è visibile esternamente! 17 Una variabile statica può essere definita! anche dentro a una funzione. Così:!! è comunque protetta, in quanto visibile solo dentro alla funzione (come ogni variabile locale)!! ma è anche permanente, in quanto il suo tempo di vita diventa quello dell#intero programma! Consente di costruire componenti (funzioni)! dotati di stato, ma indipendenti dall'esterno! 18

Realizzazione alternativa del componente: dispari.c int prossimodispari(void){ static int ultimovalore = 0; return 1 + 2 * ultimovalore++; (dispari.h non cambia) 19 Quindi, la parola chiave static!! ha sempre e comunque due effetti!! rende l#oggetto permanente!! rende l#oggetto protetto" (invisibile fuori dal suo scope di definizione)!! ma se ne vede sempre uno solo per volta!! una variabile definita in una funzione, che è comunque protetta, viene resa permanente!! una variabile globale, già di per sé permanente, viene resa protetta! 20