Avatar billede dd_ns Nybegynder
04. august 2003 - 13:32 Der er 30 kommentarer og
1 løsning

hjælp til "gammel" c++

JEg har følgende, som jeg gerne vil have omskrevet til "gammel" c++ (turbo C++)....

#include <windows.h>
#include <iostream>

using namespace std ;

// Her defineres konstanter, der bliver brugt
#define WAIT 100    // Ventetid i ms mellem hvert flyt
#define SCR_WIDTH    80  // Vinduets bredde (standard 80)
#define SCR_HEIGTH    25  // Vinduets højde (standard 25)
#define A_CHAR "@"
int spacepress;

int main()
{
    HANDLE h = GetStdHandle( STD_OUTPUT_HANDLE ) ;  // Returnerer et handle til konsolvinduet
    // definér 2 COORD strukturer, som repræsenterer et punkt i vinduet.
    COORD pos = { SCR_WIDTH / 2, SCR_HEIGTH / 2 };
    COORD old = pos ;
    COORD null = {0,0};
    COORD skrive = {25,0};
    CONSOLE_CURSOR_INFO cci;
    cci.bVisible = FALSE;
    SetConsoleCursorInfo(h, &cci);
    SetConsoleTextAttribute(h, FOREGROUND_GREEN | FOREGROUND_INTENSITY);

   
    // slet skærmen
    system("cls") ;

    // Sæt cursorens position til pos
    SetConsoleCursorPosition(h,pos) ;
    // udskriv et @
    cout << A_CHAR ;

    // while ( der ikke er trykket escape)
    while ( !(GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) )
    {
        // Hvis der bliver trykket på en piletast, så opdater koordinatet
        if ( GetAsyncKeyState(VK_LEFT) & 0x8000 )
            pos.X = ( pos.X > 0 ? pos.X - 1 : 0 ) ;
        if ( GetAsyncKeyState(VK_RIGHT) & 0x8000 )
            pos.X = ( pos.X < SCR_WIDTH - 1 ? pos.X + 1 : SCR_WIDTH ) ;
        if ( GetAsyncKeyState(VK_UP) & 0x8000 )
            pos.Y = ( pos.Y > 0 ? pos.Y - 1 : 0 ) ;
        if ( GetAsyncKeyState(VK_DOWN) & 0x8000 )
            pos.Y = ( pos.Y < SCR_HEIGTH - 1 ? pos.Y + 1 : SCR_HEIGTH ) ;

        if ( GetAsyncKeyState(VK_SPACE) & 0x8000 )
            spacepress = 1;

        // Hvis vi har et nyt koordinat
        if ( pos.X != old.X || pos.Y != old.Y || spacepress == 1)
        {
            // Slet det gamle tegn ved at skrive space henover
            SetConsoleCursorPosition(h,old) ;
            cout << " " ;
            // Skriv et nyt @ på den nye position
            SetConsoleCursorPosition(h,pos) ;
            cout << A_CHAR ;
            old = pos ;
            Sleep( WAIT ) ;  // Vent WAIT = 125 ms før vi fortsætter.
            SetConsoleCursorPosition(h,null) ; //smider koordinater op på 0,0
            cout << "        "; // Sletter gamle pos.
            cout << "        "; // Skal lige laves rigtigt.
            SetConsoleCursorPosition(h,null) ; //smider koordinater op på 0,0 igen
            cout << "Pos.x: " << pos.X << "\n";  //skriver X
            cout << "Pos.y: " << pos.Y << "\n";  //skriver Y
            SetConsoleCursorPosition(h,pos) ; //smider koordinater til den nye pos
       
            if ( pos.X == 10 && pos.Y == 10)
            {
            SetConsoleCursorPosition(h,skrive) ;
            cout << "Fundet.";
            SetConsoleCursorPosition(h,pos) ;
            }
           
            if (spacepress == 1) {
            cout << "space.";
            }
            spacepress = 0;
        }
   


    }
    return 0 ;  // Når der er trykket escape ryger vi ud af første while - løkke,
                // og der returneres 0.
}
Avatar billede arne_v Ekspert
04. august 2003 - 13:37 #1
Hvis er en ældre windows compiler burde det være nok at ændre
#include <iostream> til #include <iostream.h> og slette
using namespace std;.

Hvis det er en DOS compiler så skal der findes erstatning for
SetConsoleCursorPosition og GetAsyncKeyState.
Avatar billede dd_ns Nybegynder
04. august 2003 - 13:40 #2
Ja, det er en DOS compiler jeg skal bruge....

Har du mulighed for at skrive dem om... Giver gene nogle flere point...

Selvom det er til dos, så kan jeg da godt lave den under windows, right...

en af mine venner køre dos og jeg køre windows.... men det må da være muligt at compile den begge steder, bare man tager højde for dos?, eller hvad???



Hvad med graph.h til dos.. Hvor er den i windows, eller er det ikke muligt at bruge line, osv... i concole???
Avatar billede arne_v Ekspert
04. august 2003 - 13:50 #3
Du kan godt køre en DOS applikation udner Windows.

Hvis ens compiler understøtter det kan man også bygge en DOS
applikation under Windows.

Vigtigt: en windows console applikation og en DOS applikation er *ikke*
det samme selvom de "ligner" hinanden.
Avatar billede arne_v Ekspert
04. august 2003 - 13:51 #4
Jeg kan godt prøve og kigge på det, men der er formentlig dem der
bedre til en sådan omskrivning end mig.
Avatar billede dd_ns Nybegynder
04. august 2003 - 13:54 #5
Hvordan finder jeg ud af om min compiler kan klare dos?

Fedt nok, hvis du vil have flere point, så må du sige til
Avatar billede soreno Praktikant
04. august 2003 - 19:29 #6
>>Hvordan finder jeg ud af om min compiler kan klare dos?
Du gør "eksperterne" opmærksom på hvilken IDE/compiler du har (og hvilken version).
Så skal vi nok hjælpe med at finde udaf om den er DOS "kompatibel".
Avatar billede arne_v Ekspert
04. august 2003 - 20:31 #7
Der er vist stort set ingen moderne Windows compilere som understøtte
DOS applikationer længere.
Avatar billede bertelbrander Praktikant
04. august 2003 - 20:48 #8
Det er ikke nemt at lave en GetAsyncKeyState funktion der virker under DOS :-(
Man kan godt lave en, men det kræver at man bruger lidt assembler, er du sikker på at du vil det?
Jeg troede ikke at der var nogen der brugte DOS i år 2003.
Avatar billede arne_v Ekspert
04. august 2003 - 21:37 #9
Følgende compiler og virker med BC 3.1:

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

#define WAIT 100
#define SCR_WIDTH 80
#define SCR_HEIGTH 25
#define A_CHAR '@'

struct COORD
{
  int X,Y;
};

void putmch(char *s)
{
  char *p = s;
  while(*p)
  {
      putch(*p);
      p++;
  }
}


int main()
{
    COORD pos = { SCR_WIDTH / 2, SCR_HEIGTH / 2 };
    COORD old = pos ;
    COORD null = {1,1};
    COORD skrive = {25,1};
    highvideo();
    textcolor(GREEN);
    clrscr();
    gotoxy(pos.X, pos.Y) ;
    putch(A_CHAR);
    for(;;)
    {
        if(kbhit())
        {
          int c = getch();
          if(c == 0x1B) break;
          if(c == 0)
          {
              c = getch();
              if(c==75) pos.X = ( pos.X > 0 ? pos.X - 1 : 0 );
              if(c==77) pos.X = ( pos.X < SCR_WIDTH - 1 ? pos.X + 1 : SCR_WIDTH );
              if(c==72) pos.Y = ( pos.Y > 0 ? pos.Y - 1 : 0 );
              if(c==80) pos.Y = ( pos.Y < SCR_HEIGTH - 1 ? pos.Y + 1 : SCR_HEIGTH );
          }
        }
        if ( pos.X != old.X || pos.Y != old.Y)
        {
            gotoxy(old.X,old.Y) ;
            putch(' ');
            gotoxy(pos.X, pos.Y) ;
            putch(A_CHAR);
            old = pos ;
            gotoxy(null.X,null.Y);
            putmch("          ");
            gotoxy(null.X,null.Y);
            char s[17];
            sprintf(s,"x: %d y: %d",pos.X,pos.Y);
            putmch(s);
            gotoxy(pos.X,pos.Y);   
            if ( pos.X == 10 && pos.Y == 10)
            {
                gotoxy(skrive.X,skrive.Y) ;
                putmch("Fundet");
                gotoxy(pos.X,pos.Y);   
            }
        }
    }
    return 0 ;
}
Avatar billede arne_v Ekspert
04. august 2003 - 21:39 #10
Det virker næsten som dit program.

Jeg har omrokeret lidt.

Og jeg fjernede space, da jeg ikke kunen forstå hvad den blev brugt til.

Jeg fjernede også sleep fordi en tigth CPU loop er OK i DOS's
non-multi-tasking environment.

BC 3.1 er en DOS compiler som er en professionel udgaven af TC.

Så der er god sandsynelighed for at det kompiler på din vens TC.
Avatar billede dd_ns Nybegynder
05. august 2003 - 10:18 #11
fedt nok. Tak..

Jeg har lige et andet spørgsmål, som du måske kan hjælpe med...


Jeg vil gerne følgende:


jeg har en txtfil der inde holder:

1112223334440
4443332221110
1 2 3 4 3 2 1

den skal så læse fra txt filen, og tegne en pixel i rød hvor der er 1, og grøn ved 2, osv... den skal ikke tegne noget ved " " (tom)


hvordan gøre jeg lige det...

???

Du skal nok få flere point
Avatar billede arne_v Ekspert
05. august 2003 - 10:29 #12
Jeg kan prøve at kigge på det i aften.
Avatar billede dd_ns Nybegynder
05. august 2003 - 10:39 #13
ja tak. :)
Avatar billede dd_ns Nybegynder
05. august 2003 - 10:43 #14
hvis du lige kunne vile mig hvordan jeg åbner en txt fil, læser fra den, og lukker den igen, ville jeg blive glad...
Avatar billede arne_v Ekspert
05. august 2003 - 10:48 #15
#include <stdio.h>

...

FILE *fp;
char line[133];
fp=fopen("filnavn.dat","r");
while(!feof(fp))
{
  if(fgets(line,sizeof(line),fp))
  {
      // process line
  }
}
fclose(fp);

hvar virker i C og C++ siden ruder konge var ruder knægt.
Avatar billede dd_ns Nybegynder
05. august 2003 - 10:54 #16
og så lige en error control på det, og så skal jeg nok lade dig være :)
Avatar billede arne_v Ekspert
05. august 2003 - 11:07 #17
Hvad mener du med error control ?
Avatar billede dd_ns Nybegynder
05. august 2003 - 11:10 #18
ik noget... fiksede det selv...

MEn jeg kan ikke lige finde ud af det....


kan du ikke lave noget hurtigt, der lige læser fra filen og skriver et tegn afgangen og position af tegnet?
Avatar billede arne_v Ekspert
05. august 2003 - 11:12 #19
fgets læser fra filen.

#include <stdio.h>
#include <string.h>

...

FILE *fp;
char line[133];
int i;
fp=fopen("filnavn.dat","r");
while(!feof(fp))
{
  if(fgets(line,sizeof(line),fp))
  {
      for(i=0;i<(strlen(line)-1);i++)
      {
        printf("pos=%d char=%c\n",i,line[i]);
      }
  }
}
fclose(fp);

skulle skrive ud.
Avatar billede arne_v Ekspert
05. august 2003 - 19:49 #20
Det var dæleme en sej en.

Men følgende kode virker hos mig:

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

int main()
{
  FILE *fp;
  char line[133];
  int i,n,col;
  int gdriver,gmode;
  gdriver = DETECT;
  initgraph(&gdriver, &gmode, "C:\\BC31\\BGI");
  //printf("%s\n",grapherrormsg(graphresult()));
  fp=fopen("C:\\z.z","r");
  n=0;
  while(!feof(fp))
  {
      if(fgets(line,sizeof(line),fp))
      {
        for(i=0;i<(strlen(line)-1);i++)
        {
            switch(line[i])
            {
                case '1':
                    col = RED;
                    break;
                case '2':
                    col = GREEN;
                    break;
                case '3':
                    col = BLUE;
                    break;
                case '4':
                    col = YELLOW;
                    break;
                default:
                    col = BLACK;
                    break;
            }
            putpixel(i,n,col);
        }
        n++;       
      }
  }
  fclose(fp);
  getch();
  return 0;
}
Avatar billede arne_v Ekspert
05. august 2003 - 19:50 #21
Path til BGI filer skal nok rettes til.

Jeg har sat default til BLACK.

Men det kan du sikkert nemt rette til som du vil have det.
Avatar billede arne_v Ekspert
07. august 2003 - 09:43 #22
Virker det ?
Avatar billede dd_ns Nybegynder
07. august 2003 - 09:45 #23
Ahhh, ja sorry... Har lidt travlt... Ja, det virker fint...

Og så en anden ting-...

Hvis nu at jeg gerne vil kunne flytte en figur rundt på skærmen, hvordan så lige det... figuren er tegnet med putpixel, da jeg ikke kan bruge et billede... Eller ved du hvordan man kan det???
Avatar billede arne_v Ekspert
07. august 2003 - 09:53 #24
Jeg tror at man overskriver billedet på det gamle sted med ingenting og
genskriver billedet det nye sted.
Avatar billede dd_ns Nybegynder
07. august 2003 - 09:55 #25
Ja, men hvordan kan jeg vise et billede?
Avatar billede arne_v Ekspert
07. august 2003 - 09:58 #26
Et billede er også bare en samling pixels.

D.v.s. at du kan læse en billed fil ligesom vi læser de her text-filer
og tegne dem.

Eneste krav er at man kender formatet af den billed fil.
Avatar billede dd_ns Nybegynder
07. august 2003 - 10:03 #27
Ja, lad os antage at det er en bmp fil...

Jeg går ud fra at man skal have lidt kode for at "forstå" pixel opbygningen i sådan en fil... Men det du siger er at det godt kan lade sig gøre at vise et bmp billede i c???

code?
Avatar billede arne_v Ekspert
07. august 2003 - 10:07 #28
Ja - selvfølgelig kan det det.

Hvordan tror du diverse grafgiske programmer viser billeder ?

Det er ganske almindeligt kode.

BMP er et af de nemmere grafik formater.
Avatar billede dd_ns Nybegynder
07. august 2003 - 10:10 #29
Ja, så laver du lige noget code, og så giver jeg nogle flere point???
:=)
Avatar billede arne_v Ekspert
07. august 2003 - 10:13 #30
Måske skulle vi lige afslutte det her spørgsmål og så kan du oprette et nyt.

Vi er ved at have bevæget os en del væk fra det oprindelige spørgsmål.
Avatar billede dd_ns Nybegynder
07. august 2003 - 10:16 #31
okay, så gør jeg det....
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