|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Attesa delle pressione di un tasto in C++
Come posso fare per far si che il programma resti in attesa di un qualsiasi tasto premuto dall'utente ? Non mi interessa il tasto , ma mi serve solo per mettere in pausa il programma . Ho provato anche system ("pause") ma non mi funziona a dovere .
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Quale s.o. usi?
Se windows/dos, prova ad usare la funzione getch(). Il programma si ferma in attesa della pressione di un tasto qualsiasi. Se Linux, potresti sempre usare la medesima funzione, il problema e' che finche' non viene premuto "invio" il programma non proseguira'. Per far si che funzioni con la pressione di un qualsiasi tasto (e non solo invio) bisogna prima del getch() fare una chiamata system(qualcosa) ... purtroppo non ricordo cosa sia il "qualcosa" ![]() Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Si grazie funziona benissimo . Il S.O è WINDOWS . Mica sapresti anche come stampare da c++ . Mi spiego : hai presente la funzione DOS che stampa ciò che vedi sul video alla pressione del tasto print della tastiera ? Beh ... è un pò la stessa cosa . Ciò che vedo sullo schermo voglio stamparlo da c++ .
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Hmmm, modalita' testo o modalita' grafica?
Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Quote:
|
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Dunque.
Quando vuoi stampare un banalissimo file testo in dos, basta fare una cosa del genere. Type file > lpt1 Ora, non so se esistano modi piu' semplici cmq io farei cosi': la memoria video in modalita' testo mi sembra inizia all'indirizzo esadecimale b800 (mi pare). Da li in poi i bytes sono suddivisi in coppie ( 1 byte attributi del colore, 1 byte codice ascii del carattere, 1 byte colore, 1byte carattere, e cosi' via...). 80 righe x 25 colonne = 2000 bytes per 1 schermata + altri 2000 bytes per gli attributi del colore. Ti basta fare una funzioncina che legge la memoria video (solo i bytes caratteri), salvare questi dati in un file testo temporaneo e quindi system ("type file > lpt1"). Ed il gioco e' fatto. Se non mi sono spiegato bene, dimmelo che provo a riformulare tutto. Pero', visto che si tratta di modalita' testo... hai provato se PrtScr non funziona? Sarebbe molto piu' semplice. Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Allora : Ho provato prtscr in questo modo : system ("prtscr") e non va . Per quanto riguarda la funzioncina , come faccio a scandire tutte le locazioni di memoria ? Non conosco le istruzioni . Me la potresti fare tu ?
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Prova a leggere qui , ci capisci qualcosa ? L'ho preso da MSDN :
How to Do a Print Screen Within a Program Last reviewed: July 17, 1997 Article ID: Q59380 5.10 6.00 6.00a 6.00ax 7.00 | 1.00 1.50 MS-DOS | WINDOWS kbprg The information in this article applies to: The C Run-time (CRT) included with: - Microsoft C for MS-DOS, versions 5.1, 6.0, 6.0a, and 6.0ax - Microsoft C/C++ for MS-DOS, version 7.0 - Microsoft Visual C++ for Windows, versions 1.0 and 1.5 SUMMARY The code below demonstrates how to do a print screen from within a program under MS-DOS. This is done by executing Interrupt 5 within a program. MORE INFORMATION The interrupt service directs all its output to the default printer. The print-screen service prints text or graphics. In graphics mode, GRAPHICS.COM must be loaded before invoking the print-screen service. Interrupt 5 does not return any values but the status code is available at memory location 0050:0000. The values are as follows: 00 No error occurred 01 Indicates that a print-screen operation is in progress FF The previous print screen was not successful. Sample Code #include <stdio.h> #include <dos.h> void main (void) { int *result; union REGS inregs, outregs; /* inregs and outregs are never used but necessary for the int86 function. */ puts("This is a test of prtscr() function."); int86(0x5, &inregs, &outregs); result = (int *) 0x00500000; switch( *result ) { case 0: puts("No error occurred."); break; case 1: puts("Print Screen in progress...."); break; case 0xFF: puts("ERROR occurred during print screen"); break; } } |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Cionci mi ha detto di provare a vedere con l'api readconsoleoutput . Ne sai qualcosa ?
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Sono 5-6 anni che non faccio piu' ste robe... Ci provo...
char buffer[2000[; char *p; p = H0b801; for (i = 0 ; i<2000; i++) { buffer[i] = *p; p+=2; } Alla fine dovresti avere tutti i caratteri presenti sullo schermo in "buffer". Ricordati che sono ordinati per riga (cioe' i primi 80 byte sono la prima riga, i secondi 80 la seconda, ecc fino alla 25ma riga). Non ricordo se i codici ascii dei caratteri si trovano nelle locazioni pari o in quelle dispari. Nel caso siano nelle pari cambia il valore di p da H0b801 in H0b800 . A questo punto prendi i caratteri da buffer a gruppi di 80 byte, e salvali su un file di tipo testo . In quanto alla questione "prtscr". Mi pare che bastava premere il tasto "prt Scr" per avviare la stampa, e che non bisognasse scrivere system("prt scr"). ![]() Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Quote:
Per quanto riguarda il codice che hai postato, e' un piccolo esempio di come fare la stampa. E' abbastanza semplice, in quanto non si fa altro che richiamare il gestore di interrupt apposito. L'esito delle operazioni e' visibile tramite un controllo del valore all'indirizzo 0x00500000. Visto che e' molto piu' semplice questa soluzione, ti consiglerei di provarla. Quella che ti ho fornito io e' un po' piu' complessa. Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Il compilatore mi dà errore nell'assegnazione al puntatore p dell'indirizzo che hai inserito . Io sapevo che non era possibile assegnare un indirizzo al puntatore ma era il compilatore che provvedeva per forza . Sei sicuro che sio possa fare ? A livello logico ho capito come funziona .
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Ah scusa .... Mancavano gli apici all'inizio e alla fine dell'indirizzo . Ora provo se la funzione che ho creato insieme alle tue istruzioni funziona .
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Quote:
![]() Per quanto riguarda l'assegnamento dei puntatori... in dos puoi assegnare ad un puntatore qualsiasi indirizzo vuoi. Win95/98 non hanno problemi a far girare applicativi dos, Me potrebbe, mentre 2000 e Xp credo s'incazzerebbero non poco. Provaci, nel caso non ti riesca ti posso spiegare passo per passo cosa fa la funzione che hai postato prima. Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Il problema è che nel buffer[2000] ci va a finire la stringa 0080 . Non vedo nulla dello schermo in quel buffer . Guarda sto codice e tralascia quello commentato
void clinica::stampa_cartacea () { ofstream file ("stampa.txt"); int i; int j ; char buffer[2000],buffer2[80]; int cont=0 ; char *p; p = "0x0b800"; for (i = 0 ; i<2000; i++) { buffer[i] = *p; p+=2; } file << buffer << endl ; /*for (i=1;i<=25;i++) { for (j=0;j<=79;j++) { buffer2[j]=buffer[cont]; cont++; } file << buffer << endl ; }*/ file.close(); } A questo punto aprendo il file di testo ci trovo "0080" |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Mmmm.
Ho una memoria di merda... non mi ricordo bene come usare i puntatori. Allora e' probabile che o ti ho detto male l'indirizzo o ti ho detto male come impostare il puntatore. Guardando per internet mi sono accorto che l'indirizzo che ti ho dato e' un po' corto Prova a scrivere (senza apici) p = (char*) 0x0b8000; Se non ti viene ancora fuori nulla prova con p =(char*) 0x0b8001; Fammi sapere. Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Aglia un brutto errore .... In esecuzione all'istruzione buffer[i] = *p viene generato il seguente errore :
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
![]() Mi spiace farti andare a tentativi, purtroppo sono cose che non faccio da diverso tempo. Riprova con le seguenti assegnazioni p = (char*) 0x0b800; oppure p=(char*)0x0b801; L' indirizzo 0x0b8000 a quanto pare non e' ![]() Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Purtroppo sempre lo stesso errore
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Senti, cancella tutto quello che ti ho detto di fare. Il problema a questo punto penso sia che windows non permette di accedere a zone di memoria non allocate dal sistema operativo, nemmeno in lettura. Come ho già detto con dos e win95 sono sicuro si potesse fare. Anche w98 credo lo permettesse ma già con Me ho dei dubbi. Quale S.O operativo hai?
Cmq, tagliando la testa al toro, prova a fare come hai trovato nell'esempio. L'ho leggermente modificato e ho tradotto in italiano nel caso avessi qualche problema con l'inglese. Se non funziona neppure così, mi spiace non saprei che altro dirti. #include <stdio.h> #include <dos.h> void clinica::stampa_cartacea () { int *result; union REGS inregs, outregs; /* chiamata all'interrupt 5. In reg e out reg vanno passati solo perchè la funzione int86 vuole 3 parametri */ int86(0x5, &inregs, &outregs); /* la funzione non restituisce nessun risultato. Tuttavia si può capire l'esito della chiamata andando a leggere un valore ad una particolare locazione di memoria. Creo quindi un puntatore ad intero indirizzato proprio a tale locazione*/ result = (int *) 0x00500000; /* possono succedere 3 casi */ while ( *result == 1) { /* la stampa è in corso...non faccio nulla */ } /* a questo punto o la stampa è terminata oppure è successo qualche errore */ if (*result!=0) { /* è successo un errore */ } else { /* tutto ok */ } } Bye
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:33.