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

Рисуем окошки под Dos - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Структуры http://www.cyberforum.ru/cpp-beginners/thread99656.html
помогите пожалуйста: Нужно создать список студентов ,обеспечив возможность поиска по одному полю.
C++ Сортировка массива, состоящего из 8 структур Пусть дана структура: struct Marsh { char start_punkt; //начальный пункт char finish_punkt; //конечный пункт int number; //номер маршрута }; Потом вводим данные в массив из восьми структур Marsh. И требуется упорядочить записи по номерам маршрутов( это должна быть отдельная функция). Я пробовал вот так: http://www.cyberforum.ru/cpp-beginners/thread99637.html
Структуры. Динамическое выделение памяти C++
Добрый день! Хочу задать следующий вопрос: typedef struct name { char *name; char *surename; } NAME; void main () { …..
работа с файлом) C++
Помогите пжлст написать прогу.Задание: Найти среднее количество знаков препинания в абзаце.Текст считывать с файла. Добавлено через 23 часа 46 минут или хотя бы скажите как определить в проге абзац?
C++ error C2248 http://www.cyberforum.ru/cpp-beginners/thread99605.html
Привет всем. Из за чего может быть така ошибка error C2248? Пишу в vs 2005, подключил директиву <fstream> (без ".h") после директив использую using namespace std; текст ошибки: c:\program files\microsoft visual studio 8\vc\include\fstream(802) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' 1> ...
C++ Как сделать ввод-вывод с Excel, Word, блокнот и т.д Кто знает напишите плиз????? подробнее

Показать сообщение отдельно
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
28.02.2010, 10:25     Рисуем окошки под Dos
Значится собираю проект в Open Watcom под Dos 16. Глаза уже замылились, никак ошибку не могу узреть. Собственно подозреваю что ошибка связана с моим буфером, т.е. это либо в функции upLoadInBuffer(), где в буфер сохраняется экран под окном, либо в unLoadInBuffer(), где из буфера выгружаются данные на экран (типа окно закрыли). Поэтому, если лень проглядывать весь код, то прокомментируйте пожалуйста только эти два метода класса на наличие ошибок. Вот код:

main.cpp
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
#include <stdlib.h>
#include <conio.h>
#include "win.h"
 
int main( void )
{
    system( "cls" );
    win_lib w1( 1, 1, 78, 23, "First");
    win_lib w2( 10, 10, 40, 20, "Second", 0x3F, 0x5E );
    
    w1.upLoadInBuffer();
    getch();
    w1.writeWin();
    getch();
    w2.upLoadInBuffer();
    getch();
    w2.writeWin();
    getch();
    w2.unLoadFromBuf();//ошибка вылезает где то здесь
    getch();
    w1.unLoadFromBuf();
    getch();
    
    return 0;
}
win.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
class win_lib
{
public:
    win_lib( int startX, int startY, int endX, int endY, char *name,
    char colorFrame = 0x1F, char colorInner = 0x1F );
    
    ~win_lib( void );
    
    void writeWin( void );
        
    void upLoadInBuffer( void );
    void unLoadFromBuf( void );
 
private:
    void writeChar( int x, int y,
    char symbol, char symbolColor );
    void writeFrame( void );
 
    char *videoAdress;
    char *winBuffer;
    char *itsName;
    
    char itsFrameColor;
    char itsInnerColor;
    
    int itsStartX;
    int itsStartY;
    int itsEndX;
    int itsEndY;    
};
win.cpp
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
#include "win.h"
 
win_lib::win_lib( int startX, int startY, int endX, int endY, char *name,
char colorFrame, char colorInner )
{
    videoAdress = ( char * ) 0xB8000000L;
    winBuffer   = ( char * ) new char[ ( ( endX - startX + 1 ) * ( endY - startY + 1 ) ) * 2 ];
       
    itsStartX   = startX;
    itsEndX     = endX;
    itsStartY   = startY;
    itsEndY     = endY;
    
    itsFrameColor = colorFrame;
    itsInnerColor = colorInner;
 
    itsName = name;   
}
 
void win_lib::upLoadInBuffer( void )
{
    char *v = videoAdress;
    int k = 0;
        
    for( int y = itsStartY; y <= itsEndY; y++ )
    {
        for( int x = itsStartX; x <= itsEndX; x++ )
        {
            v += ( 160 * y ) + ( 2 * x );
            winBuffer[ k++ ] = *( v++ );
            winBuffer[ k++ ] = *v;
        }
    }
}
 
void win_lib::writeWin( void )
{
    writeFrame();
    
    for( int i = itsStartY + 1; i <= itsEndY - 1; i++ )
    {
        for( int j = itsStartX+1; j <= itsEndX-1; j++ )
        {
            writeChar( j, i, 0, itsInnerColor );
        }
    }
}
 
void win_lib::writeFrame( void )
{
    writeChar( itsStartX, itsStartY, 201, itsFrameColor );
    for( int i = itsStartX + 1; i <= itsEndX - 1; i++ )
        writeChar( i, itsStartY, 205, itsFrameColor );
 
    writeChar( itsEndX, itsStartY, 187, itsFrameColor );
    for( int i = itsStartY + 1; i <= itsEndY - 1; i++ )
        writeChar( itsEndX, i, 186, itsFrameColor );
 
    writeChar( itsEndX, itsEndY, 188, itsFrameColor );
    for( int i = itsEndX - 1; i >= itsStartX + 1; i-- )
        writeChar( i, itsEndY, 205, itsFrameColor );
 
    writeChar( itsStartX, itsEndY, 200, itsFrameColor );
    for( int i = itsEndY - 1; i >= itsStartY + 1; i-- )
        writeChar( itsStartX, i, 186, itsFrameColor );
 
    for( int i = 0; ( ( itsStartX + i + 1 ) < itsEndX )
    && ( *( itsName + i ) ); i++ )
        writeChar( ( itsStartX + i + 1 ), itsStartY,
        *( itsName + i ), itsFrameColor );
}
 
void win_lib::writeChar( int x, int y, char symbol, char symbolColor )
{
        char *v = ( char * ) 0xB8000000L;
 
        v += ( 160 * y ) + ( 2 * x );
        *( v++ ) = symbol;
        *v = symbolColor;
}
 
void win_lib::unLoadFromBuf( void )
{
    char *v = videoAdress;
    int k = 0;
 
    for( int y = itsStartY; y <= itsEndY; y++ )
    {
        for( int x = itsStartX; x <= itsEndX; x++ )
        {
            v += ( 160 * y ) + ( 2 * x );
            *( v++ ) = winBuffer[ k++ ];
            *v = winBuffer[ k++ ];
        }
    }
}
 
win_lib::~win_lib( void )
{
    delete winBuffer;
    winBuffer = 0;
}
Если соберётесь компилировать этот код то воспользуйтесь либо Borland C++ 3.1, либо Turbo C++, либо Open Watcom (компиляция под DOS 16). В современных компиляторах этот код пройдёт, но запустить вы его не сможете, ибо тут идёт прямая адресацая к видеопамяти текстового режима консоли.

Всем заранее спасибо за любую помощь.

Добавлено через 7 часов 50 минут
ну так че, ниукого идей нет?

Добавлено через 10 часов 3 минуты
решил проблему, действительно весь трабл заключался в буфере, подправил там. Так же добавил метод письма в окошке, теперь до текстового редактора рукой подать, можно за один вечер склепать...что то типа edit из DOS)))
Кому интересно, выкладываю код...может пригодится, но повторюсь, это только для DOS режима, т.е. надо компилировать под дос, а так код и под винды запустится.

