Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429

    [C/C++] "Volatile" e var. static gloabli

    Vorrei sapere come utilizzare il qualificatore volatile, perchè ho solo capito che dice al compilatore che la variabile può essere modificata anche senza che vi sia un assegnamento, o cmq modi direttamente specificati dal programma...potreste scrivere un piccolo algoritmo o una spiegazione che illustri il funzionamento di tale qualificatore???

    Poi vorrei anche sapere i modi in cui conviene usare una variabile stati gloable e un esempio che illustri il suo funzionameto e come utilizzarla

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Scusate, vorrei anche sapere delle dritte sul tipo wchar_t dei caratteri estesi, ho provato a scrivere la lettera L e visualizzarla, e mi esce il numero 76, un aiuto please

  3. #3
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Il qualificatore volatile serve a dire al compilatore che la variabile può essere modificata in modo non determinisctico, quindi non prevedibile in base al programma, da qlcosa di esterno, come per esempio un altro processo, il sistema operativo, o un dispositivo hardware. Se ad esempio scrivi un ciclo in cui testi continuamente il valore di una variabile, il compilatore può effettuare delle ottimizzazioni sul codice, inserendo la variabile in un registro in memoaira, in modo da renderene più veloce l'accesso. Se pero il valore della variabile, che si trova in un determinato indirizzo di memoria, viene copiato in un registro, e ogni volta che si accede alla variabile nekl programma si legge nel registro anczicchè nella locazione originaria della variabile, non si potranno vedere l emodifiche che occorrono, perche ad esempio un dispositivo o un latro processo, accede all'indirizzo della variabile in memoria cambiandola, ma il programma continua a leggere il valore originario, che per ottimizzare il tutto era stato messo in un registro. Ovviamente il compilatore non ottimizza a caso, ma solo quando esaminando le istruzioni si desume che le istruzioni stesse non modificano la variabile; per ccui il suo valore puo essere prelevato la prima volta e conservato in un registro. Il tutto funziona appunto se la variabile non è mdificata anche da agenti esterni al programma, se ciò e il caso allora bisogna dichiararla volatile per impedire che il compilatore effettui delle ottimizzazioni.

    Quanto alle variabili statiche, esse se sono variabili locali ad una funzione, dichiarandole statiche è come se divenissero globali, ma visibili solo all'interno della funzione in cui sono dichairate. Una variabile statica locale ad una particolare funzione è inizializzata una sola volta, la prima volta che tale funzione viene chiamata e il suo valore resta inalterato quando si esce dalla funzione, per cui quando si richiama nuovamente la funzione tale variabile ha ancora il valore assegnatogli precedentemente. SE dichiari static una variabile globale, si ottiene invece che la variabile sarà globale solo nel file di definizione, ma non sarà visibile in altri files.


  4. #4
    Vorrei sapere come utilizzare il qualificatore volatile, perchè ho solo capito che dice al compilatore che la variabile può essere modificata anche senza che vi sia un assegnamento, o cmq modi direttamente specificati dal programma...potreste scrivere un piccolo algoritmo o una spiegazione che illustri il funzionamento di tale qualificatore???
    Ti sarebbe bastato andare su goooooogle e fare una ricerca per trovare documenti (magari abbinando a "volatile" una parola chiave del C, main o int).
    Comunque ecco qua (questo è quanto reperito tra i meandri del mio cervello e del mio hardisk):


    Innanzitutto il modificatore volatile testimonia che una certa variabile cambia valore in modo aleatorio perché è fuori dal controllo del solo programma principale.
    Per alcuni problemi, infatti, sorge la necessità di dichiarare una variabile che possa essere aggiornata da una porzione di codice (interna o esterna) in momenti che durante la fase di sviluppo non è possibile determinare.
    Ciò può derivare da vari fattori:
    1. La variabile è aggiornata da codice esterno al programma principale
    - Ciò accade molto spesso perché la variabile dipende da un qualche
    - interrupt o da qualche thread che dirige operazioni sull'I/O e serve
    - ad interfacciare il prog direttamente all'hardware.
    - Un esempio molto usato è quello di un thread che gestisce momento
    - per momento quello che si fa col mouse: ovviamente deve operare
    - costantemente e in modo indipendente dal flusso del programma
    - e assegnare alle variabili volatile i nuovi valori appena
    - determinati da eventi hardware.
    2. La variabile è aggiornata da una parte di codice richiamata da un timer
    - Un po' come avviene per gli interrupt, appena questo viene attivato
    - la variabile è modificata. Allo stesso modo un timer può attivare
    - una porzione di codice che aggiorna la solita var.
    3. La variabile è aggiornata da più thread contemporaneamente.

    Tutti i compilatori C/C++, ottimizzando il codice, cercano di produrre un codice macchina tale da tenere i valori delle variabili quanto più possibile all'interno dei registri macchina. Questo infatti è uno dei canoni per rendere il codice veloce, tanto che le variabili che vengono usate nei cicli for sono, se possibile, automaticamente collocate nei registri. (Ma lo può fare anche il programmatore qualificandole con la parola chiave "register".)

    Ma questa "abitudine", soprattutto se è vero il fattore (3), può dare origine a bug che si presentano durante l'esecuzione del programma e che sembrano "anomali", inspiegabili e perciò sono di difficile individuazione.
    Può accadere, infatti, che si creino dei disallineamenti tra il valore nel registro della CPU e il valore in memoria. L'utilizzo di oggetti volatile, in definiiva, è finalizzato ad evitare che il valore di un certo dato possa essere letto dalla memoria proprio mentre, portato tra i registri, è soggetto continuamente ad aggiornamenti. Se è trattenuto in memoria, invece, non sorgono questi problemi e ogni accesso alla locazione di memoria corrispondente fornisce l'ultimo valore aggiornato.

    Potremmo dire che "volatile" è l'esatto contrario di "register".
    Per un dato dichiarato volatile chiediamo al compilatore di non effettuare nessuna ottimizzazione su di esso e di rendere la permanenza di questa variabile nei registri CPU lo stretto necessario per le operazioni da svolgere. Ad ogni richiesta del valore, corrisponderà un effettivo accesso alla locazione di memoria corrispondente.
    Per le register è l'esatto contrario.


    Poi vorrei anche sapere i modi in cui conviene usare una variabile stati gloable e un esempio che illustri il suo funzionameto e come utilizzarla
    "stati gloable" significherebbe "static globale"???

    Mmmmh... non mi pare che dichiarare una variabile static globale abbia senso se non quello di evitarne l'accesso dagli altri file di cui è composto un progetto.
    E' come dichiarare una variabile globale che però tanto globale non è, perché è visibile solo dallo stesso file in cui è dichiarata.



    Scusate, vorrei anche sapere delle dritte sul tipo wchar_t dei caratteri estesi, ho provato a scrivere la lettera L e visualizzarla, e mi esce il numero 76, un aiuto please
    Si tratta di programmazione sotto win32 vero?

    Il problema dovrebbe essere nella L che devi anteporre alla STRINGA per indicare al compilatore che è composta dai cosiddetti wide characters. Ma come ho detto "alla STRINGA". A te invece dà problemi un carattere, ma la L non mi pare sia necessaria per i singoli caratteri.
    Cmq per evitare ogni dubbio scrivi:
    wchar_t c = L'x';



    ps: com'è che ho problemi nella visualizzazione completa di alcune discussioni (ad esempio di questa mi appare solo la 1° domanda di Iena87) ??

  5. #5
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Grandissimo...innanzitutto il nostro nick è ispirato dalla stessa persona seconda cosa grazie mille.
    La spiegazione che hai fatto sul qualificatore volatile (te hai detto modificatore, ma credo che ti sia sbagliato perchè il qualificatore indica al compilatore il modo in cui un variabile deve essere letta e modificata, il modificatore altera invece il tipo di base...vabbè capirai, magari sapessi io tutte ste cose ) già è stata memorizzata nel mio hard disk
    Però vorrei sapere una cosa, per approfondire: gli interrupt da quanto ne sò , sono strumenti hardware e software, che praticamente arrestano la CPU nel momento in cui è inviato un segnale da un altro dispositivo dell'elaboratore, per adibire la CPU ad accettare questo segnale e memorizzarlo in un registro, per poi riprendere il normale flusso delle istruzioni, ma un thread cos'è???? Non farmi cercare su Goooooogle che altrimenti nn ci capisco niente...
    Poi si, volevo dire static globale, nn ho messo la c finale .
    Per quanto riguarda i caratterei estesi, ho scritto come hai detto tu, ma al posto di un carattere mi viene sempre visualizzato un numero

  6. #6
    ...che parole encomiastiche!!!!

    E mi era venuto il dubbio che quel "Iena" avesse qualcosa a che fare col mio nick, ma era troppo implicito.
    Se il tuo nick non mi inganna, poi, siamo pure dello stesso anno: 1987!
    ...e a proposito, auguri per il compleanno 12 giorni fa!! (un po' in ritardo ma cmq!)

    Ma per prima cosa, scusami se ti rispondo solo ora, ma ultimamente non ho molto tempo da dedicare al computer. (e come se non bastasse questa postazione da un po' è diventata proprietà esclusiva di mia sorella...'azzi d'esami!) (e come se non bastasse l'altro computer ormai è andato, e gli elettroni sono ormai migrati...elettronicamente!!)
    Però nessuno mi toglie il piacere di seguire questo forum e di postare!!

    gli interrupt da quanto ne sò , sono strumenti hardware e software, che praticamente arrestano la CPU nel momento in cui è inviato un segnale da un altro dispositivo dell'elaboratore, per adibire la CPU ad accettare questo segnale e memorizzarlo in un registro, per poi riprendere il normale flusso delle istruzioni
    (Guarda che "sò" va senz'accento :tongue: . Vabbé capirai! Però io che faccio il classico...mi viene obbligatorio dirlo..!)
    ("TE hai detto modificatore": ma sei di Napoli o Torino?? )


    Sì, per gli interrupt più o meno è così come hai detto tu.
    Per la programmazione sono le funzioni fondamentali offerte dal BIOS o dal DOS, quelle che stanno alla base dell'interfacciamento con l'hardware.

    Essi "interrompono" il processo poichè le operazioni che eseguono (quelle di input/output sull'hardware) sono estremamente lente rispetto alla velocità del processore. In questo senso, la richiesta da parte di un processo di un'interazione con i dispositivi provoca la sospensione del processo stesso finchè l'operazione non è stata completata.
    Ma gli interrupt "interrompono" anche il processore comunicandogli il verificarsi di un determinato evento. Così lo stesso, dopo che alcuni parametri fondamentali sul processo in corso sono stati salvati, rivolge loro la sua attenzione eseguendoli, per poi ritornare ad eseguire il processo lasciato (elaborando i dati caricati dallo stesso interrupt) o magari per passare a quello successivo.

    Bè, gli interrupt non sono una cosa da poco! D'altronde chiarirti il senso di "volatile" è una cosa, parlare degli interrupt è tutt'altro...!

    Se vuoi qualche approfondimento guarda qua:
    --> http://pmode.impazz.it/tuts/asm2.htm
    --> http://www.enricomilano.it/download/guide/c/10c.htm

    Non farmi cercare su Goooooogle che altrimenti nn ci capisco niente...
    dovresti proprio andare affan[ricercaSu]goooooooooooooogle...!!!!!!
    :gren: :metallica

    ma un thread cos'è????
    Esiste una differenza abissale tra interrupt e thread. Semmai la differenza è più piccola tra thread e processo.

    Così, per capire cosa è un thread, innanzitutto bisogna chiarire cos'è un processo, ma per fare ciò è necessario individuare brevemente la differenza tra programma e processo.
    Un programma non è nient'altro che un file (caratterizzato dal "contenere istruzioni") depositato sul nostro disco rigido, un "oggetto" passivo, statico. Il processo invece è un'entità attiva, caratterizzato dallo stato di esecuzione, dai registri, dai dati, dallo stack, dal contatore di programma, da una serie di risorse fornite dal SO... ma soprattutto è un'entità dinamica.

    Il processo insomma è un programma in esecuzione.
    Tuttavia non è esattamente così, perché un programma applicativo può essere composto da più processi (processo padre e processi figli).

    D'altra parte, diversi possono essere i "processi in esecuzione" dello stesso programma: le varie istanze, che non possono comunicare direttamente attraverso variabili o qualcosa del genere perché sono comunque considerate due blocchi esecutivi separati. (Per far comunicare dei processi distinti bisogna quindi sfruttare appositi meccanismi di sistema (come ad esempio i socket)).

    Ciò significa che ogni processo ha un proprio ambiente di elaborazione ben definito ed è del tutto autonomo e indipendente dagli altri.

    I thread invece sono qualcosa di diverso.
    Un programma può essere costituito da più processi e più thread, ma il programma minimo è costituito da un unico processo e dal thread primario.

    Potremmo vedere i thread come dei processi più piccoli, tanto che sono definiti per l'appunto come "processi leggeri".

    Le differenze tra thread e processi sono queste:

    1. A differenza dei processi, che vengono allocati su spazi di memoria distinti, i threads sono allocati nello stesso spazio di memoria del processo a cui appartengono. Hanno quindi le variabili globali in comune e proprio grazie a ciò possono interagire facilmente tra di loro.
    1.1 Hanno invece ognuna un proprio stack e quindi le variabili locali sono private, proprie di un thread come di una funzione.
    2. I thread costituiscono i processi, così come più processi possono formare un prog.

    Un thread pertanto ha di suo solo il codice, il counter che segna la sua prossima istruzione da eseguire, i registri e lo stack (e in definitiva, in sistemi multithreading, anche un thread può avere il suo stato, in attesa, esecuzione o pronto).
    Esso condivide con i thread ad esso associati il resto, i dati globali e le risorse del sistema operativo.


    Come ho già scritto, un programma può anche essere composto da un solo thread e un unico processo.
    Però accade che spesso c'è la necessità di realizzare programmi in cui non vi sia solo una operazione da eseguire, ma in cui diverse attività devono essere svolte concorrentemente. Questa sorta di multitasking all'interno di un processo è permesso con l'uso di thread. Un thread quindi è una porzione di codice che viene eseguita in concomitanza col programma principale. Come già ho detto, un esempio è quello delle routine di gestione del mouse. In questo caso c'è la necessità di mantenere l'attenzione su quello che si fa col mouse senza però bloccare il prog. Ed ecco il bisogno di creare un thread (vabbè ormai questo è inutile con windows...).

    Quarda anche questo PPT che tratta di processi e thread:
    http://www.informatica.uniroma2.it/u...O-lez03-p3.ppt


    Che ci azzecca quindi un interrupt con un thread ?!?

    Per quanto riguarda i caratterei estesi, ho scritto come hai detto tu, ma al posto di un carattere mi viene sempre visualizzato un numero
    Bé ...non saprei cosa dirti, anch'io sono alle prime armi con la UìnTrentaDueProgrammin


    ps: programmi in C o in C++?
    Su quali testi stai studiando la programmazione Win32?



    __________________________
    "I can see clearly now, [but] the [b]rain is gone..." - (Bobo Marley)

  7. #7
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Semplicemente sto studiando il libro di Shildt sulla programmazione in C/C++...e nessuno sulla programmazione win32...ma te che stai al classico dove le hai imparate tutte ste cose?immagino che sei un autodidatta forsennato...
    nn farmi notare gli errori di grammatica che è il mio debole :master: scherzo...chiunque noti errori di grammatica li deve segnalare
    Adesso grazie mille della risposta, che guarderò con più attenzione domani...adesso la mia testa nn so dove sia


    P.S. Te hai il nome originale di Iena, cioè Snake, io quello pezzotto alias modificato :gren:
    e grazie per gli auguri

  8. #8
    immagino che sei un autodidatta forsennato...
    ... mi diletto di programmazione pure io!


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.