Newsgroup: it.comp.lang.c
Titolo: Leggere tasti

Salve
devo fare un men� di scelta, e in un ciclo while associato
a dei comandi switch, devo leggere dei tasti alfanumerici
e dei tasti funzione.
Quale comando pu� andare bene per premere i tasti senza
dare return. Utilizzo il djgpp.
Ciao e grazie.

 
#include <conio.h>
char tasto;
tasto = getch();

Joe ha scritto:

progetto esame universitï¿œ?
....io ne sto facendo uno (anzi l'ho finito) urrï¿œ....
accesso ai file di testo

 
http://www.delorie.com/djgpp/doc/kb/kb_5.html
Buffered stdio functions, such as getc, putc, fread, printf, and all 
their relatives pay attention to termios settings of the terminal device 
and behave accordingly. For example, you can get single-character, no-
echo input with the following snippet: 
 	 struct termios charmode;
 tcgetattr (0, &charmode);
 charmode.c_lflag &= ~(ECHO | ICANON | ISIG);
 tcsetattr (0, &charmode);
Nota che djgpp implementa POSIX, e ti consiglio quindi di usare questa 
API standard, invece che funzioni non portabili.
Ciao

 progetto esame universitï¿œ?
Sai, che conio.h e getch() non sono definiti nel standard-C. Se e'
veramente un progetto dalla universita, la tua risulotione per me non
e' corretto. Idem la domanda mi sembra strana. C non conosce dei
tasti, sa qualchecosa da un stdin.
cc

 e dei tasti funzione.
ncurses in  <curses.h>
hth,
Lokar


ci sono anche per il djgpp?
Ciao

Claudio Carobolante ha scritto:

vabhe' ma una volta compilato l'eseguibile funziona ovunque....
ciao

 vabhe' ma una volta compilato l'eseguibile funziona ovunque....
Scommettiamo di no?
-- 
-riko

 
e invece funziona
ho testato l'eseguibile su 3 macchine differenti su cui non ï¿œ installato 
alcun ambiente di sviluppo
Una volta compilato il codice sorgente sul mio pc di lavoro, tutto viene 
incluso nell'eseguibile .exe sotto forma di codice macchina, e quindi 
alla fine l'eseguibile contiene tutte le istruzioni macchina che 
simuleranno le strutture dati ed algoritmi del C, che in quanto tali non 
appartengono alle strutture dati e algoritmi primitivi della macchina di 
basso livello.
E poi non capisco la correzione
int tasto;
secondo me sprecare un int per contenere un valore a 8 bit, non vale la 
pena.
Ecco perchï¿œ ho scritto char tasto.
un saluto

Claudio Carobolante ha scritto:

senti in 5 anni di universitï¿œ ti fanno fare un esamino sul c, che poi 
come linguaggio non lo incontrerai mai piï¿œ.
Quindi non capisco il problema della libreria non - standard
in ambienti come Dev C++ tale libreria ï¿œ presente
Non vedo perchï¿œ se uno ritiene valida una libreria non debba includerla 
nel progetto...solo perchï¿œ non-standard.
Allora se io volessi scrivermi delle librerie dovrei rinunciarci?
E dovrei rinunciare pure ad utilizzarle?
Capisco il discorso che compilando un sorgente su un ambiente 
non-standard possa dare problemi per via delle librerie non disponibili, 
ma se in un caso reale tali librerie sono convenienti, penso si vada 
oltre il concetto di standard e si includano al fine di arrivare 
all'obbiettivo.
Io non lavoro per un'azienda o in un team, sono uno studente e per me 
l'importante ï¿œ arrivare a produrre un software che rispetti le 
caratteristiche del progetto utilizzando il linguaggio c.
Poi che l'esperto che coda da 20 anni in C, lo faccia in modo elegante e 
super ottimizzato, quello ï¿œ un altro discorso.
Ma non si diventa esperti programmatori in C con un esamino all'universitï¿œ.
Ciao

 e invece funziona
Hai provato su Linux e su MacOS X?
E sul DOS?
Enrico

 Quindi non capisco il problema della libreria non - standard
Il problema ï¿œ che se non c'ï¿œ uno standard, o meglio, se non si segue uno 
standard, si creano spaccature. Vedi quello che ï¿œ successo con HTML 
(intendo come IE rappresentava il codice HTML e come lo facevano quelli 
che seguivano lo standard), o con qualsiasi cosa.
Idealmente, si dovrebbe scrivere codice compilabile sotto qualsiasi 
compilatore segue un certo standard, che sia C99, POSIX, ecc. In questo 
modo, se un tipo vuole "portare" l'applicazione in un altro ambiente, 
gli basterï¿œ che l'altro ambiente sia provvisto di un compilatore che 
rispetta tale standard. Ad esempio, un sistema operativo diverso 
(GNU/Linux, MacOS, GNU/Hurd, ecc).
Certo poi se il proprio target ï¿œ un utenza specifica, si puï¿œ scegliere 
anche di non seguire uno standard per velocizzare le cose, ma si 
dovrebbe sempre partire dalla possibilitï¿œ di scrivere il codice piï¿œ 
possibile "portabile".
Almeno secondo me.
Enrico

Enrico Bassetti ha scritto:

e sull' Intellevision?
All'universitï¿œ utilizziamo windows e dev C++, e il prg gira in 
consolle......
E se fosse un caso reale bhe' avrei chiesto al cliente per quale sistema 
  progettare e l'avrei compilato per Linux,Mac etc...
non cade il mondo
ciao

 Ecco perch� ho scritto char tasto.
Ai miei il perche' non devo farlo glielo spiego. 
Come nota a margine, fa veramente ridere preoccuparsi di sizeof(int)-8
bit quando per farlo si introduce potenzialmente un baco.
Se una funzione ritorna un int, a meno che tu non sia *perfettamente*
certo di potere fare il cast, non devi farlo. Altrimenti avrebbero
scritto per ritornare un char, non trovi? BTW, lo faresti anche con 
int getchar(void);
Fra le altre cose, siccome le CPU *non* maneggiano char ma int, di fatto
introduci solo operazioni di mascheramento e *potenzialmente* risparmi
memoria. Infatti per motivi di allineamento e gestione interna delle
cose, potrebbe venire allocato *comunque* lo spazio di un intero.
Tipo, se e' roba che va sullo stack e non hai altro, visto che sulla tua
piattaforma lo stack e' allineato a 32bit, deve comunque allocare sullo
stack memoria a multipli di 32bit.
Generalmente lascia ottimizzare a chi capisce in dettaglio quello che
sta succedendo, dopo aver dimostrato che quel punto necessita
ottimizzazione *e* aver dimostrato che la tua migliora non introduce
bachi e da un vantaggio concreto in termini di ottimizzazione.
-- 
-riko

 E dovrei rinunciare pure ad utilizzarle?
Stai confondendo un po' di cose. In primo luogo ritenere valida conio.h
e' eccessivo, visto che e' una libreria scritta per un sistema operativo
di quasi trenta anni fa, sostanzialmente morto e sepolto, clonata in
modo non necessariamente uniforme da vari vendor *e* che non offre
sostanzialmente nulla...
In secondo luogo *se* devi usare librerie esterne lo fai nei modi
corretti, tenendo conto di quello che stai facendo nei tuoi build-files,
etc etc etc. Di solito non e' una cosa che si fa a casaccio,
sparpagliando ovunque dipendenze senza nemmeno avere idea di starlo
facendo.
In terzo luogo, non credo proprio che tu debba usare librerie esterne
per "il mio piccolo primo programmino in C". La libreria standard basta
e avanza. Meta' de "i miei piccoli primi programmini in C" si
risolverebbe con una manciata di righe di codice potendo scegliersi
tutte le librerie esterne. Non e' quello l'obiettivo.
Poi se sei piu' che sicuro che i tuoi docenti non si accorgano (o non
sappiano) quello che stai facendo, il problema e' sostanzialmente tuo.
D'altra parte lo hai detto: sei uno studente con l'arroganza di decidere
quello che gli serve o meno imparare. Ne ho visti fin troppi. Di solito
non finiscono ottimamente.
-- 
-riko

