Автор Тема: Организация управления ресурсами в ОС bat+cpp (помогите)  (Прочитано 3124 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Silver_Shadow

  • Пользователь
  • Сообщений: 2764
  • Пол: Мужской
  • Ниндзя-гопник
    • Steam
    • Youtube
    • Просмотр профиля
Короче проблема у меня возникла в процессе одной работы по предмету Операционые системы. На форумах программистов молчат. Может тут есть мегапрограммисты и подскажет? =)
Вот текст самой проблемы

Вообще есть почти готовая программа, но в ней есть ошибки не пойму как и где исправлять.

по заданию

Создать 3 программы
1 - C-программу организующую меню на экране состаящее из пунктов, файл должен иметь имя MenuN.cpp
атрибуты для построения окна и тексты пунктов считать из данных AtribN.txt который должен быть предварительно создан
Номер выбраного пункта записать в новый файл данных OtvN.txt
Файл MenuN должен вызываться с указанием аргумента имени файла атрибутов окна AtribN.txt

2 С-программу выполняющий действия указанные в задании ProgN.cpp
ProgN.cpp должен содержать проверку аргументов в строке вызова
Вывести все результаты вычислений на экран и в файл на диск ResN.dat

3 Командный файл содержащий команды, позволяющие создать интерфейс при организации диалогового меню CmN.bat. Использовать в нем вызовы файлов MenuN и ProgN

Вот мое индивидуальное задание

Menu.cpp
окно вывесте в центре правого края экрана обрамленое символами "+" содержащие пункты меню:
- Наличие монохромного адаптера
- Изменить номер байта в секторе

Выход из меню завершить клавишей ->

Prog.cpp
В зависимости от номера пункта меню указаного в качестве параметра при вызове Prog.exe проверяет наличие монохромного видеоадаптера или изменяет указанный байт в указаном секторе
Если видеоадаптер имеется то завершить программу с кодом 0 иначе с кодом -1
Если указаный байт изменился, то завершить программу с кодом 1, иначе с кодом 0

cm.bat
Вызвать файл cm.bat c одним параметром res.dat
Установить цвет экрана -белый, цвет символов красный. Вывести текущую дату
Проанализировать код завершения: если он равен -1, то содержимое файла res.dat объеденить с содержимым файла otv.txt и сделать копию объединеного файла на диск A в текущий каталог, проверив предварительно, существует ли такой каталог, написав соответствующие команды, а при отсутствии такого создать
если он равен 1, то удалить файл atrib.txt иначе вывести содержимое текущих каталогов дисков на экран

Теперь коды программ
Atrib6.txt
40
10
79
20

Menu.cpp
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main(int argc,char *argv[])
{
clrscr();
int x,y,x1,y1,x2,y2,c,n;
FILE*f,*f1;
if(!(f=fopen(argv[1],"r+"))) {perror("The file not found"); exit(-1);}
fscanf(f,"%d",&x1);
fscanf(f,"%d",&y1);
fscanf(f,"%d",&x2);
fscanf(f,"%d",&y2);
for (x=x1,y=y1;x<=x2;x++)
{gotoxy(x,y);
printf("+");
}
for(x=x1,y=y1;y<=y2;y++)
{gotoxy(x,y);
printf("+");}
for(x=x1,y=y2;x<=x2;x++)
{gotoxy(x,y);
printf("+");}
for(x=x2,y=y1;y<=y2;y++)
{gotoxy(x,y);
printf("+");
}
gotoxy(42,12);
printf("1.Search monochrome videoadapter");
gotoxy(42,16);
printf("2.Number of bytes in sector");
scanf("%d",&n);
f1=fopen("Otv6.txt","w+");
fprintf(f1,"%d",n);
fclose(f);
fclose(f1);
c=getchar();
if(c=='1')
exit(1);
else
exit(0);
}


Prog6.cpp
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<iostream.h>
#include<dos.h>
#include<bios.h>
int main(int argc,char *argv[])
{int sectsize,x,a,n;
unsigned char buf[512],b[512];
FILE *i,*in;
if (argc<2) {fprintf(stderr,"net parametrov"); exit(2);}
i=fopen("Otv6.txt","r+");
in=fopen("Res6.dat","w+");
fscanf(i,"%d",&n); fclose(i);
if(n==1)
{a=peek (5, 0x0410);
if(a==1)
      { printf(" \n there is monochrome videoadapter :\n");
      fprintf(in," \n there is monochrome videoadapter :\n");
      exit (0);}
    else  printf(" \n monochrome videoadapter not found :\n");
   fprintf(in," \n monochrome videoadapter not found :\n");
    exit(-1);}
if (n==2)
{x=1;
absread(x,1,0,buf);
sectsize =buf[0xb]+buf[0xc]*256;
cout<<"\n number of bytes in sector  "<<sectsize;
fprintf(in,"\n number of bytes in sector %d",sectsize);
fclose(in);
if(sectsize<2)
exit(0);
else
exit(1);
getch();}
}


cm6.bat
echo off
Menu6 Atrib6.txt
Prog6 OTV6.txt
color 74
date
if errorlevel -1 goto b
if errorlevel 1 goto c
dir A:\
goto end
:b
copy %1 + OTV6.txt nik.txt
copy nik.txt A:\FL\
goto end
:c
del Atrib6.txt
goto end
:end


Вообщем при запуске bat-файла появляется меню с двумя опциями 1 Поиск монохр адпт. 2 Сколько байтов в секторе. Поиск Монохромного адапптера проходит нормально, а вот когда я нажимаю 2-ю опцию на количество байт в секторе, программа не реагиарует, а пропускает и показывает сразу текущую дату.Проблема в том что не работает вторая опция меню.
Может проблема в связи между cm6.bat и prog6.exe или ошибка в самом prog6? Вообщем не показывает он кол-во cекторов.
Вот картинка я нажал на опцию 2 и секторов не показало


Еще не понимаю как сделать
Цитата
- Изменить номер байта в секторе
знаю как посчитать кол-во, может кто знает каким образом выглядит код на изменение номер байта в секторе и что это такое?

Цитата
Выход из меню завершить клавишей ->
Каким образом это засунуть в код? В методичке так написано, но какую клавишу имено ставить? И как это написать в код?

Добавлено позже:
Вообщем как я посмотрел связь c Prog6.exe с cm6.bat есть
только вот после строчки поиска монохромного адаптера, у кода вероятно ошибка где то здесь у Prog6.exe

if (n==2)
{x=1;
absread(x,1,0,buf);
sectsize =buf[0xb]+buf[0xc]*256;
cout<<"\n number of bytes in sector  "<<sectsize;
fprintf(in,"\n number of bytes in sector %d",sectsize);
fclose(in);
if(sectsize<2)
exit(0);
else
exit(1);
getch();}
}


Сама программа работает, проверял отдельно prog6.cpp, количество байт в секторе пишет без проблем. Проблема со связью в меню, не хочет он показывать кол-во байт в секторе