Avatar billede snowball Novice
23. september 1999 - 10:02 Der er 21 kommentarer og
1 løsning

"Levende" ur i C/C++

Så er der lidt arbejde til Bjarke og Soepro igen ;-))

Jeg har forsøgt på at lave et "levende" ur. Altså et som blir opdateret hvert sek. Den eneste måde jeg har fået det til at virke på er denne måde:

  struct tm *time_now;
  time_t secs_now;
  char str[80];
  int i, timeout;
  timeout = 180;

  for(i = 0; i < timeout; i++)

  {

    delay(1000);
    clrscr();
    tzset();
    time(&secs_now);
    time_now = localtime(&secs_now);
    strftime(str, 80,"Klokken er %I:%M:%S (%Z) %A den %d %B %Y", time_now);
    printf("%s\n",str);
    gotoxy(80,25);

  }

  return 0;

Mit spørgsmål er så; kan man ikke lave det så  man ikke skal "slette skærmen" hele tiden. Altså uden clrscr() så man f.eks. kan ha' det til at køre et sted på skærmen og så stadig skrive et andet sted ???

Håber i forstår hvad jeg mener.

Snowball
Avatar billede lrj Nybegynder
23. september 1999 - 10:22 #1
Kender ikke c++ kommandoen til det, men hvis du placerer cursoren samme sted hver gang, ex. øverst på skærmen, midt for - og så laver din print-sætning der. Så bliver der jo hele tiden skrevet oveni det samme...

Men at returnere kontrollen til DOS og stadig køre videre - det er vist de 2 andre : )
Avatar billede snowball Novice
23. september 1999 - 10:29 #2
Hhhhmmm...du si'r egentlig noget....man kunne jo lave en gotoxy(x,x) så den starter med at skrive det samme sted hver gang.

Jeg arbejder lige videre på det når jeg fåe tid, og så får du måske point'ene !!!

Snowball
Avatar billede tknudsen Nybegynder
23. september 1999 - 10:30 #3
hej Snowball...

Det du efterlyser er mere et program som kan ligge i baggrunden og vise tiden på skærmen (samme sted på skærmen - som lrj har beskrevet). Dette program skal efter det er blevet executed 'overgive' kontrollen tilbage til DOS. Dette gøres via et TSR (Terminate and Stay Resident) program.

God arbejdslyst

(spørg KLA hvis du vil vide noget om ASM prg ;-)  ...  )
Avatar billede bjarke Nybegynder
23. september 1999 - 10:46 #4
tknudsen >> kører uret så stadig (med skærmopdatering)!

snowball >> som du kan se i de andre spørgsmål, så har jeg selv spurgt lidt til det med ure. Soepro har lagt koden til et interrupt-styret ur under et andet spørgsmål her på siden.

Den primitive løsning jeg selv har brugt og er blevet træt af (men det virker) er i princippet:

void opdater_ur()
{
int x=wherex(), y=wherey();
// gettime ...
gotoxy(1,72);
// skriv tiden
gotoxy(x,y); // sæt cursoren hvor den stod før
}


void main()
{
do
  {
  // med kbhit() undgår du at uret står stille, når du kalder getch() funktionen
  if(kbhit()) tast=getch();
  // brug tast til noget
  // udfør noget andet
  opdater_ur();
  }
while(tast!=27);
}

Fidusen er at sørge for at opdateringen af uret hele tiden kaldes i en løkke, men det er irriterende, når man skal indlæse (du kommer til at bruge kbhit() temmelig meget)!

Mht. til at lave et interrupt-styret ur eller et TSR program, så melder jeg pas:-( Men se evt soepro's ur andetsteds.
Avatar billede tknudsen Nybegynder
23. september 1999 - 11:05 #5
bjarke >> Ja - det er jo netop pointen med TSR - så længe vi snakker DOS programmering that is.

Snowball >> Jeg har muligvis misforstået dit spørgsmål (happens all the time). Du vil lave et C prg hvori du vil vise uret ? Hvis ja - så glem det med TSR programmet og se bjarkes eksempel - det vil virke !
Avatar billede bjarke Nybegynder
23. september 1999 - 11:22 #6
tknudsen >> Hvorfor dur det ikke med TSR. Hvis nu en eller anden skrap gut her på eksperten laver programmet?
  Findes der ikke også funktioner til at lade c-programmer stay resident?
Avatar billede tknudsen Nybegynder
23. september 1999 - 11:30 #7
bjarke >> det vil også virke med et TSR program - det er bare ikke nødvendig hvis det er det samme program.

Det fundamentale her (og i det musse styring vi har snakket om) er hvorvidt der ønskes at lave noget a la event styret i windows. Dette kan gøres via software interrupts.

HW timeren udløser et sw interrupt som feks et TSR prg kunne reagere på og udskrive klokken på skærmen. Dette vil så ske uanset hvilket andet program du har startet i DOS - TSR prg vil skrive det samme sted på skærmen og om nødvendig overskrive andet der står på samme koordinater.

Hvis ikke denne 'event' styring ønskes/er nødvendig kan man i hver enkelt program selv hente tiden/musse pos/kbhit i en-eller-anden løkke.

Man kan godt lave TSR programmer i C - jeg ved bare ikke lige hvordan (med mindre der benyttes in-line asm)
Avatar billede bjarke Nybegynder
23. september 1999 - 11:46 #8
tknudsen >> Kunne main ikke lave et TSR i c efter følgende princip:

  void main(int argc, char* argv[])
    {
    int x=(int)argv[1];  // +'0' ?
    int y=(int)argv[2];
    // gettime ...
    gotoxy(x,y);
    // skriv tiden på skærmen
    // stay/go resident
    }

Og så kunne man bare kalde dette program med passende argumenter fra diverse programmer (hvor man så, selvfølgelig er nødt til at resservere en fast skærmplads til uret).
Avatar billede tknudsen Nybegynder
23. september 1999 - 13:56 #9
bjarke >> eh - jow eeh - selve program designet er der i kke noget i vejen med - der er bare nogle få ting der skal på:
1) for at programmet overhovedet kører 'af sig selv' skal main offset'et mappes ned i interrupt vector tabellen på hw clock interruptet. Så bliver main afviklet ca. 18.2 gange i sekundet (her kunne man jo lave en neddelingen så det kun sker 2-4/sek.) Dette gøres med int21h func 25h. hw clock ligger på int1Ch.