Enrico Bassetti ha scritto:

ciao Enrico
Il linguaggio C non l'incontrerï¿œ piï¿œ in ambito di studio universitario, 
poichï¿œ passiamo al Java....poi che il C ï¿œ tutt'ora utilizzato dal 
1972/73, non puo' che farmi piacere...a me interessava come studente 
comprendere che C a differenza di java, ha i puntatori, alloccazione e 
deallocazione dinamica della memoria, niente garbage collector, che 
utilizzare persino le stringhe ï¿œ un casino, che le strutture dinamiche 
sono una rogna e che tutto il controllo ï¿œ a responsabilitï¿œ del 
programmatore....no il C non mi piace....e non ho intenzione di scrivere 
un Sistema Operativo.
Onestamente penso che per utilizzare bene il C (nel suo ambito 
applicativo) bisognerebbe conoscere bene anche l'assembly...ma ï¿œ una mia 
opinione.
Il C ï¿œ un linguaggio/strumento come ce ne sono tanti, io non tifo per 
nessuno in particolare, ma oggi con i sistemi informatici potenti ed 
economici che abbiamo, il C ï¿œ relegato ad altri ambiti, e onestamente se 
devo fare un gestionale desktop/web, posso scegliere java o php di certo 
non lo faccio in C.
Io sono convintissimo che seguire uno standard sia in alcuni ambiti una 
necessitï¿œ piu' che una best pratice
ma come ho detto 'in alcuni ambiti'
quindi se non sono "obbligato" ed ho abbastanza margine di libertï¿œ 
espressiva faccio come me pare...prendendomi le responsabilitï¿œ del caso.
Io vengo dalla programmazione web oriented e so' come si pena a far 
girare correttamente xhtml e css e javascript sulla maggior parte dei 
browser....e IE sicuramente "perdona troppo" ai web developers....
Quindi, io non ritengo necessari certi 'estremismi' espressivi, se 
l'ambito non lo richiede esplicitamente, ed inoltre in una fase 
formativa iniziale, mettere troppi paletti non aiuta a comprendere il 
discorso, e te lo sta scrivendo uno studente (io)....quindi un ignorante 
(sempre io).
ciao

