Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Прервания DOS

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

iLok



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Среда разработки Borland C++ 5.02
Хочу разобратся с работой с прерываниями DOS. Беру готовый пример из Help (help по функции intdos)

Код:
 
#include <dos.h>
#include <stdio.h>
 
 
/* deletes file name; returns 0 on success, nonzero on failure */
int delete_file(char *filename)
{
   union REGS inregs,outregs;
   int ret;
   inregs.h.ah = 0x41;
/* delete file */
   inregs.x.dx = (unsigned) filename;
   ret = intdos(&inregs, &outregs);
 
   /* if carry flag is set, there was an error */
   return(outregs.x.cflag ? ret : 0);
}
 
int main(void)
{
   int err;
   err = delete_file("NOTEXIST.$$$");
 
   if (!err)
      printf("Able to delete NOTEXIST.$$$\n");
   else
      printf("Not Able to delete NOTEXIST.$$$\n");
   return 0;
}
 

 
Запускаю на компиляцию
А оно мне сразу
 
Error:  GEN.CPP(23,22):Undefined structure 'REGS'
Error:  GEN.CPP(23,22):Size of 'inregs' is unknown or zero
Error:  GEN.CPP(23,22):Undefined structure 'REGS'
Error:  GEN.CPP(23,30):Undefined structure 'REGS'
Error:  GEN.CPP(23,30):Size of 'outregs' is unknown or zero
Error:  GEN.CPP(23,30):Undefined structure 'REGS'
Error:  GEN.CPP(25,12):'h' is not a member of 'REGS'
Error:  GEN.CPP(27,12):'x' is not a member of 'REGS'
Error:  GEN.CPP(28,17):Call to undefined function 'intdos'
Error:  GEN.CPP(31,20):'x' is not a member of 'REGS'
Warn :  GEN.CPP(32,2):'ret' is assigned a value that is never used
Warn :  GEN.CPP(32,2):Parameter 'filename' is never used
 
 
/////////////////////////
 
Ладно почитал Help , там написано что структуры REGS, WORDREGS, BYTEREGS найдеш в dos.h
Поискал нашол.
 
добавил в код строки

Код:
 
struct BYTEREGS  {
  unsigned char  al, ah, bl, bh;
  unsigned char  cl, ch, dl, dh;
};
 
struct WORDREGS  {
  unsigned int  ax, bx, cx, dx;
  unsigned int  si, di, cflag, flags;
};
 
union REGS {
  struct  WORDREGS  x;
  struct  BYTEREGS  h;
};
 

 
 
Вот полный код

Код:
 
#include <dos.h>
#include <stdio.h>
 
 
struct BYTEREGS  {
  unsigned char  al, ah, bl, bh;
  unsigned char  cl, ch, dl, dh;
};
 
struct WORDREGS  {
  unsigned int  ax, bx, cx, dx;
  unsigned int  si, di, cflag, flags;
};
 
union REGS {
  struct  WORDREGS  x;
  struct  BYTEREGS  h;
};
 
/* deletes file name; returns 0 on success, nonzero on failure */
int delete_file(char *filename)
{
   union REGS inregs,outregs;
   int ret;
   inregs.h.ah = 0x41;
/* delete file */
   inregs.x.dx = (unsigned) filename;
   ret = intdos(&inregs, &outregs);
 
   /* if carry flag is set, there was an error */
   return(outregs.x.cflag ? ret : 0);
}
 
int main(void)
{
   int err;
   err = delete_file("NOTEXIST.$$$");
 
   if (!err)
      printf("Able to delete NOTEXIST.$$$\n");
   else
      printf("Not Able to delete NOTEXIST.$$$\n");
   return 0;
}
 

Оно мне
 
Error:  GEN.CPP(28,17):Call to undefined function 'intdos'
 
Не знаю пример вроди из help взят.
Должен компилится.
 
Помогите найти ошибку.

Всего записей: 131 | Зарегистр. 08-06-2003 | Отправлено: 23:14 07-10-2004
wiwiw

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
проверь тип приложения. он должен быть DOS application

Всего записей: 127 | Зарегистр. 20-03-2004 | Отправлено: 00:09 08-10-2004
ZZmiy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iLok
Вообще-то пример-то ты взял не из helpа от

Цитата:
Среда разработки Borland C++ 5.02

а из Borland C++ 3.1 !
Там и нужно компилировать - bcc <имя_С_файла> .
А фокусы типа bcc32 <имя_С_файла> не пройдут в WIN32.
В егоном dos.h нет ни таких объявлений, ни таких функций.

Всего записей: 430 | Зарегистр. 05-04-2003 | Отправлено: 01:05 08-10-2004
iLok



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да есть там такое:
[code]
REGS (union)
 
header: DOS.H
The union REGS is used to pass information to and from these functions:  
 
int86  
int86x  
intdos  
intdosx  
 
union REGS {
  struct  WORDREGS  x;
  struct  BYTEREGS  h;
};  
 
See Also
 
struct REGPACK  
[code]
 
 
Товарищи какой выход?
Как его скомпилить и запустить?
 
Что ему нужно чистый дос для етого?
У меня ХР.
 
Учитывая ВАШИ советы напрашивается  
ГЛАВНЫЙ ВОПРОС
 
Что поставить(всмысле доустановить, может не хватает)?
В чем писать?
Чем компилить?
Чем руководствоводся?
 
Или кто нибуть может дать рабочий пример?

Всего записей: 131 | Зарегистр. 08-06-2003 | Отправлено: 12:29 08-10-2004
DKalishevich



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно либо проверить, что в настройках проекта точно указано, что прога собирается для DOS, либо все это компилировать под Borland C++ 3.1

Всего записей: 344 | Зарегистр. 19-11-2003 | Отправлено: 13:47 08-10-2004
iLok



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Короче я поставлю вопрос подругому:
 
Нада через прерываниe 21h и досовскую функцию 38h получить полную информацию о стране.
 
Нашол описание функции 38h:
DOS Fn 38H: дать/установить информацию о стране
Вход
• AH = 38H  
• DX = 0ffffH чтобы установить код страны равным AL (или BX)  
• DS:DX = адрес локального буфера для чтения блокa данных страны  
• AL = 00H чтобы получить данные для текущей страны  
= 1 до 0feH чтобы получить данные для указанной страны < 255  
= 0ffH чтобы получить данные для кода страны ‡ 255  
• BX = (если AL=0ffH) 16-битовый код страны  
 
Выход
• Пересылает в DS:DX блок данных страны  
 
Нашол в help описание блока данных страны

Код:
 
struct COUNTRY{
   short co_date;             /* date format */
   char  co_curr[5];           /* currency symbol */
   char  co_thsep[2];           /* thousands separator */
   char  co_desep[2];           /* decimal separator */
   char  co_dtsep[2];         /* date separator */
   char  co_tmsep[2];           /* time separator */
   char  co_currstyle;         /* currency style */
   char  co_digits;           /* significant digits in currency */
   char  co_time;               /* time format */
 
   long  co_case;               /* case map */
   char  co_dasep[2];           /* data separator */
   char  co_fill[10];           /* filler */
};
 

 
Начал писать :

Код:
 
#include <dos.h>
#include <stdio.h>
#include <conio.h>
 
union REGS inregs, outregs;
struct SREGS segregs;
 
struct  COUNTRY country_info;
struct  COUNTRY far *farcountry_info;
 
 
 
void main(void)
{
 
  inregs.h.ah = 0x38;
  inregs.h.al = 0x007;//код России
 
  segregs.ds  = FP_SEG(&country_info);
  inregs.x.dx = FP_OFF(&country_info);
  intdosx(&inregs, &outregs, &segregs);
 
  farcountry_info = (COUNTRY far *)MK_FP(FP_SEG(&country_info),  FP_OFF(&country_info));
 
  printf("\n co_date %d \t"
         "\n co_curr %s \t"
         "\n co_thsep %s \t"
         "\n co_desep %s \t"
         "\n co_dtsep %s \t"
         "\n co_tmsep %s \t"
         "\n co_currstyle %s \t"
         "\n co_digits %s \t"
         "\n co_time %s \t"
         "\n co_case %d \t"
         "\n co_dasep %s \t"
         "\n co_fill %s \t",
         farcountry_info->co_date,
         farcountry_info->co_curr,
         farcountry_info->co_thsep,
         farcountry_info->co_desep,
         farcountry_info->co_dtsep,
         farcountry_info->co_tmsep,
         farcountry_info->co_currstyle,
         farcountry_info->co_digits,
         farcountry_info->co_time,
         farcountry_info->co_case,
         farcountry_info->co_dasep,
         farcountry_info->co_fill
  );
 
}
 

Ничо не получается.
 
Объясните пожалуста физику процеса...
Спасибо.
 

Всего записей: 131 | Зарегистр. 08-06-2003 | Отправлено: 23:44 09-10-2004
iLok



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я выбираю любую страну:
 
Коды некоторых стран.  
Код Страна  
OOlh Соединенные Штаты Америки  
003h Латинская Америка  
007h Россия  
OlFh Нидерланды  
020h Бельгия  
021h Франция  
022h Испания  
027h Италия  
02Ch Великобритания  
031h Германия  
 
А программа печатает все время одно и тоже.

Всего записей: 131 | Зарегистр. 08-06-2003 | Отправлено: 12:11 10-10-2004
MoKC0DeR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Информация получается о текущей стране, а не о той что ты указываешь в al.

Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 15:15 10-10-2004
ZZmiy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iLok
Ты не дочитал описание функции - если ошибка, то устанавливается флаг CF!
И тогда нет смысла выводить структуру - там туфта будет...
По крайней мере у меня на другие коды дает ошибку...
Все таки функция 38h имеет смысл для старых досов - 3.30 например, а так хрен его знает, что будет в Windowsах...

Всего записей: 430 | Зарегистр. 05-04-2003 | Отправлено: 14:35 11-10-2004
iLok



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понял спасиба.
Я немного доработал может кому пригодится что-бы не набивали моих шишек:
 

Код:
 
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
 
struct myCOUNTRY{
   short co_date;             // date format
   char co_curr[5];           // currency symbol
   char co_thsep[2];          // thousands separator
   char co_desep[2];          // decimal separator
   char co_dtsep[2];          // date separator
   char co_tmsep[2];          // time separator
   char co_currstyle;         // currency style
   char co_digits;            // significant digits in currency
   char co_time;              // time format
 
   long co_case;              // case map
   char co_dasep[2];          // data separator
   char co_fill[10];          // filler
};
 
 
  union   REGS  inregs;
  union   REGS  outregs;
  struct  SREGS segregs;
  struct  myCOUNTRY country_info;
 
void main(void)
{
  inregs.h.ah = 0x38;
  inregs.h.al = 0x00;
 
  segregs.ds  = FP_SEG(&country_info);
  inregs.x.dx = FP_OFF(&country_info);
 
  intdosx(&inregs, &outregs, &segregs);
 
  // &#197;&#241;&#235;&#232; &#239;&#238;&#241;&#235;&#229; &#226;&#251;&#239;&#238;&#235;&#237;&#229;&#237;&#232;&#255; &#239;&#240;&#229;&#240;&#251;&#226;&#224;&#237;&#232;&#255; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#235;&#229;&#237;
  // &#244;&#235;&#224;&#227; &#239;&#229;&#240;&#229;&#237;&#238;&#241;&#224;, &#226;&#251;&#226;&#238;&#228;&#232;&#236; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#229; &#238;&#225; &#238;&#248;&#232;&#225;&#234;&#229;
  if(outregs.x.cflag != 0)
  {
    printf("\n\nError:\t%d", outregs.x.ax);
 
    // &#207;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#240;&#224;&#241;&#248;&#232;&#240;&#229;&#237;&#237;&#243;&#254; &#232;&#237;&#244;&#238;&#240;&#236;&#224;&#246;&#232;&#254; &#238;&#225; &#238;&#248;&#232;&#225;&#234;&#229;
    // &#241; &#239;&#238;&#236;&#238;&#249;&#252;&#254; &#244;&#243;&#237;&#234;&#246;&#232;&#232; 0x59 &#239;&#240;&#229;&#240;&#251;&#226;&#224;&#237;&#232;&#255; INT 21h
    inregs.h.ah = 0x59;
    inregs.x.bx = 0;
 
    // &#209;&#238;&#245;&#240;&#224;&#237;&#255;&#229;&#236; &#240;&#229;&#227;&#232;&#241;&#242;&#240;&#251; &#226; &#241;&#242;&#229;&#234;&#229;, &#242;&#224;&#234; &#234;&#224;&#234; &#232;&#245; &#241;&#238;&#228;&#229;&#240;&#230;&#232;&#236;&#238;&#229;
    // &#232;&#231;&#236;&#229;&#237;&#232;&#242;&#241;&#255;
    asm push ds
    asm push es
    asm push si
    asm push di
 
    // &#194;&#251;&#231;&#251;&#226;&#224;&#229;&#236; &#239;&#240;&#229;&#240;&#251;&#226;&#224;&#237;&#232;&#229;
    intdosx(&inregs, &outregs, &segregs);
 
    // &#194;&#238;&#241;&#241;&#242;&#224;&#237;&#224;&#226;&#235;&#232;&#226;&#224;&#229;&#236; &#241;&#238;&#228;&#229;&#240;&#230;&#232;&#236;&#238;&#229; &#240;&#229;&#227;&#232;&#241;&#242;&#240;&#238;&#226;
    asm pop di
    asm pop si
    asm pop es
    asm pop ds
 
    // &#194;&#251;&#226;&#238;&#228;&#232;&#236; &#240;&#224;&#241;&#248;&#232;&#240;&#229;&#237;&#237;&#243;&#254; &#232;&#237;&#244;&#238;&#240;&#236;&#224;&#246;&#232;&#254; &#238;&#225; &#238;&#248;&#232;&#225;&#234;&#229;
    printf("\nExtended error code    :%d"
           "\nError Class            :%d"
           "\nAction                 :%d"
           "\nLocalization           :%d",
           outregs.x.ax, outregs.h.bh,
           outregs.h.bl, outregs.h.ch);
  }
  else
  {
    printf("\n Date format        : %d \
    \n Currency symbol    :'%s'\
            \n Thousand separator :'%s'\
            \n Decimal separator  :'%s'\
            \n Date separator     :'%s'\
            \n Time separator     :'%s'\
            \n Currstyle          : %d \
            \n Digits             : %d \
            \n Time Format        : %d \
            \n Case procedure addr: %ld\
            \n Data separator     :'%s'\
            \n Fill               :'%s'",
 
country_info.co_date,
country_info.co_curr,
country_info.co_thsep,
country_info.co_desep,
country_info.co_dtsep,
country_info.co_tmsep,
country_info.co_currstyle,
country_info.co_digits,
country_info.co_time,
country_info.co_case,
country_info.co_dasep,
country_info.co_fill
  );
 
   printf("\n\n After decoding:\n");
// &#208;&#224;&#241;&#248;&#232;&#244;&#240;&#238;&#226;&#251;&#226;&#224;&#229;&#236; &#239;&#238;&#235;&#243;&#247;&#229;&#237;&#243;&#254; &#232;&#237;&#244;&#238;&#240;&#236;&#224;&#246;&#232;&#254;
 
//&#212;&#238;&#240;&#236;&#224;&#242; &#228;&#224;&#242;&#251;:
 
//     0 = &#209;&#216;&#192;     (&#236;&#229;&#241;&#255;&#246;/&#228;&#229;&#237;&#252;/&#227;&#238;&#228;)
//     1 = &#197;&#226;&#240;&#238;&#239;&#224;  (&#228;&#229;&#237;&#252;/&#236;&#229;&#241;&#255;&#246;/&#227;&#238;&#228;)
//     2 = &#223;&#239;&#238;&#237;&#232;&#255;  (&#227;&#238;&#228;/&#236;&#229;&#241;&#255;&#246;/&#228;&#229;&#237;&#252;)
 
  char *date;
  date = (char *) malloc(sizeof(char)*8);
 
  switch (country_info.co_date)
  {
  case 0:
      strcpy(date,"MM");
      strcat(date,country_info.co_dtsep);
      strcat(date,"DD");
        strcat(date,country_info.co_dtsep);
         strcat(date,"YY");
         break;
  case 1:
      strcpy(date,"DD");
      strcat(date,country_info.co_dtsep);
      strcat(date,"MM");
        strcat(date,country_info.co_dtsep);
         strcat(date,"YY");
         break;
  case 2:
      strcpy(date,"YY");
         strcat(date,country_info.co_dtsep);
      strcat(date,"MM");
        strcat(date,country_info.co_dtsep);
         strcat(date,"DD");
         break;
  }
 
//&#212;&#238;&#240;&#236;&#224;&#242; &#226;&#240;&#229;&#236;&#229;&#237;&#232;:
 
//     0 = 12-&#247;&#224;&#241;&#238;&#226;&#238;&#233;
//     1 = 24-&#247;&#224;&#241;&#238;&#226;&#238;&#233;
 
  char *time;
  time = (char *) malloc(sizeof(char)*16);
 
    switch(country_info.co_time)
    {
   case 0:
      strcpy(time,"hh");
         strcat(time,country_info.co_tmsep);
      strcat(time,"mm");
        strcat(time,country_info.co_tmsep);
         strcat(time,"ss [AM/PM]");
        break;
         
    case 1:
        strcpy(time,"HH");
         strcat(time,country_info.co_tmsep);
      strcat(time,"MM");
        strcat(time,country_info.co_tmsep);
         strcat(time,"SS");
        break;
    }
 
  char *numb;
  numb = (char *) malloc(sizeof(char)*8);
  strcpy(numb,"1");
   strcat(numb,country_info.co_thsep);
  strcat(numb,"000");
  strcat(numb,country_info.co_desep);
   strcat(numb,"00");
 
 
 
       printf("\n Date format       :'%s'",date);
       printf("\n Time format       :'%s'",time);
       printf("\n Number format     :'%s'",numb);
  }
  printf("\n\nPress any key...");
  getch();
 
}
 

 
 
 
Добавлено
Ой шото форум ВАШ проглючил

Всего записей: 131 | Зарегистр. 08-06-2003 | Отправлено: 23:14 11-10-2004
GreyGendalf

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да это не форум, это copy&paste виноват.

----------
hi

Всего записей: 272 | Зарегистр. 06-01-2003 | Отправлено: 16:38 14-10-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Прервания DOS


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru