View Full Version : [C] È possibile?
DanieleC88
25-04-2005, 09:53
È possibile dichiarare una variabile in un file C e renderla accessibile in sola lettura ai file che non sono quello in cui è stata dichiarata?
DanieleC88
25-04-2005, 17:40
Proprio no, eh?
Ed_Bunker
25-04-2005, 19:59
La dichiari come 'final' e, poi, negli altri file fai riferimento ad essa dichiarandola come extern.
Credo che dovrebbe "funzionare"...
La dichiari come 'final' e, poi, negli altri file fai riferimento ad essa dichiarandola come extern.
Credo che dovrebbe "funzionare"...
final non esiste coe modificatore in C.
Potresti sempre dichiararla static all'intern o di una funzione e poi usare quella funzione per leggerla. qualcosa di tipo:
int getValore () {
static int valore = 9;
return valore;
}
E' un po stupido come esempio ma sepro si capisca cosa intendo :)
ciao ;)
Con le funzioni per la memoria condivisa non va bene? O devi scrivere in ANSI C?
Guardati le funzioni shmget, shmat, shmctl e shmdt. Il problema e' che se la vuoi accedere da un processo 'non imparentato' con quello in cui dichiari la porzione di mem condivisa, per agganciarla allo spazio di indirizzi di tale processo devi usare la stessa chiave (il parametro key di shmget) usata nel processo che ha creato la variabile condivisa...
Ciao
DanieleC88
26-04-2005, 09:19
Hmm... veramente forse potrei risolvere (parzialmente) col metodo di VICIUS, anche se non mi sembra la soluzione migliore. Spiego: ho un file C che contiene delle variabili usate praticamente da tutte le sue funzioni, e che devono essere modificabili da queste. Cercavo, però, un metodo per renderle in sola lettura per i file che le importano. Magari c'è qualche directive che posso impostare nell'header? Mah. :confused:
RaouL_BennetH
26-04-2005, 11:16
Per comprendere io meglio la tua domanda, intendi qualcosa tipo il Private che si utilizza in C++ ?
Non è che ha molto senso quello che stai facendo.
ho un file C che contiene delle variabili usate praticamente da tutte le sue funzioni, e che devono essere modificabili da queste.
Invece di "proteggere" le variabili utilizzate da queste funzioni, perchè non utilizzi un
pattern come quello dei file in C.
I file in C utilizzano la struttura FILE, per memorizzare delle variabili utilizzate dalle
funzioni che permettono di accedere ad un file.
Poi utilizzano delle funzioni di inizializzazione e distruzione come fopen e fclose per creare
e distruggere lo "spazio" di variabili utilizzato dalle funzioni che utilizzeranno FILE.
Per accedere al file tramite la struttura FILE invece utilizzano la collezione di funzioni
fwrite, fread, feof, fseek, ecc.....
Lo so che non è la soluzione ideale per "proteggere" le variabili globali, ma rende
l'operazione di modifica più complessa.
Saluti.
scusa, ma normalmente come fai ad utilizzare in un file sorgente C una variabile dichiarata in un altro file sorgente? la dichiari in un header come extern?
imho non esiste modo di fare quello che dici; a parte il fatto che se vuoi evitare modifiche alla variabile, semplicemente... non modificarla! :p ma cmq se proprio cerchi il massimo dell'eleganza, l'unica soluzione in C imho è usare un getter come dice VICIOUS, però non è necessario che la variabile sia statica e locale, puoi semplicemente fare così:
int nVar;
.
.
.
int GetValue() {
return nVar;
}
o al limite così:
static int nVar;
.
.
.
int GetValue () { ecc.
DanieleC88
26-04-2005, 13:32
Be', la soluzione in effetti può essere proprio quella di VICIUS e 71104, anche se è poco elegante e un po' scomoda. Infatti dopo diverse lotte sono riuscito a far funzionare di nuovo il mio sistemino operativo (una schifezza, era meglio se lo lasciavo morire :D), e ora mi trovo di fronte una variabile globale (posizione su schermo dell'output per la console) che vorrei venisse letta anche esternamente, ma che non sia esternamente modificabile. In fondo usare un "getter" sarebbe la soluzione più semplice e veloce, ma anche quella che rallenterebbe di più l'esecuzione (chiamare la funzione ogni volta soltanto per leggere un valore...).
Ho capito, insomma: non è possibile, almeno non normalmente. Grazie comunque a tutti!
Bye
(chiamare la funzione ogni volta soltanto per leggere un valore...).
Se la dichiari come inline non hai problema di performance...
DanieleC88
26-04-2005, 22:32
Se la dichiari come inline non hai problema di performance...
Tu dici? Ma sbaglio, o dichiarandola inline questa viene "ricopiata" in ogni parte in cui viene chiamata? Temo che questo possa portare a grandezze del kernel maggiori, quando a me serve solo un piccolo kernel che vada in pochi settori di un floppy (47, per ora).
Al contrario...se, come in questo caso, la funzione è minima ci dovrebbe essere una semplice mov al posto di una call...
DanieleC88
27-04-2005, 12:47
Al contrario...se, come in questo caso, la funzione è minima ci dovrebbe essere una semplice mov al posto di una call...
:doh: :doh: :doh: ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.