Enrico Franchi ha scritto:

cos'e' finiscono tutti drogati e alcolizzati? ;)
p.s. il nostro docente non ha posto limiti di tal genere, non ha mai 
detto questo no, questo si.
Tu parli cos� perch� forse sono anni che per lavoro/hobby programmi in 
C, ma le tue conoscenze non si apprendono in un piccolo corso del C, ne 
il professore ha il tempo per spiegarti tutti i casi della vita.....
Dai che imparare a programmare richiede anni e pratica....

 cose, potrebbe venire allocato *comunque* lo spazio di un intero.
io ho studiato che i tipi di dato primitivi sono caratteri,interi,reali 
e stringhe di byte di lunghezza fisse (opcode?)...


 
Sul tuo manuale è **sicuramente** indicato che la definizione della 
funzione getch restituisce un int.
E comunque, quando usi un software la prima cosa è leggere la 
documentazione ufficiale:
http://www.delorie.com/djgpp/doc/libc-2.02/libc_335.html
Visto che getch restituisce un int, perchè tu lo vuoi convertire in un 
char?
Comunque
(leggendo la documentazione su
http://msdn.microsoft.com/en-us/library/078sfkak(VS.71).aspx
), la 
funzione getch non riporta condizioni di errore; quindi dovrebbe essere 
safe usare un char.
Ben diverso è il caso della funzione getchar
(
http://www.delorie.com/djgpp/doc/libc-2.02/libc_336.html
)
nel qual caso è necessario usare un int, perchè in caso di errore la 
funzione restituisce EOF, che è un codice diverso da tutti quelli gestiti 
dal tipo char.
Ciao  Manlio

 consolle......
Si da il caso che il mondo sia leggermente piï¿œ ampio e variegato... ergo 
l'affermazione IMHO era un po' troppo azzardata...
Enrico

 ciao
Uno studente (che sia tale) non ï¿œ mai ignorante. Ignorante ï¿œ chi non sa 
perchï¿œ non vuole sapere, non chi non sa ma vuole imparare.
Enrico

 detto questo no, questo si.
Ma credo possa apprezzare, dal lato suo, uno schema di ragionamento 
basato sull'utilizzo di standard e quindi di un aumento di 
compatibilit�. D'altro canto, � anche per voi una buona impostazione 
iniziale.
Enrico
PS: hei quanti omonimi in giro per i NG! :-D

Enrico Bassetti ha scritto:

ok ma non ï¿œ che nel mio piccolo posso pensare a tutte le infinite 
possibilitï¿œ del caso.
Ragiono su cio' che mi serve...al momento.
la giornata ï¿œ fatta di 24h
devo pure dare un colpetto alla mia ragazza no?

 Ciao  Manlio

 
Evidenzio il "sembra". Io userei int, e non char.
Uno dei vantaggi ad usare funzioni standard è che spesso sono molto più 
ben documentati (e a volte trovi anche il rationale).
Ciao  Manlio

 PS: hei quanti omonimi in giro per i NG! :-D
che non lo sai?
In C - standard i programmatori si chiamano tutti Enrico, per via della 
portabilit�.

 safe usare un char.
Vorrei sapere cosa fa getch quando su console windows uno da ^Z.
A logica dovrebbe restituire EOF (come getchar) e avere lo stesso
comportamento. Non ho un Windows su cui provare al momento.
Ho le macchine virtuali rotte da un aggiornamento.
-- 
-riko

 e stringhe di byte di lunghezza fisse (opcode?)...
Hai studiato male, c'e' una cosa nel tuo elenco che non e' normalmente
associata ai tipi primitivi. :)
Comunque attenzione, io non ti stavo piu' parlando a livello C. C non sa
cosa fa la CPU: io ti ho detto quello che potrebbe fare la CPU (e
tipicamente fa). Questo perche' tu mi hai detto "ottimizzo". Io ti stavo
dicendo che la tua "ottimizzazone" potrebbe non esserlo nella pratica.
Generalmente non puoi ottimizzare se non sai come viene tradotto il
codice, almeno grosso modo. Il che vuole dire... non ottimizzare. Adesso
non ti e' richiesto.
-- 
-riko

 [...]
Ciao  Manlio

Manlio Perillo ha scritto:

non è che conio.h me la sono inventata cosi'....
ho girato, letto, chiesto e me l'hanno consigliata altri esperti di C/C++.
E' carino non dover digitare il tasto e poi premere INVIO
fa 'più serio' e quindi si fa apprezzare per la comodità e l'usabilità, 
aspetti che comunque fanno parte dell'esperienza utente e quindi del 
software.... 1-0 palla al centro!

 Vorrei sapere cosa fa getch quando su console windows uno da ^Z. 
0x1a
Provato da Python, usando msvcrt.getch.
Ciao  Manlio



Ma funziona solo con DOs e Windows, non con Linux
-- 
http://www.itp-news.com

Ezechiele ha scritto:

e vabhe' ma io opero su windows....
se avessi fatto qualcosa che per necessità doveva girare su 
linux...avrei optato per la libreria standard.
mi state facendo venire i sensi di colpa....

      URRA'!!!!!!!!
Stanno parlando da una funzione con il nome _getch, non getch. Va bene
cosi. Per tutte due funzioni non ce un standard e tutti possono
definire le funzioni come vogliono. E se microsoft scrive, come si
puo usare le sue funzioni, non vuole dire che da qualcuno alto
compiler una funzione con lo stesso nome lavora anche nel stesso
modo.
Non dico che non si puo usare funzioni non-standard. Dico che si deve
documentare quando si usa una funzione non-standard, perche qui serve
una mano, quando il programma viene portata su un systema differente.
E per me, quando un dozente mi chiama di solvere un problema, non ho
la liberta di risolvere il problema solo per un systema. Per me, il
dozente deve dire, per che systema vuole la risolutione. Deve sapere,
che non c'e una risolutione transferibile (con funzione standard-C).
Spero che il mio italiano non e' troppo errato. Tanti saluti dalla
germania.
cc

 mi state facendo venire i sensi di colpa....
Te lo dico perchè ci sono passato anche io. Per esigenze didattiche avevo 
preparato una ima esercitazione che prevedeva la lettura dei caratteri 
con il linguaggio C. Ma in laboratorio abbiamo Linux e Windows, e mi sono 
dovuto arrampicare sugli specchi quando abbiamo visto che su Linux lo 
stesso programma non funzionava.
-- 
http://www.itp-news.com

 Provato da Python, usando msvcrt.getch.
Strano forte. 
-- 
-riko



Restituisce tutti i possibili codici ASCII + estensione ad 8 bit.
Se per alcune combinazioni di tasti non è associato nessun codice (come 
ad esempio `Ctrl` + `-`), non restituisce niente (nel senso che la 
funzione non ritorna).
Il problema è che la documentazione è alquanto scarna.
Ciao  Manlio

 Restituisce tutti i possibili codici ASCII + estensione ad 8 bit.
Ripeto: strano che non gestisca l'EOF.
-- 
-riko



Non mi sembra tanto strano (la cosa strana, ripeto, è che non sia ben 
documentata).
Del resto la gestione dell'EOF appartiene allo strato di alto livello 
nella gestione della console.
_getch opera a basso livello (così come è possibile fare su sistemi UNIX 
con termios).
Ciao

 Dai che imparare a programmare richiede anni e pratica....
Certamente.
-- 
-riko

 software.
No, non fa "piu' serio". Fa roba artigianale.
Oltretutto indica piuttosto chiaramente che non si e' capita la
finalita' di un progetto didattico. Non e' implementare la meno cessosa
delle interfacce cessos[0], e' capire come strutturare e implementare un
piccolo progetto.
La gestione dell'input deve essere *perfetta* nel senso che qualunque
cosa faccia l'utente il programma risponda correttamente. Questo e'
quello che insegno ai miei. 
Che si debba o meno premere invio dopo avere battuto un comando non
importa piu' o meno a nessuno, perche' in ogni caso un software "reale"
non lo useresti cosi'.
------
[0] non e' un "offesa": il punto e' che dopo un corso di C non ci sono
gli elementi per fare una buona interfaccia grafica e non e' l'obiettivo
del corso. quello che si fa e' un po' di roba a menu "text based"
perche' e' facile da implementare, sebbene orrenda da usare.
-- 
-riko

 l'accesso diretto alla console.
Gia'. Ma qui stiamo anche parlando de "il mio primo programma C" e credo
che in questo contesto il valore di avere idea che ci sia uno "standard"
e che questo sia bene rispettarlo e' assolutamente preponderante su
tutto il resto.
Il fatto di dovere fare invio dopo un comando e' sostanzialmente
irrilevante, dal mio punto di vista. 
-- 
-riko

 Questo e' quello che insegno ai miei. 
Stai insegnando?

 quello che insegno ai miei.
lo fa lo fa, attraverso un costrutto switch
bye


Enrico Franchi ha scritto:

dal tuo punto di vista.....che non � il mio (pure che insegni)

 bye
Immagino si riferisse alla (sub)discussione "char vs int".
Enrico

 
minimo?
se vedi il mi progetto non la penseresti cosi'
6000 righe di codice circa, che lavorano bene....molto bene

 minimo?
Perï¿œ nonostante tutto vuoi "chiudere" il tuo progetto ad una particolare 
implementazione non-standard.
Enrico

 documentata).
Nzomm... se pensi che e' una funzione non standard che tutti clonano a
modo loro da venti trent'anni... :)
-- 
-riko

 Stai insegnando?
Do una mano in lab.
-- 
-riko

 dal tuo punto di vista.....che non � il mio (pure che insegni)
Gia'. 
-- 
-riko

 perch� non vuole sapere, non chi non sa ma vuole imparare.
Quoto.
E aggiungo: l'ignoranza in informatica porta alla rovina.
-- 
-riko

Enrico Bassetti ha scritto:

inizio a sognarvi di notte
mi rincorrete tutti incappucciati
urlando :- PORTABILE!!!!! PORTABILE!!!!!!

 urlando :- PORTABILE!!!!! PORTABILE!!!!!!
E la clava con inciso POSIX te la sei dimenticata? :-P
Enrico

Enrico Bassetti ha scritto:

no no ï¿œ ben presente anche quella!
ANATEMAS POSIX!!!!!

 ciao
In bocca al lupo ;-)

Visto che il thread è cresciuto e questo passaggio l'ho trovato
interessante dico anch'io la mia.
Personalmente mi è parso di notare che la principale differenza tra un
programmatore con esperienza e un novizio è la differente posizione
che questi assume davanti alla macchina. Per essere più precisi, il
ragionamento "così funziona, non tocchiamolo più" davanti ad un codice
è sintomo di paura ed ignoranza nei confronti del sistema. Ugualmente
scrivere e riscrivere cento volte le stesse trenta righe di codice.
Quando si conosce l'algoritmo *e* il sistema, si scrive il codice in
base ai requisiti e non si tocca più.
Questo non è in alcun modo sinonimo di "scrivere codice portabile":
ogni soluzione ad un problema ha pro e contro, e analizzare costi/
benefici di ogni soluzione è un segno di conoscenza che si traduce in
qualità finale.
Per quanto riguarda gli studenti "poco interessati" o "arroganti" che
siano il discorso è facile: non sono interessati alla programmazione e
non saranno mai programmatori. Easy.
Ciao a tutti!


 
nessun altro?
Forza venite gente!!!!
p.s. oggi ho dato l'esame 27
si lo so' poteva essere 30, ma io sono un ignorante e arrogante.....

 si lo so' poteva essere 30, ma io sono un ignorante e arrogante.....
Complimenti per il voto :)
In ogni caso non c'è bisogno di prendersela - nessuno credo avesso il
minimo dubbio che avresti passato l'esame, cercavano tutti di darti un
*plus* rispetto al massimo che avresti dovuto sapere per il 30.

 nozioni un po' pi� "all around"?
Io ti direi "il voto di un qualunque esame conta piu' o meno nulla con
la carriera futura". In primo luogo il *primo* esame di programmazione
non ha nulla a che vedere con quello che uno sa fare (o sapra' fare). 
Poi e' *probabile* che un informatico veramente bravo prenda pure
parecchi trenta. E' anche possibile che non abbia fatto informatica, o
che magari non abbia fatto l'universita' proprio, sebbene non frequente.
Ho visto anche tanta gente prendere voti molto alti senza capire quasi
nulla: di fatto l'universita' italiana e' molto poco selettiva per una
serie di motivi. Inoltre c'e' il problema che non si puo' purtroppo
penalizzare troppo chi studia "male"[0] e non e' logicamente possibile
punire chi studia *solo* la materia di studio.
----------
[0] sfortunatamente bocciare tutti e soli quelli che *dovrebbero* essere
bocciati porterebbe alla chiusura degli atenei per mancanza di
laureati/iscritti.
Alla fine si accetta che una persona che studia, sebbene tenda a capire
poco, non sappia e non voglia approfondire e magari abbia uno studio
tendenzialmente mnemonico (sigh) sia promossa. Per me questo non e'
bene, ma mi rendo conto che e' sostanzialmente inevitabile.
-- 
-riko

 nozioni un po' pi� "all around"?


Signori io avrï¿œ anche solo 22 anni
ma vi assicuro che la programmazione mi piace....
e imparerï¿œ!

 � sintomo di paura ed ignoranza nei confronti del sistema.
In parte pu� essere vero, ma molto spesso in informatica succedono cose 
al limite dell'immaginabile.
Quindi, il sistema che funziona IMHO non si deve toccare, anche perch� 
se funziona non vedo a cosa dovrebbe servire modificarlo...
(escludendo l'aggiunta di bug... ehm, "features")
Enrico

 *plus* rispetto al massimo che avresti dovuto sapere per il 30.
Sottoscrivo.
Enrico

 (escludendo l'aggiunta di bug... ehm, "features")
Ah, il refactoring. BTW, se hai una buona suite di test e non stai
facendo roba inerentemente intestabile, modifichi finche' vuoi e non
rompi nulla.
Se *non* hai una buona suite di test... ecco il problema. :P
-- 
-riko

 Poi ovviamente s�, ci faceva programmare in C :-)
Ma si, pero' spero che siamo d'accordo che tutto questo non e'
strettamente inerente alla programmazione.
-- 
-riko

 Se *non* hai una buona suite di test... ecco il problema. :P
Ovviamente era sott'inteso che vale dove non puoi sfondare nulla. Quando 
hai ambienti di test ovviamente puoi fare quello che vuoi.
Enrico

 
certo, ma qui si parla di c standard e il conio.h non ï¿œ standard, vedi te.