[C/C++] printf - advanced?

Pagina: 1
Acties:

  • Boudi
  • Registratie: Oktober 2000
  • Laatst online: 09-08 02:32

Boudi

Always Coca Cola

Topicstarter
Hi all,

hoe krijg ik in C++ iets op het scherm, over een bestaande tekst heen?

Bijvoorbeeld zo'n procenttellertje in een MS-DOS prompt, die van 1 naar 100 gaat, maar op dezelfde locatie blijft staan...

Ik heb geprobeerd te zoeken, maar ik kan geen goede query verzinnen en daarom vond ik niet veel...

Met of zonder mayonaise?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat is niet echt te doen

misschien als je het carriage return teken stuurt naar de console, maar meestal vertaalt dat gelijk naar een carriage return/line feed (waardoor de positie behalve terug naar het begin van de regel ook een regel naar onderen beweegt)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • The End
  • Registratie: Maart 2000
  • Laatst online: 06:48

The End

!Beginning

of je doet steeds een '\b' (Backspace) voor de nieuwe output

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

backspace of gotoxy()?

  • Aidix
  • Registratie: Juni 2000
  • Laatst online: 05:34

Aidix

Geluidspietlut

met gotoxy(x,y); hard de positie op het scherm kiezen...

Er zal vast ook wel een of andere loze 'curspos' functie zijn waarmee je de huidige coordinaten uit kan lezen, maar het mooist is natuurlijk om gewoon het scherm memory mapped te benaderen (vanaf B800:0000) , dan ben je zo klaar.

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Je zou misschien iets kunnen proberen met de functie gotoxy( x, y) .. dit is echter geen standaard C functie en je moet conio.h includen...

vondt ook nog in m'n boek over zelf maken van deze functie.. hiervoor heb je dos.h nodig..
code:
1
2
3
4
5
6
7
8
9
void gotoxy( int x, int y)
{
  union REGS r;
  r.h.ah = 2;
  r.h.dh = y;
  r.h.dl = x;
  r.h.bh = 0;
  int86( 0x10, &r, &r);
}

- Edit -
'k zie dat ik weer te langzaam type.... |:(

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • Aidix
  • Registratie: Juni 2000
  • Laatst online: 05:34

Aidix

Geluidspietlut

Op dinsdag 23 april 2002 12:30 schreef Aidix het volgende:
met gotoxy(x,y); hard de positie op het scherm kiezen...

Er zal vast ook wel een of andere loze 'curspos' functie zijn waarmee je de huidige coordinaten uit kan lezen, maar het mooist is natuurlijk om gewoon het scherm memory mapped te benaderen (vanaf B800:0000) , dan ben je zo klaar.
ZO dus:

void showScreen(void *where)
{
asm{ // Writez the screen at 'where' to VGA
mov ax, [where]
mov si,ax
mov dx, 0xb800
push dx
pop es
push 0
pop di
mov cx,4000
rep movsw
}
}



*where is 2000 words data, de msb is het ascii karakter, de lsb het attribute, die moet je 0Fh maken voor witte tekst op zwarte achtergrond. Veel plezier >:)

  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

werkt het niet met \r ?
dat werk in JAVA iig wel op de DOS prompt..

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Ik weet niet of je op UNIX programmeert, anders zou je eventueel Cygwin kunnen gebruiken. Maar waar jij naar zoekt is een library die ncurses heet.

Zoek maar eens op internet naar curses en c of c++. Dan vindt je vast wat je bedoeld...

Verwijderd

Zoals je aan de hoeveelheid verschillende gegeven mogelijke oplossingen kan zien hangt het er maar net vanaf wat je er mee wil bereiken.

Als je echt helemaal totale controle over het scherm wil, kom je waarschijnlijk uit bij ncurses of andere console-libs. Als je echter puur alleen maar zo'n progress-indicator'tje wil is (onder Windows iig) een paar backspaces (ASCII:8) outputten genoeg.

  • Boudi
  • Registratie: Oktober 2000
  • Laatst online: 09-08 02:32

Boudi

Always Coca Cola

Topicstarter
Thnx all, ik had geen id hoe dit te doen, maar er zijn mogelijkheden zat... vooral dat backspace verhaal.. dat ik daar niet op ben gekomen :)

ps over dat direct naar video-geheugen schrijven: heb je daar toevallig een link van liggen?? dat lijkt me wel cool :)

Met of zonder mayonaise?


  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 05-06 15:39

RetepV

ALLES valt te repareren

void teller( void )
{
int nCnt;

// Beginnen op een lege regel
printf( "\n" );
// Tel van 0 tot en met 100
for( nCnt = 0; nCnt <= 100; nCnt++ )
{
printf( "\rTeller: %03d", nCnt );
sleep( 1000 ); // Of iets anders time-consumings
}
}

als alternatief kun je ook het volgende doen, is minder belastend, alleen werkt het alleen als je %03d gebruikt zodat je altijd 3 cijfers te zien krijgt:

void teller( void )
{
int nCnt;

// Beginnen op een lege regel
printf( "\nTeller: 000" );
// Tel van 0 tot en met 100
for( nCnt = 0; nCnt <= 100; nCnt++ )
{
printf( "\b\b\b%03d", nCnt );
sleep( 1000 ); // Of iets anders time-consumings
}
}

Macbook Pro


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Op woensdag 24 april 2002 14:20 schreef Boudi het volgende:
Thnx all, ik had geen id hoe dit te doen, maar er zijn mogelijkheden zat... vooral dat backspace verhaal.. dat ik daar niet op ben gekomen :)

ps over dat direct naar video-geheugen schrijven: heb je daar toevallig een link van liggen?? dat lijkt me wel cool :)
Zie de post van Aidix.

Verwijderd

code:
1
2
3
for (int i = 0; i < 1000000; i++) {
    printf("%6i\r", i);
}

Edit: oeps, post van RetepV niet goed gelezen. :)
Pagina: 1