PDA

Visualizza la versione completa : [C] Mettere in pausa una stampa


dogo21sob
29-10-2008, 18:52
ho scritto un algoritmo per trovare tutte le possibili soluzioni di un problema e, man mano che vengono trovate, vengono anche stampate, però vorrei fare una cosa del tipo che se uno preme un tasto (P per esempio) finisce di stampare la soluzione corrente e và in pausa, per poi riprendere da dove ha lasciato e continuare.. si può fare?
Avevo pensato ad usare direttamente il tasto pausa, ma in questo modo magari sta scrivendo ancora la soluzione (che occupa più righe) e quindi mettendo in pausa non trovo la soluzione completa.. si può risolvere? Posso in qualche modo dirgli, mentre stampa le soluzioni, di restare "in ascolto" per vedere se viene premuto un determinato tasto?

Ci tengo a precisare che le soluzioni vengono calcolate, contate e stampate a volo, ma non vengono memorizzate, quindi visto che non le memorizzo non posso recuperare in alcun modo la soluzione numero X.. spero di essere stato chiaro..

mondobimbi
29-10-2008, 20:10
no, nonc'è niente di precostituito, devi lavorare sulla routine di stampa.
Puoi usare un flag globale che interrompe la stampa quando settato esternamente dalla procedura di stampa, o richiamare durante la stampa una procedura esterna che gestisci come credi, o ....
ciao
sergio

dogo21sob
29-10-2008, 20:42
si ma come faccio a lasciarlo "in ascolto"? cioè io ho una procedura che fa i conti, e finito di fare i conti stampa la soluzione chiamando la procedura StampaSoluzione.. quindi una cosa tipo questa..

Procedura1{
// fa i conti
StampaSoluzione();
}

StampaSoluzione{
// stampa la soluzione su una scacchiera, quindi su più righe)
}

ora cosa devo modificare, come e dove? sempre se si può fare.. perchè la procedura1 facendo i conti trova 1000 soluzioni (esempio) e per ogni soluzione che trova fà la stampa, non posso mettere una pausa alla fine di ogni soluzione altrimenti uno deve premere 1000 volte invio per vedere tutte le soluzioni, quindi volevo che andava avanti a mostrarle (più o meno una al secondo) e se schiaccio un tasto si ferma e mi fà vedere la soluzione corrente, quindi dopo aver finito di stamparla (terminata la procedura StampaSoluzione)..

mondobimbi
30-10-2008, 10:27
ti faccio un esempio banale di cosa intendo




#include <stdio.h>

typedef void ( FUNZ )( unsigned int i, unsigned int j );

void StampaSoluzione (FUNZ funz)
{

unsigned int i, j ;
for ( i = 0; i < 16; i ++ )
for ( j = 0; j < 16; j ++ ) {
/* fa qualcosa */
funz ( i, j );
}
}

void call_funz ( unsigned int i, unsigned int j )
{
printf ( "*" );
}

int main ()
{
StampaSoluzione ( call_funz );
return ( 0 );
}

dogo21sob
30-10-2008, 12:35
questo è un esempio di quello che dicevi, usare una procedura esterna da gestire come credo?? :master:
Comunque.. visto che continuo a non capire qual'è la strada da imboccare, dove e come intervenire per effettuare il controllo sul tasto premuto e mettere l'esecuzione in pausa, passiamo alla pratica e vediamo se riusciamo a risolvere..
la procedura che richiama la stampa è questa:


void Inserisci(int r, int m) {
int i;
if(r==N){
if (m==1) StampaSoluzione();
sol++;
}
else
for(i=0;i<N;i++) {
pos[r]=i;
if(Verifica(r)) Inserisci(r+1,m);
}
}

mentre la procedura per la stampa della soluzione è questa:


void StampaSoluzione() {
int i,j;
for(i=0;i<N;i++) {
for(j=0;j<N;j++)
if(pos[i]==j) printf("X ");
else printf("- ");
printf("\n ");
}
}

si può modificare per fare quello che dicevo? qualcosa tipo (in Inserisci): se viene premuto un tasto, StampaSoluzione e pausa, altrimenti solo StampaSoluzione? perchè se uso il getch l'esecuzione si interrompe fino a che non viene premuto un tasto, invece deve prevedere anche la possibilità che questo tasto non venga premuto..

oregon
30-10-2008, 12:58
Parliamo di Windows (applicazione console) o Linux?

dogo21sob
30-10-2008, 13:21
Hai ragione, ho dimenticato di specificarlo.. l'applicazione deve girare su windows..

oregon
30-10-2008, 14:19
Allora potresti usare la funzione kbhit e la getch ... un esempio dell'uso di tali funzioni



#include <stdio.h>
#include <conio.h>

int main()
{
int c;

while(1)
{
if(kbhit())
{
c=getch();
printf("%c\n", c);
}
}

return 0;
}


che ti puo' servire (solo) per avere un'idea da applicare ...

dogo21sob
30-10-2008, 14:29
quindi questo kbhit verifica se viene premuto un tasto, giusto? quindi dovrei usare questo per vedere se viene premuto qualcosa, se si la catturo con getch e vado a vedere se, ad esempio, il carattere premuto è P, metto pausa.. ho capito bene?? mmm.. ora provo..

dogo21sob
30-10-2008, 14:32
perfetto.. funziona a meraviglia.. grazie 1000!!!

Loading