Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Attenti a Poco F7: può essere il best buy del 2025. Recensione
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Poco F7 5G, smartphone che punta molto sulle prestazioni grazie al processore Snapdragon 8s Gen 4 e a un display AMOLED da ben 6,83 pollici. La casa cinese mantiene la tradizione della serie F offrendo specifiche tecniche di alto livello a un prezzo competitivo, con una batteria generosissima da 6500 mAh e ricarica rapida a 90W che possono fare la differenza per gli utenti più esigenti.
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-01-2003, 11:40   #1
leon84
Senior Member
 
L'Avatar di leon84
 
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 .
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 12:28   #2
bsummer
Senior Member
 
L'Avatar di bsummer
 
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
bsummer è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 12:35   #3
leon84
Senior Member
 
L'Avatar di leon84
 
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++ .
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 12:37   #4
bsummer
Senior Member
 
L'Avatar di bsummer
 
Iscritto dal: Oct 2002
Messaggi: 487
Hmmm, modalita' testo o modalita' grafica?

Bye
bsummer è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 12:39   #5
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Quote:
Originally posted by "bsummer"

Hmmm, modalita' testo o modalita' grafica?

Bye
Modalità testo
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 12:50   #6
bsummer
Senior Member
 
L'Avatar di bsummer
 
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
bsummer è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 13:13   #7
leon84
Senior Member
 
L'Avatar di leon84
 
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 ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 13:19   #8
leon84
Senior Member
 
L'Avatar di leon84
 
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;
}
}
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 13:21   #9
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Cionci mi ha detto di provare a vedere con l'api readconsoleoutput . Ne sai qualcosa ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 13:23   #10
bsummer
Senior Member
 
L'Avatar di bsummer
 
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
bsummer è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 13:31   #11
bsummer
Senior Member
 
L'Avatar di bsummer
 
Iscritto dal: Oct 2002
Messaggi: 487
Quote:
Originally posted by "leon84"

Cionci mi ha detto di provare a vedere con l'api readconsoleoutput . Ne sai qualcosa ?
No, di api non ne consoco. Sorry.

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
bsummer è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 13:36   #12
leon84
Senior Member
 
L'Avatar di leon84
 
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 .
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 13:37   #13
leon84
Senior Member
 
L'Avatar di leon84
 
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 .
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 13:41   #14
bsummer
Senior Member
 
L'Avatar di bsummer
 
Iscritto dal: Oct 2002
Messaggi: 487
Quote:
Originally posted by "leon84"

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 .
Mmm, aspetta, ho scritto H0B800... in C l'esadecimale e' 0x0b800

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
bsummer è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 14:41   #15
leon84
Senior Member
 
L'Avatar di leon84
 
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"
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 15:02   #16
bsummer
Senior Member
 
L'Avatar di bsummer
 
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
bsummer è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 15:15   #17
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Aglia un brutto errore .... In esecuzione all'istruzione buffer[i] = *p viene generato il seguente errore :
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 15:28   #18
bsummer
Senior Member
 
L'Avatar di bsummer
 
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
bsummer è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 16:52   #19
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Purtroppo sempre lo stesso errore
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2003, 18:24   #20
bsummer
Senior Member
 
L'Avatar di bsummer
 
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
bsummer è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Attenti a Poco F7: può essere il best buy del 2025. Recensione Attenti a Poco F7: può essere il best buy...
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
TSMC produrrà a 2 nm anche in Ari...
Tesla vuole Musk a tutti i costi: propos...
Spotify aumenta i prezzi: da 10,99 a 11,...
Prezzi folli su AliExpress con Choice Da...
IA ed etica: Fastweb+Vodafone fra le pri...
Pannelli solari nuovi o riciclati? Quest...
Instagram cambia le regole per i Live: n...
Windows 11 SE addio: Microsoft stabilisc...
Kali Linux più facile su macOS gr...
È la fine per le antenne 5G? Al l...
WhatsApp, una taglia da 1 milione di dol...
Sembrava spacciato, poi una bici elettri...
Apple Watch Series 1 diventa obsoleto: a...
ho. Mobile, upgrade a 250 GB senza sovra...
Reddit non avrà post a pagamento,...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:33.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v