Newsgroup: it.comp.lang.c
Titolo: Problema con le variabili

Ho appena iniziato a imparare il linguaggio C (uso la guida uhmm
quella consigliata dalla Miracle.. Kqualcosa-Ritchie).. Mi sono
trovato di fronte a un problema...
Esiste un modo di inizializzare una variabile dall'input?
Esempio io faccio uno
scanf ("%s=%d",&var,&value);
Il quale comando accetta un input del tipo
b=5 dove b diventa var e il numero value..
Esiste quindi un modo per assegnare al contenuto di "var" il valore
"value"? Cioe' l'equivalente di fare un int b=5; sin dall'inizio?
In pratica mi servirebbe un modo per "creare" delle variabili il cui
nome dipende dall'input... Esiste?
  Adalberto Simeone -==(U.D.I.C.)==- Avenger Dragon
       E-Mail: 
lafc...@tin.it
 UIN: 1414193

nome dipende dall'input... Esiste?
Non direttamente, ma puoi raggiungere gli stessi effetti, sia pure
con meno comodita`, per altra via.  In pratica hai bisogno di creare
(e accedere) al volo una serie di associazioni nome/valore.  Se
ti bastano nomi di variabile di una sola lettera, e non considerando
distinte minuscole da maiuscole, e` ad esempio molto semplice:
A livello globale:
#include <ctype.h>
#include <stdio.h>
int valori[26];
void cambia_valore(char nome, int valore)
{
    int indice;
    nome = toupper(nome);
    indice = nome - 'A';
    if(indice<0 || indice>25) {
        /* dare un messaggio d'errore */
        return;
    }
    valori[indice] = valore;
}
e cosi` via (una logica analoga deve naturalmente applicarsi
al *reperire* il valore -- usando nelle espressioni C dove serve
una opportuna chiamata a una funzione int val(char nome) che
ti lascio da scrivere come esercizio su questa falsariga:-).
Senza il limite dell'1 carattere, quello che ti serve e` una
struttura dati detta symbol table, o array associativo.  Si
puo` fare, ma sono cose abbastanza avanzate e non le
consiglierei ad un principiante!
Se hai regolarmente l'esigenza di fare cose da interprete,
come accettare dall'utente, ed eseguire, assegnazioni e
magari altre espressioni, forse ti conviene usare invece del
C un linguaggio interpretato, che ti permette di fartele quasi
gratis -- l'alternativa e` incorporare nel tuo stesso codice un
interprete (scrivertelo tu, o trovarlo gia` fatto e pronto), e non
e` la piu` banale delle cose da programmare.
Alex

e` la piu` banale delle cose da programmare.
Beh per adesso mi imparo il C , quindi il C++ poi Java o Visual Basic
a seconda di che e' meglio :-) Ho molto tempo utile (ho ancora 16 anni
, quindi fra una 10 d'anni potro' riscrivere Unreal in C ;-)) ).
Una domanda.. io adesso uso un compilatore cosi' a "Occhio" , so che
ne esistono di commerciali.. Mi pare esistesse un Visaul C o qualcosa
del genere.. Quale mi consigli? (Se esistono in versione licenza
studente o cose del genere)


studente o cose del genere)
Esiste il Visual C++ della Microsoft (che compila anche il C), che
e` in effetti disponibile come licenza studente ma solo, mi pare, in
un pacco che comprende anche Java e Basic per cui se a te
interessa solo il C puo` non servire molto; esiste il C++Builder
della Borland che costa assai meno, non so se fanno ulteriori
sconti studenti.
Esistono poi i sistemi della Free Software Foundation, del tutto
gratuiti, denominati gcc e disponibili in diversi pacchetti, sempre
gratis, per DOS e per Windows-32; djgpp, gnuwin32, mingw32,
sono i nomi di alcuni di questi pacchetti.  gcc puoi usarlo anche
su Linux, un sistema tipo Unix, pure completamente gratuito, che
gira su qualsiasi PC e molti altri tipi di macchine -- un sistema
veramente splendido che ti raccomando calorosamente.  Tutti
questi puoi scaricarli dalla rete, ma sono ovviamente pacchetti
molto grossi, o trovarli sui CDROM delle varie riviste in edicola
(ad esempio in edicola adesso c'e` un CDROM monografico
per Linux, che comprende tutto il sistema, i compilatori, e tanta
documentazione e utility delle piu` varie).
Tutti questi sono compilatori che coprono sia il C sia il C++.
Se vuoi solo C hai una scelta ancora un poco piu` ampia, ad
esempio c'e` un compilatore chiamato lcc che mi pare giri
su Linux e Windows-32, ma non so che vantaggi abbia
rispetto a gcc (forse e` un poco piu` efficiente).
Per imparare il linguaggio, io suggerirei il gcc (ricordandoti
di compilare sempre con -pedantic -ansi -Wall -Werror, se 
no di accetta tanti costrutti imprecisi e non standard...:-).
Su Windows se devi, su Linux se puoi (dedicandogli ad es
una partizione di 400mega circa del tuo disco, dovresti
starci largo, soprattutto se non vuoi fare molta grafica).
Alex

 "value"? Cioe' l'equivalente di fare un int b=5; sin dall'inizio?
Correggetemi se sbaglio... Ma si potrebbe fare una lista di puntatori che ha
per elementi un nome di variabile e il suo valore.
-- 
Saluti.
*NATHAN*

starci largo, soprattutto se non vuoi fare molta grafica).
Ok vedro' di farci qualcosa..
Cmq. ho un altro grande problema :-))) Io provengo dal Basic (del C64
Eheh ;-) a 4 anni e mezzo incominciai)..e devo ancora adattarmi....
cmq. dicevo.. penso sia meglio esprimersi in termini di linguaggio
allora se io facevo questo:
input a$
if a$="qualcosa" then goto qui
else .....
Ed era la cosa piu' facile del mondo..
:-)
Invece nel C per fare la stessa cosa devo fare centinaia di righe in
piu' (e non funziona nemmeno!!!!!)..
allora..
==============
#include <stdio.h>
main ()
{
char buffer[100],type[5];
gets(buffer);	
sscanf(buffer,"%s",type);
/* la parte qui sopra inizializza le variabili , fa il gets , e lo
"proba" con sscanf , linea buffer , assegna %s a type (massimo 6
caratteri).
ora.. perche'.. (sto impazzendo guarda :-)) ) se io faccio: */
if (type="boh")
printf ("FUNZIONA!!");
else printf("Tanto non funziona! ;-)) ");
}
==============
mi dice "Assign to non L Value"?? (riguardo la riga con l'if)
Perche'????
A quanto ho capito l'L Value dovrebbe essere il valore che sta a
sinistra... ... e quindi??
Ora sono le 17 .. E' dalle 13 che sto provando :-)
Ho provato ad aggiungere un
char str[]="boh";
e fare if (type=str) ...
Ho provato a fare con if (type=="boh")....
e l'errore non me lo da , cmq se io scrivo boh non funziona (nel senso
che dice che non funziona come specificato nel prg).
Ho provato a fare l'if con o senza i doppi uguali , provando ad
aggiungere nelle " gli \0 , \n ,etc. etc.
Ho provato a mettere prima di type l'& (errore) , l'* (funziona sempre
qualsiasi cosa ci scrivi)..
Ma niente!!!! 
In pratica mi servirebbe perche' sto sviluppando una cosa semplice
semplice che leggendo da un file a occhio cose tipo
Dex=20
assegni alla var dex (specificata in un apposito file) il valore di
20..
Ora come ora sto "campando" con gli if (type='d') (senza vettori
naturalmente)... ma le combinazioni sono solo 26 (perche' i numeri
servono per altra cosa).. se riuscissi a implementare le parole si
amplierebbero moltissimo.
Ora io mi chiedo.. ok saro' stupido forse.. avro' saltato qualche riga
con scritto in grassetto "ATTENZIONE !!!! Per fare l'IF
(variabile="Parola") devi.... , ma perche' mi riesce piu' facile
aprire un file , leggerci l'input (a una sola lettera + numero) ,
incrementare le variabili relative) , aprire un altro file , se non
esiste crearlo , scriverci sopra e chiuderlo di un semplice
INPUT A$:IF A$="boh" then...
Non dirmi che col C la riga di cui sopra non si puo' fare altrimenti
mi suicido.. :-)
Nel caso fosse colpa del compilatore (come sto imparando a
sospettare).. in che giornale hai detto che si puo' trovare lo GNU? Ho
provato a chiedere "Io Programmo".. ma nessuno ne ha mai sentito
parlare.. Dimmi anche il nome del CD Rom del Linux.. ne ho sempre
sentito parlare , e potrebbe essere la volta buona (ho un HDD da 8.5
GB e quindi una piccola partizione andrebbe bene..) per fare il "salto
di qualita'"...
A proposito nel mio stdio.h manca la funziona getline.. che fine ha
fatto?
Cmq. a parte tutto (spero di risolvere quel fatto , perche' una volta
che si sa come funziona bene l'Input si puo' fare quasi tutto.. io non
lo so e posso solo girarci intorno).. Mi chiedo come mai nel C bisogna
specificare di volta in volta le variabili? Mi riferisco agli int e ai
char.. Nel basic c'era il famoso "Let" .. ma non lo usava praticamente
nessuno , perche' appunto le creava On-the-fly.. Sempre per il solito
fatto che il C non e' un linguaggio interpretato? 
Mi immagino chissa' quali tribolazioni dovro' fare per un semplice
INPUT A$:IF A$="boh" then... :-) Ho provato tutte le soluzioni che la
mia mente reputasse logiche (forse troppo influenzata dalla BasiChiana
memoria)... ANCHE strcomp che purtroppo non vede se le stringhe sono
tutte uguali ma solo se sono di uguali caratteri .. ho provato anche
con switch & case ma non accetta le ""..


per elementi un nome di variabile e il suo valore.
Si`, per esempio, a patto naturalmente di frugare ogni volta
quella lista quando si ricerca un valore -- oppure (se i valori
sono stringhe) si puo` usare getenv/putenv (con un underline
davanti su certi compilatori), che fanno un lavoro analogo,
ecc -- ma in ogni caso bisogna usare un metodo di tipo
"interpretativo" (interprete molto semplice, se non interessa
usare espressioni a destra di quel segno di eguale nell'input,
naturalmente -- ma pur sempre interpretativo e`).
Alex

tutte uguali ma solo se sono di uguali caratteri .. ho provato anche
C'e` una o di troppo, comunque strcmp considera due stringhe
eguali appunto se sono eguali tutti i loro caratteri (sino allo zero
di terminazione compreso), perche` tu che altri criteri vorresti
applicare, un carattere si` e uno no...?-)
Alex

nelle istruzioni di assegnazione, ma non c'entra col Dim).
Intendevo nel Basic Commodoriano ;-)


malapena cos'e' un computer.. (logicamente la gente del posto..)
E allora prova dai vari siti in rete che vendono CDROM di shareware
e simili (sorry, non so cosa consigliarti specificamente, ma non
dovrebbe essere difficile trovarne su web).
Alex