main.cpp
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
#include <stdlib.h>
#include <conio.h>
#include "win.h"
 
int main( void )
{
    system( "cls" );
    win_lib *w1 = new win_lib( 1, 1, 78, 23, "First");
    win_lib *w2 = new win_lib( 10, 10, 40, 20, "Second", 0x3F, 0x5E );
    
    w1->upLoadInBuffer();
    getch();
    w1->writeWin();
    getch();
    //w2->upLoadInBuffer();
    //getch();
    //w2->writeWin();
    //getch();
    //w2->unLoadFromBuf();
    //getch();
    w1->writeInWin();
    w1->unLoadFromBuf();
    getch();
 
    delete w1;
    delete w2;
    
    return 0;
}
win.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
class win_lib
{
public:
    win_lib( int startX, int startY, int endX, int endY, char *name,
    char colorFrame = 0x1F, char colorInner = 0x1F );
 
    ~win_lib( void );
    
    void writeWin( void );
    int writeInWin( void );
        
    void upLoadInBuffer( void );
    void unLoadFromBuf( void );
 
private:
    void writeChar( int x, int y, char symbol, char symbolColor );
    void writeFrame( void );
 
    char *videoAdress;
    char *winBuffer;
    char *itsName;
    
    char itsFrameColor;
    char itsInnerColor;
    
    int itsStartX;
    int itsStartY;
    int itsEndX;
    int itsEndY;
};
win.cpp
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
#include <conio.h>
#include "win.h"
 
win_lib::win_lib( int startX, int startY, int endX, int endY, char *name,
char colorFrame, char colorInner )
{
  videoAdress = ( char * ) 0xB8000000L;
    winBuffer   = new char[ ( ( endX - startX + 1 ) * ( endY - startY + 1 ) ) * 2 ];
    
    itsStartX   = startX;
    itsEndX     = endX;
    itsStartY   = startY;
    itsEndY     = endY;
    
    itsFrameColor = colorFrame;
    itsInnerColor = colorInner;
 
    itsName = name;   
}
 
void win_lib::upLoadInBuffer( void )
{
    char *v = videoAdress;
    int k = 0;
        
    for( int y = itsStartY; y <= itsEndY; y++ )
    {
        for( int x = itsStartX; x <= itsEndX; x++ )
        {
            v = videoAdress + ( 160 * y ) + ( 2 * x );
            winBuffer[ k++ ] = *(v++);
            winBuffer[ k++ ] = *v;
        }
    }
}
 
void win_lib::writeWin( void )
{
    writeFrame();
    
    for( int i = itsStartY + 1; i <= itsEndY - 1; i++ )
    {
        for( int j = itsStartX+1; j <= itsEndX-1; j++ )
        {
            writeChar( j, i, 0, itsInnerColor );
        }
    }
}
 
void win_lib::writeFrame( void )
{
    writeChar( itsStartX, itsStartY, 201, itsFrameColor );
    for( int x = itsStartX + 1; x <= itsEndX - 1; x++ )
        writeChar( x, itsStartY, 205, itsFrameColor );
 
    writeChar( itsEndX, itsStartY, 187, itsFrameColor );
    for( int y = itsStartY + 1; y <= itsEndY - 1; y++ )
        writeChar( itsEndX, y, 186, itsFrameColor );
 
    writeChar( itsEndX, itsEndY, 188, itsFrameColor );
    for( int x = itsEndX - 1; x >= itsStartX + 1; x-- )
        writeChar( x, itsEndY, 205, itsFrameColor );
 
    writeChar( itsStartX, itsEndY, 200, itsFrameColor );
    for( int y = itsEndY - 1; y >= itsStartY + 1; y-- )
        writeChar( itsStartX, y, 186, itsFrameColor );
 
    for( int i = 0; ( ( itsStartX + i + 1 ) < itsEndX )
    && ( *( itsName + i ) ); i++ )
        writeChar( ( itsStartX + i + 1 ), itsStartY,
        *( itsName + i ), itsFrameColor );
}
 
void win_lib::writeChar( int x, int y, char symbol, char symbolColor )
{
    char *v = videoAdress;
 
    v += ( 160 * y ) + ( 2 * x );
    *( v++ ) = symbol;
    *v = symbolColor;
}
 
int win_lib::writeInWin( void )
{
    for( int y = itsStartY + 1; y <= itsEndY - 1; y++ )
    {
        for( int x = itsStartX + 1; x <= itsEndX - 1; x++ )
        {
            char ch;
            ch = getch();
            
            if( ch == 13)
                break;
            if( ch == 27 )
                return 0;
                
            writeChar( x, y, ch, itsInnerColor );
        }
    }
 
    return 0;
}
 
void win_lib::unLoadFromBuf( void )
{
    char *v = videoAdress;
    int k = 0;
 
    for( int y = itsStartY; y <= itsEndY; y++ )
    {
        for( int x = itsStartX; x <= itsEndX; x++ )
        {
            v = videoAdress + ( 160 * y ) + ( 2 * x );
            *( v++ ) = winBuffer[ k++ ];
            *v = winBuffer[ k++ ];
        }
    }
}
 
win_lib::~win_lib( void )
{
    delete winBuffer;
    winBuffer = 0;
}
Всем удачи!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru