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

Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.77
mrtherains
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
05.09.2013, 09:51     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #1
Изучаю C++ по книге Р. Лафоре. Дошёл до 5-ой главы, и мне встретился пример использования консольной графики. Страница 179. Пример называется "Структура circle". К этому примеру прилагается библиотека "msoftcon.h". Ну пример я переписал, библиотеку подключил и в папку с .cpp файлом положил. Работаю в DevC++. И после компилирования выскакивает несколько ошибок:
  • [Linker error] undefined reference to `set_color(color, color)'
  • [Linker error] undefined reference to `set_fill_style(fstyle)'
  • [Linker error] undefined reference to `draw_circle(int, int, int)'
  • [Linker error] undefined reference to `init_graphics()'
  • [Linker error] undefined reference to `set_cursor_pos(int, int)'
  • ld returned 1 exit status


И вот не знаю что делать. В чём ,собственно говоря, проблема? Заранее спасибо всем кто откликнется.

Вот код самого примера:
Пример

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
  /*Р. Лафоре. ООП в C++*/
/*Глава 5. Функции.*/
 
#include "msoftcon.h"
 
/////////////////////////////////////////////////
struct circle
{
      int xCo,yCo;      //Координаты центра.
      int radius;
      color fillcolor;  //цвет
      fstyle fillstyle; //стиль заполнения
      
      };
////////////////////////////////////////////////
void circ_draw(circle c)
{
     set_color(c.fillcolor);
     set_fill_style(c.fillstyle);
     draw_circle(c.xCo,c.yCo,c.radius);
     }
////////////////////////////////////////////////
int main()
{
    
    init_graphics(); //инициализация графики
    
    //создание кругов
    
    circle c1 = {15,7,5,cBLUE,X_FILL};
    circle c2 = {41,12,7,cRED,O_FILL};
    circle c3 = {65,18,4,cGREEN,MEDIUM_FILL};
    
    circ_draw(c1);
    circ_draw(c2);
    circ_draw(c3);
    
    set_cursor_pos(1,25);
    
    return 0;
    }


А вот код который находится в "msoftcon.h":

msoftcon.h

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
  //msoftcon.h
//Объявления функций консольной графики от Lafore
//используются консольные функции Windows 
 
#ifndef _INC_WCONSOLE    //этот файл не должен включаться
#define _INC_WCONSOLE    //дважды в тот же исходный файл
 
#include <windows.h>     //для консольных функций Windows
#include <conio.h>       //для kbhit(), getche()
#include <math.h>        //для sin, cos
 
enum fstyle { SOLID_FILL, X_FILL,      O_FILL, 
              LIGHT_FILL, MEDIUM_FILL, DARK_FILL };
 
enum color {
   cBLACK=0,     cDARK_BLUE=1,  cDARK_GREEN=2, DARK_CYAN=3, 
   cDARK_RED=4,  cDARK_MAGENTA=5, cBROWN=6,  cLIGHT_GRAY=7,
   cDARK_GRAY=8, cBLUE=9,         cGREEN=10,     cCYAN=11, 
   cRED=12,      cMAGENTA=13,     cYELLOW=14,    cWHITE=15 };
//---------------------------------------------------------
void init_graphics();
void set_color(color fg, color bg = cBLACK);
void set_cursor_pos(int x, int y);
void clear_screen();
void wait(int milliseconds);
void clear_line();
void draw_rectangle(int left, int top, int right, int bottom);                    
void draw_circle(int x, int y, int rad);
void draw_line(int x1, int y1, int x2, int y2);
void draw_pyramid(int x1, int y1, int height);
void set_fill_style(fstyle);
#endif /* _INC_WCONSOLE */
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 09:51     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой
Посмотрите здесь:

Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. C++
C++ Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
C++ Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
Задача из "ООП в C++" Р. Лафоре C++
Код из "Р.Лафоре. ООП в С++" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
05.09.2013, 10:02     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #2
А реализация msoftcon.h?
mrtherains
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
05.09.2013, 10:20  [ТС]     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #3
Цитата Сообщение от Бендерродригез Посмотреть сообщение
А реализация msoftcon.h?
То есть? Не понял вопроса.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
05.09.2013, 10:31     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #4
Цитата Сообщение от mrtherains Посмотреть сообщение
То есть? Не понял вопроса.
Прототипы функций есть. А где их описание? Компилятор не экстрасенс, он по прототипу и названию тебе реализацию функции из воздуха не сотворит.
Un_artist
0 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 7
05.09.2013, 10:44     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #5
Цитата Сообщение от mrtherains Посмотреть сообщение
библиотеку подключил и в папку с .cpp файлом положил.
Теперь положите ещё прилагаемый msoftcon.cpp - и все запустится.
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
05.09.2013, 12:01     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #6
на VS2012 у меня он ругался на ошибки в msoftcon, на тот момент мне не хватало знаний что бы разобраться, я в конечном итоге пропустил этот пример чего и вам советую. Это просто второй пример на туже тему если разобрался с первым этот можно пропустить
mrtherains
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
05.09.2013, 19:45  [ТС]     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #7
Цитата Сообщение от Un_artist Посмотреть сообщение
Теперь положите ещё прилагаемый msoftcon.cpp - и все запустится.
Положил, но ошибки всё те же, к сожалению.

Добавлено через 54 секунды
Цитата Сообщение от Бендерродригез Посмотреть сообщение
Прототипы функций есть. А где их описание? Компилятор не экстрасенс, он по прототипу и названию тебе реализацию функции из воздуха не сотворит.
Там есть файл "msoftcon.cpp", его стоит подключить к проекту, или достаточно в папку пихнуть?

Добавлено через 4 минуты
Цитата Сообщение от reisal78 Посмотреть сообщение
на VS2012 у меня он ругался на ошибки в msoftcon, на тот момент мне не хватало знаний что бы разобраться, я в конечном итоге пропустил этот пример чего и вам советую. Это просто второй пример на туже тему если разобрался с первым этот можно пропустить
Надеюсь я ничего интересного не пропущу. А ошибок и действительно много вылезло...
MacInsider
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
06.09.2013, 00:20     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #8
Во-первых создайте пустой проект с++
Во-вторых добавьте заголовочный файл - msoftcon.h
в-третьих добавьте файл с кодом - msoftcon.сpp
в-четвертых добавьте главный файл, тот что написан в книге Лафоре.
Все должно получится.
Если не получится, напишите здесь, я Вам кину целый проект.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 01:03     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #9
Цитата Сообщение от mrtherains Посмотреть сообщение
Там есть файл "msoftcon.cpp", его стоит подключить к проекту
Стоит.
mrtherains
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 08:28  [ТС]     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #10
Цитата Сообщение от MacInsider Посмотреть сообщение
Во-первых создайте пустой проект с++
Во-вторых добавьте заголовочный файл - msoftcon.h
в-третьих добавьте файл с кодом - msoftcon.сpp
в-четвертых добавьте главный файл, тот что написан в книге Лафоре.
Все должно получится.
Если не получится, напишите здесь, я Вам кину целый проект.
Сделал, получилось в принципе, но компилятор указывает на ошибки в файле "msoftcon.cpp". Если не сложно, то можете скинуть проект?
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
06.09.2013, 08:40     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #11
думаю это не поможет, я честно говоря уже с трудом вспоминаю какие именно ошибки у меня выскакивали, но я практически уверен, что если Вы попытаетесь скомпилировать "это безобразие" в более ранних версиях VS, то ошибок не будет... не забывайте что эта книга начала 2000 годов, и этот файл создан в тоже время...А за 10 лет кое что все же поменялось )
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 08:49     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #12
Цитата Сообщение от mrtherains Посмотреть сообщение
Сделал, получилось в принципе, но компилятор указывает на ошибки в файле "msoftcon.cpp"
Файл покажите.
MacInsider
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
06.09.2013, 09:24     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #13
я сегодня после учебы приду и скину.
mrtherains
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 09:29  [ТС]     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Файл покажите.
Вот код из файла "msoftcon.cpp".
Ошибка выскакивает на операторе "cputs".
Вот
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
  // msoftcon.cpp
// подпрограммы доступа к консольным функциям Windows 
 
// компилятор должен знать, где искать этот файл
// в MCV++, /Tools/Options/Directories/Include/type путь
 
#include "msoftcon.h"
HANDLE hConsole;         // поддержка консольного режима 
char fill_char;          // символ заполнения
//---------------------------------------------------------
void init_graphics()
   {
   COORD console_size = { 80, 25 };
   // открыть канал ввода/вывода на консоль
   hConsole = CreateFile("CONOUT$", GENERIC_WRITE | GENERIC_READ,
                   FILE_SHARE_READ | FILE_SHARE_WRITE,
                   0L, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0L);
   // установить размер экрана 80x25 
   SetConsoleScreenBufferSize(hConsole, console_size);
   // текст белым по черному 
   SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 15));
 
   fill_char = '\xDB';  // заполнение по умолчанию
   clear_screen();
   }
//---------------------------------------------------------
void set_color(color foreground, color background)
   {
   SetConsoleTextAttribute(hConsole, 
                        (WORD)((background << 4) | foreground));
   }  // конец setcolor()
 
/* 0  Черный          8  Темно-серый
   1  Темно-синий     9  Синий
   2  Темно-зеленый   10 Зеленый
   3  Темно-голубой   11 Алый
   4  Темно-красный   12 красный
   5  Темно-алый      13 алый
   6  Коричневый      14 Желтый
   7  Светло-серый    15 Белый
   */
//---------------------------------------------------------
void set_cursor_pos(int x, int y)
{
    COORD cursor_pos;            // Начало в верхнем левом 
    cursor_pos.X = x - 1;        // Windows начинает с (0, 0)
    cursor_pos.Y = y - 1;        // мы начнем с (1, 1)
    SetConsoleCursorPosition(hConsole, cursor_pos);
}
//---------------------------------------------------------
void clear_screen()
{
    set_cursor_pos(1, 25);
    for(int j = 0; j < 25; j++)
        putch('\n');
    set_cursor_pos(1, 1);
}
//---------------------------------------------------------
void wait(int milliseconds)
{
    Sleep(milliseconds);
}
//---------------------------------------------------------
void clear_line()                 // очистка до конца строки
{                              // 80 пробелов
    // .....1234567890123456789012345678901234567890
    // .....0........1.........2.........3.........4 
    cputs("                                        ");
    cputs("                                        ");
}
//---------------------------------------------------------
void draw_rectangle(int left, int top, int right, int bottom) 
{
    char temp[80];
    int width = right - left + 1;
 
    for(int j = 0; j < width; j++)      // строка квадратов
        temp[j] = fill_char;   
    temp[j] = 0;                        // null
 
    for(int y = top; y <= bottom; y++)  // строковый стек 
    {
        set_cursor_pos(left, y);
        cputs(temp);
    }
}
//---------------------------------------------------------
void draw_circle(int xC, int yC, int radius)
{
    double  theta, increment, xF, pi = 3.14159;
    int x, xN, yN;
 
    increment = 0.8 / static_cast<double>(radius);
    for(theta = 0; theta <= pi / 2; theta += increment)//1/4 
                                                       // окружности
    {
        xF = radius * cos(theta);  
        xN = static_cast<int>(xF * 2 / 1); // пикселы не
                                           // квадратные :-(
        yN = static_cast<int>(radius * sin(theta) + 0.5);
        x = xC - xN;
        while(x <= xC + xN) // заполнить две горизонтальные линии
        {                   // по одной на каждую ? окружности
            set_cursor_pos(x, yC - yN); putch(fill_char);   // верх
            set_cursor_pos(x++, yC + yN); putch(fill_char); // низ
        }
    }  // конец for
}
//---------------------------------------------------------
void draw_line(int x1, int y1, int x2, int y2)
{
 
    int w, z, t, w1, w2, z1, z2;
    double  xDelta = x1 - x2, yDelta = y1 - y2, slope;
    bool isMoreHoriz;
 
    if(fabs(xDelta) > fabs(yDelta)) // еще горизонтальная
    {
        isMoreHoriz = true;
        slope = yDelta / xDelta;
        w1 = x1; z1 = y1; w2 = x2, z2 = y2; // w = x, z = y 
    }
    else                            // еще вертикальная
    {
        isMoreHoriz = false;
        slope = xDelta / yDelta;
        w1 = y1; z1 = x1; w2 = y2, z2 = x2; // w = y, z = x
    }
 
    if(w1 > w2)                     // если за w
    {
        t = w1; w1 = w2; w2 = t;    // заменить (w1, z1)
        t = z1; z1 = z2; z2 = t;    // на (w2, z2)
    }
    for(w = w1; w <= w2; w++)            
    {
        z = static_cast<int>(z1 + slope * (w - w1));
        if(!(w == 80 && z == 25))  // убрать прокрутку на 80, 25
        {
            if(isMoreHoriz)
                set_cursor_pos(w, z);
            else
                set_cursor_pos(z, w);
            putch(fill_char);
        }
    }
}
//---------------------------------------------------------
void draw_pyramid(int x1, int y1, int height)
{
    int x, y;
    for(y = y1; y < y1 + height; y++)
    {
        int incr = y - y1;
        for(x = x1 - incr; x <= x1 + incr; x++)
        {
            set_cursor_pos(x, y);
            putch(fill_char);
        }
    }
}
//---------------------------------------------------------
void set_fill_style(fstyle fs)
{
    switch(fs)
    {
    case SOLID_FILL:  fill_char = '\xDB'; break;
    case DARK_FILL:   fill_char = '\xB0'; break;
    case MEDIUM_FILL: fill_char = '\xB1'; break;
    case LIGHT_FILL:  fill_char = '\xB2'; break;
    case X_FILL:      fill_char = 'X';    break;
    case O_FILL:      fill_char = 'O';    break;
    }
}
//---------------------------------------------------------
mrtherains
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 09:30  [ТС]     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #15
Цитата Сообщение от MacInsider Посмотреть сообщение
я сегодня после учебы приду и скину.
Спасибо, жду.
mrtherains
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 09:32  [ТС]     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #16
Цитата Сообщение от reisal78 Посмотреть сообщение
думаю это не поможет, я честно говоря уже с трудом вспоминаю какие именно ошибки у меня выскакивали, но я практически уверен, что если Вы попытаетесь скомпилировать "это безобразие" в более ранних версиях VS, то ошибок не будет... не забывайте что эта книга начала 2000 годов, и этот файл создан в тоже время...А за 10 лет кое что все же поменялось )
Что же, попробую поискать какой нибудь допотопный VSC++.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 09:32     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #17
Я вот с этой темы скачал, и одну букву только убрал в файле (в 2010 студии делал): Трудность с компиляцией классов
Миниатюры
Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 09:44     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #18
Цитата Сообщение от mrtherains Посмотреть сообщение
Ошибка выскакивает на операторе "cputs".
Разве там ошибка? В студии просто предупреждения на cputs и putch, на это можно не обращать внимание (или заменить на _cputs и _putch). Но ошибка там одна есть. Вот с исправлением:
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
 // msoftcon.cpp
// подпрограммы доступа к консольным функциям Windows 
 
// компилятор должен знать, где искать этот файл
// в MCV++, /Tools/Options/Directories/Include/type путь
 
#include "msoftcon.h"
HANDLE hConsole;         // поддержка консольного режима 
char fill_char;          // символ заполнения
//---------------------------------------------------------
void init_graphics()
   {
   COORD console_size = { 80, 25 };
   // открыть канал ввода/вывода на консоль
   hConsole = CreateFile("CONOUT$", GENERIC_WRITE | GENERIC_READ,
                   FILE_SHARE_READ | FILE_SHARE_WRITE,
                   0L, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0L);
   // установить размер экрана 80x25 
   SetConsoleScreenBufferSize(hConsole, console_size);
   // текст белым по черному 
   SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 15));
 
   fill_char = '\xDB';  // заполнение по умолчанию
   clear_screen();
   }
//---------------------------------------------------------
void set_color(color foreground, color background)
   {
   SetConsoleTextAttribute(hConsole, 
                        (WORD)((background << 4) | foreground));
   }  // конец setcolor()
 
/* 0  Черный          8  Темно-серый
   1  Темно-синий     9  Синий
   2  Темно-зеленый   10 Зеленый
   3  Темно-голубой   11 Алый
   4  Темно-красный   12 красный
   5  Темно-алый      13 алый
   6  Коричневый      14 Желтый
   7  Светло-серый    15 Белый
   */
//---------------------------------------------------------
void set_cursor_pos(int x, int y)
{
    COORD cursor_pos;            // Начало в верхнем левом 
    cursor_pos.X = x - 1;        // Windows начинает с (0, 0)
    cursor_pos.Y = y - 1;        // мы начнем с (1, 1)
    SetConsoleCursorPosition(hConsole, cursor_pos);
}
//---------------------------------------------------------
void clear_screen()
{
    set_cursor_pos(1, 25);
    for(int j = 0; j < 25; j++)
        _putch('\n');
    set_cursor_pos(1, 1);
}
//---------------------------------------------------------
void wait(int milliseconds)
{
    Sleep(milliseconds);
}
//---------------------------------------------------------
void clear_line()                 // очистка до конца строки
{                              // 80 пробелов
    // .....1234567890123456789012345678901234567890
    // .....0........1.........2.........3.........4 
    _cputs("                                        ");
    _cputs("                                        ");
}
//---------------------------------------------------------
void draw_rectangle(int left, int top, int right, int bottom) 
{
    char temp[80];
    int width = right - left + 1;
 
    int j;
    for( j = 0; j < width; j++)      // строка квадратов
        temp[j] = fill_char;   
    temp[j] = 0;                        // null
 
    for(int y = top; y <= bottom; y++)  // строковый стек 
    {
        set_cursor_pos(left, y);
        _cputs(temp);
    }
}
//---------------------------------------------------------
void draw_circle(int xC, int yC, int radius)
{
    double  theta, increment, xF, pi = 3.14159;
    int x, xN, yN;
 
    increment = 0.8 / static_cast<double>(radius);
    for(theta = 0; theta <= pi / 2; theta += increment)//1/4 
                                                       // окружности
    {
        xF = radius * cos(theta);  
        xN = static_cast<int>(xF * 2 / 1); // пикселы не
                                           // квадратные :-(
        yN = static_cast<int>(radius * sin(theta) + 0.5);
        x = xC - xN;
        while(x <= xC + xN) // заполнить две горизонтальные линии
        {                   // по одной на каждую ? окружности
            set_cursor_pos(x, yC - yN); _putch(fill_char);   // верх
            set_cursor_pos(x++, yC + yN); _putch(fill_char); // низ
        }
    }  // конец for
}
//---------------------------------------------------------
void draw_line(int x1, int y1, int x2, int y2)
{
 
    int w, z, t, w1, w2, z1, z2;
    double  xDelta = x1 - x2, yDelta = y1 - y2, slope;
    bool isMoreHoriz;
 
    if(fabs(xDelta) > fabs(yDelta)) // еще горизонтальная
    {
        isMoreHoriz = true;
        slope = yDelta / xDelta;
        w1 = x1; z1 = y1; w2 = x2, z2 = y2; // w = x, z = y 
    }
    else                            // еще вертикальная
    {
        isMoreHoriz = false;
        slope = xDelta / yDelta;
        w1 = y1; z1 = x1; w2 = y2, z2 = x2; // w = y, z = x
    }
 
    if(w1 > w2)                     // если за w
    {
        t = w1; w1 = w2; w2 = t;    // заменить (w1, z1)
        t = z1; z1 = z2; z2 = t;    // на (w2, z2)
    }
    for(w = w1; w <= w2; w++)            
    {
        z = static_cast<int>(z1 + slope * (w - w1));
        if(!(w == 80 && z == 25))  // убрать прокрутку на 80, 25
        {
            if(isMoreHoriz)
                set_cursor_pos(w, z);
            else
                set_cursor_pos(z, w);
            _putch(fill_char);
        }
    }
}
//---------------------------------------------------------
void draw_pyramid(int x1, int y1, int height)
{
    int x, y;
    for(y = y1; y < y1 + height; y++)
    {
        int incr = y - y1;
        for(x = x1 - incr; x <= x1 + incr; x++)
        {
            set_cursor_pos(x, y);
            _putch(fill_char);
        }
    }
}
//---------------------------------------------------------
void set_fill_style(fstyle fs)
{
    switch(fs)
    {
    case SOLID_FILL:  fill_char = '\xDB'; break;
    case DARK_FILL:   fill_char = '\xB0'; break;
    case MEDIUM_FILL: fill_char = '\xB1'; break;
    case LIGHT_FILL:  fill_char = '\xB2'; break;
    case X_FILL:      fill_char = 'X';    break;
    case O_FILL:      fill_char = 'O';    break;
    }
}
//---------------------------------------------------------
mrtherains
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 09:55  [ТС]     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #19
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве там ошибка? В студии просто предупреждения на cputs и putch, на это можно не обращать внимание (или заменить на _cputs и _putch). Но ошибка там одна есть. Вот с исправлением:
Кликните здесь для просмотра всего текста
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
 // msoftcon.cpp
// подпрограммы доступа к консольным функциям Windows 
 
// компилятор должен знать, где искать этот файл
// в MCV++, /Tools/Options/Directories/Include/type путь
 
#include "msoftcon.h"
HANDLE hConsole;         // поддержка консольного режима 
char fill_char;          // символ заполнения
//---------------------------------------------------------
void init_graphics()
   {
   COORD console_size = { 80, 25 };
   // открыть канал ввода/вывода на консоль
   hConsole = CreateFile("CONOUT$", GENERIC_WRITE | GENERIC_READ,
                   FILE_SHARE_READ | FILE_SHARE_WRITE,
                   0L, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0L);
   // установить размер экрана 80x25 
   SetConsoleScreenBufferSize(hConsole, console_size);
   // текст белым по черному 
   SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 15));
 
   fill_char = '\xDB';  // заполнение по умолчанию
   clear_screen();
   }
//---------------------------------------------------------
void set_color(color foreground, color background)
   {
   SetConsoleTextAttribute(hConsole, 
                        (WORD)((background << 4) | foreground));
   }  // конец setcolor()
 
/* 0  Черный          8  Темно-серый
   1  Темно-синий     9  Синий
   2  Темно-зеленый   10 Зеленый
   3  Темно-голубой   11 Алый
   4  Темно-красный   12 красный
   5  Темно-алый      13 алый
   6  Коричневый      14 Желтый
   7  Светло-серый    15 Белый
   */
//---------------------------------------------------------
void set_cursor_pos(int x, int y)
{
    COORD cursor_pos;            // Начало в верхнем левом 
    cursor_pos.X = x - 1;        // Windows начинает с (0, 0)
    cursor_pos.Y = y - 1;        // мы начнем с (1, 1)
    SetConsoleCursorPosition(hConsole, cursor_pos);
}
//---------------------------------------------------------
void clear_screen()
{
    set_cursor_pos(1, 25);
    for(int j = 0; j < 25; j++)
        _putch('\n');
    set_cursor_pos(1, 1);
}
//---------------------------------------------------------
void wait(int milliseconds)
{
    Sleep(milliseconds);
}
//---------------------------------------------------------
void clear_line()                 // очистка до конца строки
{                              // 80 пробелов
    // .....1234567890123456789012345678901234567890
    // .....0........1.........2.........3.........4 
    _cputs("                                        ");
    _cputs("                                        ");
}
//---------------------------------------------------------
void draw_rectangle(int left, int top, int right, int bottom) 
{
    char temp[80];
    int width = right - left + 1;
 
    int j;
    for( j = 0; j < width; j++)      // строка квадратов
        temp[j] = fill_char;   
    temp[j] = 0;                        // null
 
    for(int y = top; y <= bottom; y++)  // строковый стек 
    {
        set_cursor_pos(left, y);
        _cputs(temp);
    }
}
//---------------------------------------------------------
void draw_circle(int xC, int yC, int radius)
{
    double  theta, increment, xF, pi = 3.14159;
    int x, xN, yN;
 
    increment = 0.8 / static_cast<double>(radius);
    for(theta = 0; theta <= pi / 2; theta += increment)//1/4 
                                                       // окружности
    {
        xF = radius * cos(theta);  
        xN = static_cast<int>(xF * 2 / 1); // пикселы не
                                           // квадратные :-(
        yN = static_cast<int>(radius * sin(theta) + 0.5);
        x = xC - xN;
        while(x <= xC + xN) // заполнить две горизонтальные линии
        {                   // по одной на каждую ? окружности
            set_cursor_pos(x, yC - yN); _putch(fill_char);   // верх
            set_cursor_pos(x++, yC + yN); _putch(fill_char); // низ
        }
    }  // конец for
}
//---------------------------------------------------------
void draw_line(int x1, int y1, int x2, int y2)
{
 
    int w, z, t, w1, w2, z1, z2;
    double  xDelta = x1 - x2, yDelta = y1 - y2, slope;
    bool isMoreHoriz;
 
    if(fabs(xDelta) > fabs(yDelta)) // еще горизонтальная
    {
        isMoreHoriz = true;
        slope = yDelta / xDelta;
        w1 = x1; z1 = y1; w2 = x2, z2 = y2; // w = x, z = y 
    }
    else                            // еще вертикальная
    {
        isMoreHoriz = false;
        slope = xDelta / yDelta;
        w1 = y1; z1 = x1; w2 = y2, z2 = x2; // w = y, z = x
    }
 
    if(w1 > w2)                     // если за w
    {
        t = w1; w1 = w2; w2 = t;    // заменить (w1, z1)
        t = z1; z1 = z2; z2 = t;    // на (w2, z2)
    }
    for(w = w1; w <= w2; w++)            
    {
        z = static_cast<int>(z1 + slope * (w - w1));
        if(!(w == 80 && z == 25))  // убрать прокрутку на 80, 25
        {
            if(isMoreHoriz)
                set_cursor_pos(w, z);
            else
                set_cursor_pos(z, w);
            _putch(fill_char);
        }
    }
}
//---------------------------------------------------------
void draw_pyramid(int x1, int y1, int height)
{
    int x, y;
    for(y = y1; y < y1 + height; y++)
    {
        int incr = y - y1;
        for(x = x1 - incr; x <= x1 + incr; x++)
        {
            set_cursor_pos(x, y);
            _putch(fill_char);
        }
    }
}
//---------------------------------------------------------
void set_fill_style(fstyle fs)
{
    switch(fs)
    {
    case SOLID_FILL:  fill_char = '\xDB'; break;
    case DARK_FILL:   fill_char = '\xB0'; break;
    case MEDIUM_FILL: fill_char = '\xB1'; break;
    case LIGHT_FILL:  fill_char = '\xB2'; break;
    case X_FILL:      fill_char = 'X';    break;
    case O_FILL:      fill_char = 'O';    break;
    }
}
//---------------------------------------------------------


Спасибо большое. Заработало.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2015, 11:06     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой
Еще ссылки по теме:

C++ Лафоре Не компилируется пример
Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" C++
Не компилируется листинг "Передача по ссылке аргументов" Р.Лафоре C++

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

Или воспользуйтесь поиском по форуму:
Warlus
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 1
29.06.2015, 11:06     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой #20
Нужно "CONOUT$" заменить на L"CONOUT$". Тогда будет всё работать. Ну лично у меня так.
Yandex
Объявления
29.06.2015, 11:06     Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой
Ответ Создать тему
Опции темы

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