Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/133: Рейтинг темы: голосов - 133, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
1

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

05.09.2013, 09:51. Показов 24727. Ответов 51
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Изучаю 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 */
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2013, 09:51
Ответы с готовыми решениями:

Лафоре Не компилируется пример
Вот текст кода#include &quot;msoftcon.h&quot; class Shape { protected: int xCo, yCo; color...

Функция инициализации консольной графики от Лафоре
Доброго времени суток. Пытаюсь использовать( только обучения ради ) и изменить библиотеку...

Не компилируется задача из Лафоре
Помогите пожалуйста разбораться почему компилятор ругается: 1&gt;L.obj : error LNK2019: unresolved...

Пособие Р.Лафоре. ООП в С++
Отличная книга(для начала), но вот задания в ней ужасно запутаны. Может кто-нибудь объяснить,есть...

51
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
05.09.2013, 10:02 2
А реализация msoftcon.h?
1
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
05.09.2013, 10:20  [ТС] 3
Цитата Сообщение от Бендерродригез Посмотреть сообщение
А реализация msoftcon.h?
То есть? Не понял вопроса.
0
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
05.09.2013, 10:31 4
Цитата Сообщение от mrtherains Посмотреть сообщение
То есть? Не понял вопроса.
Прототипы функций есть. А где их описание? Компилятор не экстрасенс, он по прототипу и названию тебе реализацию функции из воздуха не сотворит.
1
0 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 7
05.09.2013, 10:44 5
Цитата Сообщение от mrtherains Посмотреть сообщение
библиотеку подключил и в папку с .cpp файлом положил.
Теперь положите ещё прилагаемый msoftcon.cpp - и все запустится.
0
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,926
05.09.2013, 12:01 6
на VS2012 у меня он ругался на ошибки в msoftcon, на тот момент мне не хватало знаний что бы разобраться, я в конечном итоге пропустил этот пример чего и вам советую. Это просто второй пример на туже тему если разобрался с первым этот можно пропустить
1
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
05.09.2013, 19:45  [ТС] 7
Цитата Сообщение от Un_artist Посмотреть сообщение
Теперь положите ещё прилагаемый msoftcon.cpp - и все запустится.
Положил, но ошибки всё те же, к сожалению.

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

Добавлено через 4 минуты
Цитата Сообщение от reisal78 Посмотреть сообщение
на VS2012 у меня он ругался на ошибки в msoftcon, на тот момент мне не хватало знаний что бы разобраться, я в конечном итоге пропустил этот пример чего и вам советую. Это просто второй пример на туже тему если разобрался с первым этот можно пропустить
Надеюсь я ничего интересного не пропущу. А ошибок и действительно много вылезло...
0
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
06.09.2013, 00:20 8
Во-первых создайте пустой проект с++
Во-вторых добавьте заголовочный файл - msoftcon.h
в-третьих добавьте файл с кодом - msoftcon.сpp
в-четвертых добавьте главный файл, тот что написан в книге Лафоре.
Все должно получится.
Если не получится, напишите здесь, я Вам кину целый проект.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 01:03 9
Цитата Сообщение от mrtherains Посмотреть сообщение
Там есть файл "msoftcon.cpp", его стоит подключить к проекту
Стоит.
1
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 08:28  [ТС] 10
Цитата Сообщение от MacInsider Посмотреть сообщение
Во-первых создайте пустой проект с++
Во-вторых добавьте заголовочный файл - msoftcon.h
в-третьих добавьте файл с кодом - msoftcon.сpp
в-четвертых добавьте главный файл, тот что написан в книге Лафоре.
Все должно получится.
Если не получится, напишите здесь, я Вам кину целый проект.
Сделал, получилось в принципе, но компилятор указывает на ошибки в файле "msoftcon.cpp". Если не сложно, то можете скинуть проект?
0
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,926
06.09.2013, 08:40 11
думаю это не поможет, я честно говоря уже с трудом вспоминаю какие именно ошибки у меня выскакивали, но я практически уверен, что если Вы попытаетесь скомпилировать "это безобразие" в более ранних версиях VS, то ошибок не будет... не забывайте что эта книга начала 2000 годов, и этот файл создан в тоже время...А за 10 лет кое что все же поменялось )
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 08:49 12
Цитата Сообщение от mrtherains Посмотреть сообщение
Сделал, получилось в принципе, но компилятор указывает на ошибки в файле "msoftcon.cpp"
Файл покажите.
1
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
06.09.2013, 09:24 13
я сегодня после учебы приду и скину.
1
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 09:29  [ТС] 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;
    }
}
//---------------------------------------------------------
0
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 09:30  [ТС] 15
Цитата Сообщение от MacInsider Посмотреть сообщение
я сегодня после учебы приду и скину.
Спасибо, жду.
0
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 09:32  [ТС] 16
Цитата Сообщение от reisal78 Посмотреть сообщение
думаю это не поможет, я честно говоря уже с трудом вспоминаю какие именно ошибки у меня выскакивали, но я практически уверен, что если Вы попытаетесь скомпилировать "это безобразие" в более ранних версиях VS, то ошибок не будет... не забывайте что эта книга начала 2000 годов, и этот файл создан в тоже время...А за 10 лет кое что все же поменялось )
Что же, попробую поискать какой нибудь допотопный VSC++.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 09:32 17
Я вот с этой темы скачал, и одну букву только убрал в файле (в 2010 студии делал): Трудность с компиляцией классов
Миниатюры
Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой  
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 09:44 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;
    }
}
//---------------------------------------------------------
3
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
06.09.2013, 09:55  [ТС] 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;
    }
}
//---------------------------------------------------------


Спасибо большое. Заработало.
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 1
29.06.2015, 11:06 20
Нужно "CONOUT$" заменить на L"CONOUT$". Тогда будет всё работать. Ну лично у меня так.
0
29.06.2015, 11:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2015, 11:06
Помогаю со студенческими работами здесь

Пример из книги Лафоре
В третьей главе книги Лафоре по с++ есть пример использующий функцию getche(): #include &lt;iostream&gt;...

Непонятен пример из Лафоре
В 7й Главе Никак не могу понять как реализован выход из цикла #include &lt;iostream&gt; #include...

Пример из книги Лафоре
Здравствуйте! Не могли бы подсказать, по какой причине в листинге ниже переменные должны быть...

Решения упражнений [Книга Р.Лафоре "ООП в С++]
//Глава 4. Структуры. Перечисления. //Упражнение 6 #include&lt;iostream&gt; #include&lt;conio.h&gt; using...

Не работает пример из книги Лафоре
Доброго времени суток! Взялся решать задачу из книги Лафоре, глава 9, упр. 2. Опробовал уже...

Дальнейшее чтение после Р.Лафоре искусство ООП программирования С++
Всем привет. Прочел книгу Р.Лафоре искусство ООП программирования С++. И вот стою курю и думаю. А...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru