Форум программистов, компьютерный форум CyberForum.ru

ошибка при компиляции программы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
02.09.2012, 14:55     ошибка при компиляции программы #1
доброго времени суток.
задали задание.
составить программу показывающую содержимое загрузочной записи для указанного логического диска.
Нашел в интернете решение уже готовый код но он не компилируется выдает ошибки подскажите что не так? Как исправить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#pragma argsused
#include <stdio.h>
#include <malloc.h>
#include <dos.h>
#include "sysp.h"
 
void main(void) {
 
  BOOT _far *BOOT_rec;// на этой строчке выдает ошибку [BCC32 Error] File5.cpp(17): E2108 Improper use of typedef 'BOOT'
  int i, status;
  char drive;
  printf("n"
                        "nЧтение загрузочной записи"
                        "nлогического диска"
                        "n");
// Заказываем буфер для чтения BOOT-записи.
  boot_rec = _fmalloc(sizeof(*boot_rec));
 
// Запрашиваем диск, для которого необходимо
// выполнить чтение загрузочной записи.
  printf("n"
                        "nВведите обозначение диска, для просмотра"
                        "nзагрузочной записи (A, B, ...):");
 
  drive = getche();
 
// Вычисляем номер дисковода
 drive = toupper(drive) - 'A';
 
// Читаем загрузочную запись в буфер
 status = getboot((BOOT _far*)boot_rec, drive);
 
// Если произошла ошибка (например, неправильно указано
// обозначение диска), завершаем работу программы
  if(status) {
                printf("nОшибка при чтении BOOT-сектора");
                exit(-1);
  }
 printf("nСодержимое BOOT-сектора для диска %c",drive+'A');
  printf("n"
                        "nOEM - название фирмы и версия DOS - ");
 
 for(i=0;i<8;i++) printf("%c",boot_rec->oem[i]);
 
  printf("nНомер диска                       - %x"
                        "nПризнак расширенной BOOT-записи   - %c"
                        "nСерийный номер диска              - %04X-%04X"
                        "nМетка диска                       - ",
                        (unsigned char)boot_rec->drive,
                        boot_rec->signature,
                        boot_rec->volser_hi,
                        boot_rec->volser_lo);
 
  for(i=0;i<11;i++) printf("%c",boot_rec->label[i]);
 
  printf("nФормат FAT                        - ");
  for(i=0;i<8;i++) printf("%c",boot_rec->fat_format[i]);
 
  printf("nnИнформация из BPB:n");
 
  printf("nКоличество байтов в секторе       - %d"
                "nКоличество секторов в кластере    - %d"
                "nЗарезервировано секторов          - %d"
                "nКоличество копий FAT              - %d"
                "nМакс. количество файлов в корневом каталоге - %d"
                "nОбщее количество секторов на диске          - %d"
                "nБайт-описатель среды              - %x"
                "nКоличество секторов в FAT         - %d",
                boot_rec->bpb.sectsize,
                boot_rec->bpb.clustsize,
                boot_rec->bpb.ressecs,
                boot_rec->bpb.fatcnt,
                boot_rec->bpb.rootsize,
                boot_rec->bpb.totsecs,
                (unsigned char)boot_rec->bpb.media,
                boot_rec->bpb.fatsize);
 
  printf("nnИнформация из расширения BPB:n");
 
  printf("nСекторов на дорожке               - %d"
                "nКоличество головок                - %d"
                "nСкрытых секторов для диска < 32M  - %d"
                "nСкрытых секторов для диска >= 32M - %d"
                "nВсего секторов на диске           - %u",
                boot_rec->bpb.seccnt,
                boot_rec->bpb.headcnt,
                boot_rec->bpb.hiddensec_low,
                boot_rec->bpb.hiddensec_hi,
                boot_rec->bpb.totsecs);
 
// Освобождаем буфер
  _ffree(boot_rec);
-------------------
//содержание заголовчного файла sysp.h
#pragma pack(1)
 
typedef struct _EBPB_ {
        unsigned sectsize;
        char clustsize;
        unsigned ressecs;
        char fatcnt;
        unsigned rootsize;
        unsigned totsecs;
        char media;
        unsigned fatsize;
        unsigned seccnt;
        unsigned headcnt;
        unsigned hiddensec_low;
        unsigned hiddensec_hi;
        unsigned long drvsecs;
} EBPB;
 
 
 
 
typedef struct BOOT_ {
        char jmp[3];
        char oem[8];
        EBPB bpb;
        char drive;
        char reserved;
        char signature;
        unsigned volser_lo;
        unsigned volser_hi;
        char label[11];
        char fat_format[8];
        char boot_code[450];
} BOOT;
#pragma pack()
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2012, 15:05     ошибка при компиляции программы #2
перетащи main() в самый низ файла. структура BOOT еще не видна компилятору в том месте, где ты ее уже хочешь использовать.
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
02.09.2012, 16:55  [ТС]     ошибка при компиляции программы #3
ставмл не помогает, поэтому снова убрал, первую ошибку устранил сам, теперь ошибка на строке

C++
1
2
// Заказываем буфер для чтения BOOT-записи.
  boot_rec = _fmalloc(sizeof(*boot_rec));
ошибка такая [BCC32 Error] File5.cpp(25): E2268 Call to undefined function '_fmalloc'

Добавлено через 1 час 32 минуты
это может быть ошибка как не объявленная функция?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2012, 17:01     ошибка при компиляции программы #4
а что такое boot_rec ? _fmalloc()? где и как что они определены?
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
02.09.2012, 17:06  [ТС]     ошибка при компиляции программы #5
да ка бы я знал, суда б не писал
ну вообще судя по комменту в решебнике
C++
1
*boot_rec;-это указатель на структуру BOOT_
В файле SYSP.H содержится структура для работы с загрузочной записью, описывающая расширенный блок параметров BIOS EBPB и собственно загрузочную запись BOOT:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct BOOT_ {
        char jmp[3];
        char oem[8];
        EBPB bpb;
        char drive;
        char reserved;
        char signature;
        unsigned volser_lo;
        unsigned volser_hi;
        char label[11];
        char fat_format[8];
        char boot_code[450];
} BOOT;
#pragma pack()
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.09.2012, 22:39     ошибка при компиляции программы #6
Цитата Сообщение от lexflax Посмотреть сообщение
status = getboot((BOOT _far*)boot_rec, drive);
Что за getboot() ?

Добавлено через 51 минуту
Осталось разобраться с getboot().
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <conio.h> // для getch().
#include <stdio.h>
#include <malloc.h>
#include <dos.h>
#include <cctype>
#include <iostream>
 
typedef struct _EBPB_ {
        unsigned sectsize;
        char clustsize;
        unsigned ressecs;
        char fatcnt;
        unsigned rootsize;
        unsigned totsecs;
        char media;
        unsigned fatsize;
        unsigned seccnt;
        unsigned headcnt;
        unsigned hiddensec_low;
        unsigned hiddensec_hi;
        unsigned long drvsecs;
} EBPB;
 
 
typedef struct BOOT_ {
        char jmp[3];
        char oem[8];
        EBPB bpb;
        char drive;
        char reserved;
        char signature;
        unsigned volser_lo;
        unsigned volser_hi;
        char label[11];
        char fat_format[8];
        char boot_code[450];
} BOOT;
 
int main() 
{
 
  BOOT *boot_rec;
  int i, status;
  char drive;
  printf("n"
                        "nЧтение загрузочной записи"
                        "nлогического диска"
                        "n");
// Заказываем буфер для чтения BOOT-записи.
  boot_rec = (BOOT*)malloc(sizeof(*boot_rec));
 
// Запрашиваем диск, для которого необходимо
// выполнить чтение загрузочной записи.
  printf("n"
                        "nВведите обозначение диска, для просмотра"
                        "nзагрузочной записи (A, B, ...):");
 
  drive = _getch();
 
// Вычисляем номер дисковода
 drive = toupper(drive) - 'A';
 
// Читаем загрузочную запись в буфер
 status = getboot((BOOT*)boot_rec, drive);
 
// Если произошла ошибка (например, неправильно указано
// обозначение диска), завершаем работу программы
  if(status) 
  {
        printf("nОшибка при чтении BOOT-сектора");
        exit(-1);
  }
 printf("nСодержимое BOOT-сектора для диска %c", drive+'A');
 printf("n"
                        "nOEM - название фирмы и версия DOS - ");
 
 for (i = 0; i < 8; i++) printf("%c", boot_rec->oem[i]);
 
  printf("nНомер диска                       - %x"
                        "nПризнак расширенной BOOT-записи   - %c"
                        "nСерийный номер диска              - %04X-%04X"
                        "nМетка диска                       - ",
                        (unsigned char)boot_rec->drive,
                        boot_rec->signature,
                        boot_rec->volser_hi,
                        boot_rec->volser_lo);
 
  for (i = 0; i < 11; i++) printf("%c", boot_rec->label[i]);
 
  printf("nФормат FAT                        - ");
  for (i = 0; i < 8; i++) printf("%c", boot_rec->fat_format[i]);
 
  printf("nnИнформация из BPB:n");
 
  printf("nКоличество байтов в секторе       - %d"
                "nКоличество секторов в кластере    - %d"
                "nЗарезервировано секторов          - %d"
                "nКоличество копий FAT              - %d"
                "nМакс. количество файлов в корневом каталоге - %d"
                "nОбщее количество секторов на диске          - %d"
                "nБайт-описатель среды              - %x"
                "nКоличество секторов в FAT         - %d",
                boot_rec->bpb.sectsize,
                boot_rec->bpb.clustsize,
                boot_rec->bpb.ressecs,
                boot_rec->bpb.fatcnt,
                boot_rec->bpb.rootsize,
                boot_rec->bpb.totsecs,
                (unsigned char)boot_rec->bpb.media,
                boot_rec->bpb.fatsize);
 
  printf("nnИнформация из расширения BPB:n");
 
  printf("nСекторов на дорожке               - %d"
                "nКоличество головок                - %d"
                "nСкрытых секторов для диска < 32M  - %d"
                "nСкрытых секторов для диска >= 32M - %d"
                "nВсего секторов на диске           - %u",
                boot_rec->bpb.seccnt,
                boot_rec->bpb.headcnt,
                boot_rec->bpb.hiddensec_low,
                boot_rec->bpb.hiddensec_hi,
                boot_rec->bpb.totsecs);
 
// Освобождаем буфер
  free(boot_rec);
  
  system("pause");
  return 0;
}
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
03.09.2012, 07:42  [ТС]     ошибка при компиляции программы #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Что за getboot() ?
ну судя по коменту
C++
1
2
// Читаем загрузочную запись в буфер
 status = getboot((BOOT _far*)boot_rec, drive);
есть еще такая формулировка на сайте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*.Name      getboot
*
*.Title     Считать загрузочную запись
*
*.Descr     Функция считывает загрузочную запись
*           для указанного НМД.
*
*.Params    int getmboot(BOOT _far *boot, int drive);
*
*           boot        - указатель на буфер, в который
*                         будет считана загрузочная
*                         запись
*
*           drive       - номер физического НМД
*                         (0 - первый НМД, 1 - второй,...)
*
*.Return    0 - если загрузочная запись считана
*               успешно;
*           1 - произошла ошибка
**/
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
03.09.2012, 11:22     ошибка при компиляции программы #8
Замени _fmalloc на malloc.
boot_rec и BOOT_rec - это одно и то же в твоем коде?

Видно что программа DOS-овская... Какой у тебя компилятор?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 17:05     ошибка при компиляции программы #9
Цитата Сообщение от lexflax Посмотреть сообщение
есть еще такая формулировка на сайте
Там ещё есть и код функции есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int getboot(BOOT *boot, int drive)
{
  cb.first_sect = 0;
  cb.nsect = 1;
  cb.buf = (void*)boot;
  
  _BX  = FP_OFF(&cb);
  _DS = FP_SEG(&cb);
  _CX  = 0xffff;
  _DX  = 0;
  _AX  = drive;
  
  asm int 25h
 
  // Извлекаем из стека оставшееся там после
  // вызова прерывания слово
  asm pop ax
  asm jc err
 
  return(0);
err:
  return(1);
}
Тут, как я понимаю, часть кода не ассемблере. Как правильно его вставить, я не знаю. Если написать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int getboot(BOOT *boot, int drive)
{
  cb.first_sect = 0;
  cb.nsect = 1;
  cb.buf = (void*)boot;
  _asm
  {
  
  _BX  = FP_OFF(&cb);
  _DS = FP_SEG(&cb);
  _CX  = 0xffff;
  _DX  = 0;
  _AX  = drive;
  
  int 25h
 
  // Извлекаем из стека оставшееся там после
  // вызова прерывания слово
  pop ax
  jc err
  }
  return(0);
err:
  return(1);
}
то компилятор выдаёт, в строчках, где идёт присвоение _BX - _AX: " синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции". Да, ещё перед функцией нужно ещё эту структуру добавить:
C++
1
2
3
4
5
6
struct
{
  unsigned long first_sect;
  unsigned nsect;
  void *buf;
} cb;
Добавлено через 3 часа 2 минуты
Поспрашивал на форуме. Если даже получится такую прогу написать, то ОС работать ей не даст. Привелегии, для такого доступа к жёсткому диска, у пользовательского приложения недостаточны.

Добавлено через 50 минут
И компилировать такую прогу нужно DOS-компилятором (так пишут на форуме).
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
03.09.2012, 20:05  [ТС]     ошибка при компиляции программы #10
а есть дос компиляторы для с++?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 20:56     ошибка при компиляции программы #11
Здесь я тему открыл. Почитайте. Как правильно вставить код на ассемблере?
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
04.09.2012, 06:59  [ТС]     ошибка при компиляции программы #12
ну я удалил кое что из проги она откомпилировалась но результата нету везде в значениях выдает ноль
толи от того что доступа нету к диску разрешения толи от того что сама программа написана не правильно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <conio.h> // для getch().
#include <stdio.h>
#include <malloc.h>
#include <dos.h>
#include <cctype>
#include <iostream>
 
typedef struct _EBPB_ {
        unsigned sectsize;
        char clustsize;
        unsigned ressecs;
        char fatcnt;
        unsigned rootsize;
        unsigned totsecs;
        char media;
        unsigned fatsize;
        unsigned seccnt;
        unsigned headcnt;
        unsigned hiddensec_low;
        unsigned hiddensec_hi;
        unsigned long drvsecs;
} EBPB;
 
 
typedef struct BOOT_ {
        char jmp[3];
        char oem[8];
        EBPB bpb;
        char drive;
        char reserved;
        char signature;
        unsigned volser_lo;
        unsigned volser_hi;
        char label[11];
        char fat_format[8];
        char boot_code[450];
} BOOT;
 
int main()
{
 
  BOOT *boot_rec;
  int i, status;
  char drive;
  printf("\n"
                        "\n""chetenie zagruzochnoi zapisi"
                        "\n""nlogicheskogo diska"
                        "\n");
// Заказываем буфер для чтения BOOT-записи.
  boot_rec = (BOOT*)malloc(sizeof(*boot_rec));
 
// Запрашиваем диск, для которого необходимо
// выполнить чтение загрузочной записи.
  printf("n"
                        "\n" "Vvedite oboznachenie diska, dla prosmotra"
                        "\n""zagruzochnoi zapici (A, B, ...):");
 
  drive = _getch();
 
// Вычисляем номер дисковода
 drive = toupper(drive) - 'A';
 
// Читаем загрузочную запись в буфер
 
 
// Если произошла ошибка (например, неправильно указано
// обозначение диска), завершаем работу программы
 
 printf("\n"" Sodergimoe BOOT-sektora dla diska %c", drive+'A');
 printf("\n"
                        "\n""OEM - Nazvanie hirmi i versia DOS - ");
 
 for (i = 0; i < 8; i++) printf("%c", boot_rec->oem[i]);
 
  printf("\n""nomer diska                      - %x"
                        "\n""Priznak razhirinoi BOOT-zapici   - %c"
                        "\n""Seriinii nomer diska              - %04X-%04X"
                        "\n""Metka diska                       - ",
                        (unsigned char)boot_rec->drive,
                        boot_rec->signature,
                        boot_rec->volser_hi,
                        boot_rec->volser_lo);
 
  for (i = 0; i < 11; i++) printf("%c", boot_rec->label[i]);
 
  printf("\n""Format FAT                        - ");
  for (i = 0; i < 8; i++) printf("%c", boot_rec->fat_format[i]);
 
  printf("\n""informacia iz BPB:n");
 
  printf("\n""Kolichestvo baitov v sektore       - %d"
                "\n""Kolichestvo sektorov v klastere    - %d"
                "\n""Zarezervirovanno sektorov          - %d"
                "\n""Kolichestvo kopui FAT              - %d"
                "\n"" Maks. kolichestvo failov v kornevom kataloge - %d"
                "\n"" Obhee kolichestvo sektorov na diske          - %d"
                "\n""Bait-opisatel sredi              - %x"
                "\n""Kolichestvo sektorov v FAT         - %d",
                boot_rec->bpb.sectsize,
                boot_rec->bpb.clustsize,
                boot_rec->bpb.ressecs,
                boot_rec->bpb.fatcnt,
                boot_rec->bpb.rootsize,
                boot_rec->bpb.totsecs,
                (unsigned char)boot_rec->bpb.media,
                boot_rec->bpb.fatsize);
 
  printf("\n""Informachia iz razchirenia BPB:n");
 
  printf("\n""Sektorov na dorogke               - %d"
                "\n""Kolichestvo golovok                - %d"
                "\n""Skritih sektorov dla diska < 32M  - %d"
                "\n""Skritih sektorov dla diska >= 32M - %d"
                "\n""Vsego sektorov na diske           - %u",
                boot_rec->bpb.seccnt,
                boot_rec->bpb.headcnt,
                boot_rec->bpb.hiddensec_low,
                boot_rec->bpb.hiddensec_hi,
                boot_rec->bpb.totsecs);
 
// Освобождаем буфер
  free(boot_rec);
 
  system("pause");
  return 0;
}
Миниатюры
ошибка при компиляции программы  
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 12:40     ошибка при компиляции программы #13
Есть компиляторы языка С++ под DOS.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2012, 13:36     ошибка при компиляции программы
Еще ссылки по теме:

C++ Ошибки при компиляции программы
Ошибка при компиляции программы C++
C++ Ошибка компиляции модульной программы ввода вывода

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.09.2012, 13:36     ошибка при компиляции программы #14
Цитата Сообщение от lexflax Посмотреть сообщение
ну я удалил кое что из проги она откомпилировалась
Потому и откомпилировалась. Функции чтения загрузочной записи нет, и что тогда вы хотите получить в результате? Вся проблема именно в этой функции. Тот код, который я в теме, приведённой выше, выложил в конце, компилируется и с этой функцией, но работать ему ОС не даёт. Насколько я понял, он может работать только в DOS, реальной или виртульной.
Yandex
Объявления
04.09.2012, 13:36     ошибка при компиляции программы
Ответ Создать тему
Опции темы

Текущее время: 08:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru