2016-11-27 11 views
-2

Я информатика студента и недавно узнал, как использовать прерывание в С. через пару поиска в Интернете я пришел с этим кодом:C/C++ - работа с прерываниями в Visual Studio C++

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

#ifdef __cplusplus 

    #define __CPPARGS ... 

#else 

    #define __CPPARGS 

#endif 

#define INTR 0x1c 
#define gotoxy(x,y) printf("\033[%d;%dH", (x), (y)) 
//#define clear() printf("\033[H\033[J"); 
/* 
//positioning 
void gotoxy(int x, int y) 
{ 
    printf("%c[%d;%df",0x1B,y,x); 
} 
*/ 

void interrupt handler(__CPPARGS); 
void interrupt (*oldhandler)(__CPPARGS); 

int countS = 0; 
int s = 0; 
int m = 0; 
int ms = 0; 
int l = 0; 
int flag = 0; 

int main(void) 
{ 
    clrscr(); 
    printf("%02d:%02d:%02d",m,s,ms); 
    oldhandler = getvect(INTR); 

    setvect(INTR, handler); 
    char c; 

    while(1) 
    { 
     c = getch(); 

     switch(c){ 

      case 'e': 
       goto exit_loop; 
       break; 

      case ' ': 
       flag = 1-flag; 
       break; 

      case 'r': 
       flag = s = m = ms = l = 0; 
       clrscr(); 
       printf("%02d:%02d:%02d",m,s,ms); 
       break; 

      case 'l': 
       gotoxy(++l,0); 
       printf("%02d:%02d:%02d",m,s,ms); 
       break; 
     } 
    } 

    exit_loop:; 
    setvect(INTR, oldhandler); 
    return 0; 
} 

void interrupt handler(__CPPARGS) 
{ 

    if(flag == 1){ 

     countS++; 
     ms += 55; 

     if(countS == 18) 
     { 
      countS = ms = 0; 
      s++; 

      if(s==60) 
      { 
       m++; 
       s = 0; 
      } 
     } 

     gotoxy(0,0); 
     printf("%02d:%02d:%02d",m,s,ms); 
    } 
} 

Этот код является своего рода секундомером в приложении консоли C и его работой, совершенной в историческом Turbo C++. Я изменил свою IDE и теперь с помощью Visual studio 2013, когда я создаю новый проект в Visual C++ -> win32ConsoleApplication и вставляю этот код в основной файл. его не работает. то ошибка говорит, что я должен добавить #include "stdafx.h" в первый из моего файла. после того, как делать так, это мой основной список ошибок:

Error 1 error C2146: syntax error : missing ';' before identifier 'handler' c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 32 1 ConsoleApplication1 
Error 2 error C2182: 'interrupt' : illegal use of type 'void' c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 32 1 ConsoleApplication1 
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 32 1 ConsoleApplication1 
Error 4 error C2065: 'oldhandler' : undeclared identifier c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 33 1 ConsoleApplication1 
Error 5 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 33 1 ConsoleApplication1 
Error 6 error C2086: 'int interrupt' : redefinition c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 33 1 ConsoleApplication1 
Error 7 error C2143: syntax error : missing ';' before '(' c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 33 1 ConsoleApplication1 
Error 8 error C2059: syntax error : ')' c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 33 1 ConsoleApplication1 
Error 9 error C2059: syntax error : ';' c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 33 1 ConsoleApplication1 
Error 10 error C3861: 'clrscr': identifier not found c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 44 1 ConsoleApplication1 
Error 11 error C2065: 'oldhandler' : undeclared identifier c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 46 1 ConsoleApplication1 
Error 12 error C3861: 'getvect': identifier not found c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 46 1 ConsoleApplication1 
Error 13 error C3861: 'setvect': identifier not found c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 48 1 ConsoleApplication1 
Error 14 error C3861: 'clrscr': identifier not found c:\users\mohammad\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp 67 1 ConsoleApplication1 

эти ошибки связаны с этими линиями:

void interrupt handler(__CPPARGS); 
void interrupt (*oldhandler)(__CPPARGS); 

и использование: clrscr();

моей операционной системы Виндоус 10-64bit и его мое первое программирование в c/C++ в visual studio. Я делаю некоторые в Turbo C++ и devC++ раньше, но только Turbo C++ запускает этот образец и даже devC++. каковы различия и как я могу это решить? thanks

+1

MS-DOS мертв. –

+2

MS-DOS остается мертвым. И мы убили его. Как мы успокоимся, убийцы всех убийц? То, что было самым святым и могущественным из всех, что мир еще владел, погибал под нашими ножами: кто вытернет эту кровь от нас? –

+0

MS-DOS был мертв: для начала. В этом нет никаких сомнений. Реестр его захоронения был подписан священнослужителем, клерком, гробовщиком и главным скорбящим. Windows подписала его. И имя Windows было хорошо на «Change», для чего-либо, на что он решил поместить свою руку. – user4581301

ответ

0

Вы работаете в режиме 64-разрядного режима, поэтому у вас нет доступа к прерываниям в режиме реального времени или службам MS-DOS. У вашего кода есть ряд других проблем, но в нижней строке это не будет работать без 16-битного компилятора и эмулятора (например, NTVDM, отсутствующего в 64-битной Windows)

+0

, так что вы имеете в виду, что я не могу исправить это в visual studio или мне нужно установить в него какие-то другие плагины или компилятор? Что мне теперь делать? есть ли какой-нибудь современный идеал, который может работать как turbo C++ без каких-либо проблем? –

+0

@ mohammadfallah.rasoulnejad Вам необходимо установить эмулятор 8086, такой как DOSBox или emu8086, и написать свой код в компиляторе, в котором: 16-разрядный реальный режим не может быть эмулирован в 64-разрядной ОС. См. Http://wiki.osdev.org/Real_Mode –