PDA

View Full Version : [PASCAL] domandona..


Nafta
19-09-2002, 19:17
Esiste un modo per verificare se un tasto premuto nel solo istante in cui l'istruzione eseguita? In pratica l'equivalente di KeyPressed, ma che non si limiti a restituirmi true o false, io voglio anche sapere che tasto stato premuto..

In pratica, qual' l'equivalente in pascal dell'Inkey$ di basic?

DM Ilweran
20-09-2002, 00:26
Read ?
Scusa ma programmavo in Pascal un decennio fa :)

Nafta
20-09-2002, 18:29
E io imparo ora :D

Read ferma l'esecuzione del mio programma finch non digiti un tasto. E a me non va bene, a me serve un'istruzione che quando eseguita restituisce se e che tasto schiacciato in quel momento.

Se no me la faccio in assembler, non ci sono problemi.. :D

DM Ilweran
20-09-2002, 19:07
Mah, io in questo contesto ricordo solo read e readln, se retrocedo ancora un po' mi trovo immerso nella placenta :p
Credo che sia impossibile che non esista una funzione che che registra lo stdin, cerca bene.

Nafta
20-09-2002, 20:53
Lo penso anche io.

Per ho trovato solo readkey che restituisce il tasto premuto, non fa echo sullo schermo ma ferma l'esecuzione, e keypressed, boleana, che assume valore true quando si preme un qualsiasi tasto..

Nafta
20-09-2002, 20:55
e che cos' lo stdin ?? :awk:

soulnafein
20-09-2002, 21:08
se non erro nemmeno in c esiste una funzione standard che fa quella cosa, bisogna andare in qualche libreria aggiuntiva comune.

DM Ilweran
21-09-2002, 03:09
Si usa getchar() e putchar() in c.

finch (c=readkey()) != EOF)
output c

Pu andare ?
stdin lo standard input.
Le funzioni vanno combinate, non si pu pretendere di avere una funzione che prende l'input e stampa l'output :) Almeno non in un set ISO.

Nafta
21-09-2002, 15:17
ma chi l'ha cheisto!!!! Forse non sono stato abbastanza chiaro.

Mi serve una funzione che all'istante x (in cui eseguita) restituisce il tasto premuto, nel caso non ci sia premuto nulla restituisce "". Non deve fare null'altro.

La domanda : esiste in pascal o librerie standard una cosa del genere oppure me la devo fare io?

Cio, il basic l'aveva, non so se mi spiego.. volete dirmi che questi superfighi linguaggi dui cui tanto cantate le lodi ne sono sprovvisti?

DM Ilweran
21-09-2002, 16:30
1) Basic un linguaggio interpretato che al 90% non segue nemmeno il paradigma strutturato
2) Non esiste una implementazione ISO del basic, almeno che io sappia: non essendoci uno standard una implementazione pu inserire tutte le funzioni fighe che vuole, peccato che funzioneranno solo su quella determinata implementazione
3) Pascal un linguaggio che stato pensato per insegnare i principi del paradigma strutturato, cosa che fa in modo eccellente (differentemente dal basic). Per linguaggi superfighi si intende Object Pascal nell'implementazione Borland (aka. Delphi / Kylix).
4) Nemmeno nell'ANSI C c' una funzione del genere. E' elementare farsela usando il C. Sicuramente elementare anche in Pascal.
4) RTFM
5) STFW
6) *PLONK*

Nafta
21-09-2002, 19:32
Non arrabbiarti per!

Nella mia ignoranza credevo fosse basilare l'esistenza di una funzione del genere, non avrei idea di come gestire i main loop senn, come faccio a farli ciclare, fare tutto quello che c' da fare, e nel contempo vedere se l'omino ha pigiato qualcosa?

Io di solito uso un sistema del genere, ma implica l'uso di quell'istruzione. Io vorrei imparare, se conosci un sistema migliore mi rendi partecipe?

ripeti
azzera variabile tasto premuto.
ripeti
se non ha ancora premuto nulla
variabile tasto premuto = c' premuto qualcosa? <<<---- !!!
finch non sono passati 1/x secondi.

controllo sulle eventuali azioni derivanti dal tasto premuto.
(disegna, calcola, muovi, ecc ecc)
finch (condizione di uscita)

DM Ilweran
22-09-2002, 00:06
Non riesci a gestire un loop senza una determinata funzione ?
In ogni caso il tuo costrutto mi pare illogico:
vuoi sapere se l'utente preme un tasto e quale tasto preme. Mi hai parlato di una funzione readkey() e di un'altra keypressed(). Mi sembra non ti serva altro, se devi usarlo come condizione in un loop: nel caso usi keypressed inizializzi una variabile intera a 0 e come condizione indichi il fatto che la variabile sia diversa da zero: i caratteri ascii sono solo e unicamente numeri interi; se utilizzi keypressed poni come condizione il fatto che keypressed sia 0 (non premuto) o 1 (premuto).
Al massimo spera che Nuitari o qualcun'altro riescano a capire il tuo problema perch io proprio non ci arrivo.
Se vuoi sapere se c' premuto qualcosa controlli se il booleano 0 o 1... boh...

Knite[Evil]
22-09-2002, 18:03
o mio dio pascal lo studio allo scientifico informatico e nn ci capisco un cazzo!!

Nafta
22-09-2002, 20:39
Non illogico, almeno da come lo vedo io. Forse sono io che non so spiegarmi.

il problema che keypressed restituisce 1 o 0 e non interrompe l'esecuzione del programma, readkey restituisce si il tasto premuto, ma il programma si ferma ad aspettare che l'utente schiacci qualcosa. A me servirebbe qualcosa che non fermasse l'esecuzione che restituisse il tasto premuto.

Forse sono stupido e non ci arrivo, in tal caso fatemelo sapere..

Nafta
22-09-2002, 20:45
A me non serve come condizione, il loop deve andare avanti lo stesso, indipendentemente dal fatto che l'utente prema o no. Serve solo per modificare il comportamento del programa se l'utente preme determinati tasti.

Se stessi facendo un giochino, per esempio, io dovrei muovere tutti i mostriciattoli e nel mentre stare attento per vedere se il giocatore vuole muoversi anche lui..

Nuitari
22-09-2002, 22:33
Scusa se non ti ho risposto subito ma ultimamente sono iper-impegnato.

La soluzione comunque usarle entrambe :)

Keypressed restituisce true se nel buffer della tastiera presente un carattere, carattere che poi puoi leggere con ReadKey, la quale dopo averlo restituito lo rimuove dal buffer.

ReadKey blocca l'esecuzione SOLO se il buffer della tastiera vuoto, ma dato che la richiami dopo esserti assicurato tramite Keypressed che sia stato premuto almeno un tasto, la funzione viene restituita immediatamente.

Un esempio questo:

Program Prova;

Uses Crt;

Var
temp: Char;

Begin
ClrScr;
WriteLn('Premere un tasto (q per uscire)');
Repeat
If KeyPressed Then
Begin
temp := ReadKey;
WriteLn('hai premuto ', temp);
End
Until temp = 'q';
End.

Nafta
23-09-2002, 17:54
Come sei figo! Come sei figooo!

soulnafein
23-09-2002, 20:36
Lascia stare il mio mentore :nono:

:rotfl: :rotfl:

DM Ilweran
24-09-2002, 03:06
Ecco per fortuna. Io proprio Pascal e Basic li ho enucleati, mi sembrava troppo strano che non si potesse fare.