Newsgroup: it.comp.lang.c
Titolo: leggere file di conf e settare variabili

ciao a tutti!
chiedo il vostro aiuto per un piccolo problema...
devo leggere un file di configurazione del tipo:
width=20
height=15
colour=black
...
insomma ogni riga è costituita da una coppia name=value
ho scritto un paio di funzioni per leggere e parsare le righe del file,
ma ora mi trovo a dover settare delle variabili globali che hanno gli
stessi nomi degli identificatori nel file:
le variabili globali nel programma sarebbero quindi (nell'esempio)
width, height e colour e andrebbero settate ai valori letti dal file.
per fare questo vorrei scrivere una funzione del tipo
int set_var(const char *name, const *char value);
tuttavia ho un dubbio su come fare...
potrei scrivere una sfilza di 
if((strcmp(name,"width"))==0) width=atoi(value);
else if((strcmp(name,"height"))==0) height=atoi(value)
ma sarebbe orribile. oppure potrei usare un array, un ciclo e uno
switch:
char settings[NUM][40]={"width","height","colour"};
for(i=0; i<NUM; i++) if((strcmp(name,settings[i]))==0) break;
switch(i) {
        case 0: width=atoi(value);
        case 1: height=atoi(value);
        case 2: colour=altra_mia_funz(black);   
...
e così via, ma anche questa sarebbe orribile e lenta.
cosa mi consigliate di fare? esiste un metodo standard di fare questo
genere di cose?
grazie in anticipo,
ciao,
costa

 genere di cose?
Variabili globali? Bleach[1].
Metti il riconoscimento in una funzione a parte e fai in modo che ti ritorni
una chiave per ripescare i valori (l'idea dell'array con tutti i nomi
valiti e far ritornare l'indice va bene).
Cosi' puoi cambiare a piacere il riconoscimento.
Se i valori sono pochi, vale la pena di fare il confronto diretto (strcmp).
Per ottimizzare un po', puoi usare un hash (ma ti conviene solo se hai tanti
valori).
Lo puoi fare in 2 modi (la prima solo se non puoi avere una tabella di hash
come Dio comanda): 
- una semplice funzione di hash, calcolata prima su tutte le key, al momento 
  sulla funzione da cercare, poi confronti solo l'hash (magari puoi fare una 
  ricerca binaria) e quando trovi l'hash giusto, per sicurezza confronti le 
  stringhe (non esiste la funzione perfetta che io sappia, puoi generare 
  duplicati).
  Fai tu il conto della complessita' e vedi se ne vale la pena (se hai tante 
  entry e stringhe molto lunghe conviene rispetto alla ricerca diretta).
- calcoli l'hash per tutte le stringhe, a seconda del valore li memorizzi 
  nella posizione hash_value % MAX_SIZE_HASH_TABLE (se c'e' gia' qualcosa ci 
  sono almeno 3 modi per procedere, io preferisco la lista concatenata)... a 
  questo punto la ricerca ha costo O(1): calcoli l'hash della stringa in 
  input, vai direttamente alla posizione corrispondente e vedi se c'e' 
  qualcosa (se non trovi nulla, il valore era errato, se trovi sai 
  direttametne quale stringa era... ma per sicurezza un confronto diretto 
  non guasta).
L'hash e' una trattazione molto ampia, perche' ne hanno sviluppato molte
varianti, per adattarlo ai casi piu' disparati.
Per una trattazione sintetica, guarda le glib: implementano un hash molto
semplice (come idea) e di applicabilita' molto ampia (un array
autoridimensionante a richiesta, con liste per gestire le entry multiple
sugli slot dell'array).
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 come Dio comanda): 
questo mi è un po' ostico... cercherò un po' su google qualcosa sugli
hash, per adesso grazie!
ciao,
costa

 c'entra qualcosa con gli hash strutture dati di linguaggi tipo perl/PHP?
Ti forniscono gia' la struttura dati opportuna, ma non sono gli unici
linguaggi a farlo.
Per imparare pero' non ti serve a molto, guarda le glib e la relativa
documentazione online :)


 documentazione online :)
okay grazie!
ciao,
costa