2)programmet skal afsluttes med int21h func31h. Dette afvikler programmet og ligger det op i den residente del af mem.

3)før gotoxy skal x,y lige gemmes så der kan flyttes tilbage til de oprindelige koordinater

- her er nogle eksempler i asm...
mov    dx,offset Main        ;put main offset to HW clock int (1Ch) - segment
mov    ax,251ch        ;is know due to abilities of .com file (all segs are the same)
int    21h

mov    dx,((prglen+15)/16)+10h    ;length of prg (within _TEXT) in paragraphs (16 bytes)
mov    ax,3100h        ; add 16 to tage højde for heltalsdivision :-)
int    21h
Avatar billede snowball Novice
23. september 1999 - 14:18 #10
Jeg ved ikke med jer andre, men jer er forlængst stået af !!!

Snowball
Avatar billede bjarke Nybegynder
23. september 1999 - 14:34 #11
snowball >> det er jeg også, men jeg lader bare som om jeg ikke er;-)

tknudsen >> klares 1 og 2 ikke af funktionerne i c (bortset fra neddelingen)?
Avatar billede tknudsen Nybegynder
23. september 1999 - 14:49 #12
snowball >> skal du ikke snart hjem :) Fik du det eksemepl program ?


bjarke >> I saw that :)

nej !
Avatar billede bjarke Nybegynder
23. september 1999 - 14:54 #13
tknudsen >> schhh - det er jo ikke sikkert at de andre har set;-)
Avatar billede snowball Novice
23. september 1999 - 14:58 #14
tknudsen: hjem ??? klokken er jo ikke engang 3 endnu, og Peter sætter mig til den ene opgave efter den anden ;-))

Ja, jeg har fået det, men har ikke nået at prøve det endnu !!!

Snowball
Avatar billede bjarke Nybegynder
23. september 1999 - 15:02 #15
tknudsen >> har du ikke lavet et eller andet fedt program, som man kan få koden til og blive inspireret af?
Avatar billede tknudsen Nybegynder
23. september 1999 - 19:34 #16
bjarke >> jeg har lavet det 'ur' vi snakker om, men det er kodet i assembler !

Jeg har ikke prøvet at lave noget tilsvarende i C, men jeg sender lige asm koden til dig så du kan se hvad det drejer sig om ! Det minder lidt om det prg vi har snakket om ang musse styring (gentager jeg mig selv - I dont know - er lige vågnet - en laang nat venter :). Jeg har vist din email adr ellers skriver jeg lige igen. Hvis du har spørgsmål 'uret' så spørg...
Avatar billede bjarke Nybegynder
24. september 1999 - 08:06 #17
tknudsen >> det lyder godt!

Hvis der er nogen der er interesserede i lidt ASM for begyndere, så er her en side, som er god tror jeg (jeg har lige fundet den og kun skimmet den):

http://oracleda.ikasths.dk/intranet/teachers/fkj/docjava/assembler/procedurer.htm
Avatar billede snowball Novice
24. september 1999 - 12:08 #18
For lige at komme tilbage til et spor hvor jeg også kan være lidt med ;-))

Hvis man laver lidt om på den kode som jeg postede i starten, så løkken bli'r til en uendelige løkke ( for(;;) ) hvordan laver så så den stopper hvis man f.eks. trykker på ESC eller ENTER ? Skal der smides en BREAK; ind et eller andet sted ???

Snowball
Avatar billede bjarke Nybegynder
24. september 1999 - 12:33 #19
Hvis koden bare skal køre uden at kommunikere med brugeren, så stoppes nedenstående ved tryk på ESC:

#define ESC 27

while(1)
{
// kode
if(kbhit()) if( getch()==ESC ) break;
}

PS: Jeg synes, at while(1) er pænere end for(;;)
Avatar billede bjarke Nybegynder
24. september 1999 - 12:34 #20
snowball >> Jeg kan heller ikke ASM, men jeg har da tænkt mig at tage hjem og læse ovenstående
Avatar billede snowball Novice
24. september 1999 - 12:42 #21
while(1) og for(;;) gør vel det samme, så det er vel bare et spørgsmål om smag og behag !?!?!?!

Snowball
Avatar billede bjarke Nybegynder
24. september 1999 - 12:43 #22
Ja, selvfølgelig - gør som du vil;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester