Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
35 / 28 / 10
Регистрация: 11.04.2022
Сообщений: 197

Компиляция в g++ и mvs

10.10.2022, 11:57. Показов 1624. Ответов 20

Студворк — интернет-сервис помощи студентам
Добрый день. Сделал с некоторыми косяками простенькую игру в консоли как часть "проекта" типа арканоид. Реализация передвижения desk и ball разнес на разные потоки. Апериодически при отрисовке ball отрисовывается и desk, пробовал по разному менять параметры, частота не изменялась, использовать mutex на все установки курсора (winapi функция), также ничего не меняет, идеи как это исправить (да, не идеальное разбиение на классы, много повторного переобъявления для того setcursor и прокидывание через лямбду объекта класса не лучшая идея). Вторая проблема в том, что при использовании mvs и сборки проекта окно и рамка отрисовываются корректно, если собирать через g++ из консоли, то криво рисуется, в чем мб особенности?
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
// map.h
#pragma once
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <chrono>
#include <thread>
#include <mutex>
//#include <condition_variable>
#include <math.h>
 
#define M_PI                3.14159265358979323846
 
 
struct windows_param 
{
    void set_size_window();
 
    uint8_t size_hor = 70;
    uint8_t size_vert = 40;
 
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
};
 
struct draw_field
{
    void draw_map();
    void move_desk();
    int coordX() const { return x; }
private:
    windows_param size_win;
    int8_t desk_size = 10;
    int8_t x = size_win.size_hor / 2;
    void draw_desk();
    std::mutex mtx_desk;
};
 
struct ball
{
    void move_ball(const draw_field& obj);
    void move(const draw_field& obj);
    void collision_check(const draw_field& obj);
    double coord_y() const { return y; }
    double coord_x() const { return x; }
    
private:
    double x = 35;
    double y = 2;
    int angle = 60;
    std::mutex mtx_ball;
 
    int speedx = 1;
    int speedy = 1;
    windows_param size_win;
 
    void collision_desk_and_ball(const draw_field& obj);
};
 
 
 
void set_cursor_position(uint8_t x, uint8_t y);
 
double degtorad(int angle);
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
//map.cpp
#include "map.h"
 
//static const HANDLE h_out = GetStdHandle(STD_OUTPUT_HANDLE);
 
void draw_field::draw_map()
{
    size_win.set_size_window();
    //==========================================================
    //frame symbol
    char ch_horizontal = 205;
    char ch_vertical = 186;
    char angle_l_up = 201;
    char angle_l_down = 200;
    char angle_r_up = 187;
    char angle_r_down = 188;
    std::string space{ "                                                                    " };
    //===========================================================
    // the upper part of the frame
    std::cout << angle_l_up;
    for (int i = 0;i < size_win.size_hor - 2;++i)
    {
        std::cout << ch_horizontal;
    }
    std::cout << angle_r_up;
    //===========================================================
    // left and rigth side of the frame
    for (int i = 0;i < size_win.size_vert-1;++i)
    {
        std::cout << ch_vertical << space << ch_vertical << '\n';
    }
    //===========================================================
    //the prelast row with desk
    
    int size_space = size_win.size_hor / 2 - desk_size / 2;
    std::cout << ch_vertical;
    for (int i = 0;i < size_space-1;++i)
        std::cout << " ";
    draw_desk();
    for (int i = 0;i < size_space-1;++i)
        std::cout << " ";
    std::cout << ch_vertical;
    
    //===========================================================
    // the lower part of the frame
    std::cout << angle_l_down;
    for (int i = 0;i < size_win.size_hor - 2;++i)
    {
        std::cout << ch_horizontal;
    }
    std::cout << angle_r_down;
    //===========================================================
    SetConsoleTextAttribute(size_win.hConsole, 1);
}
 
void draw_field::draw_desk()
{
    char desk = 219;
    if (x - desk_size / 2 - 2 <= 0)
    {
        x += 1;
        return;
    }
    else if (x + desk_size / 2 + 1 >= size_win.size_hor+1)
    {
        x -= 1;
        return;
    }
    mtx_desk.lock();
    set_cursor_position(x - desk_size / 2-2, size_win.size_vert-1);
    std::cout << ' ';
    
    for (int i = 0; i < desk_size;++i)
    {
        std::cout << desk;
    }
    std::cout << ' ';
    mtx_desk.unlock();
}
 
 
void draw_field::move_desk()
{
    char sym{ ' ' };
    while (sym != 'q')
    {
        sym = _getch();
        switch (sym)
        {
        case 'a':
        {
            --x;
            draw_desk();
            break;
        }
        case 'd':
        {
            ++x;
            draw_desk();
            break;
        }
        case 'q':
            exit(0);
        default:
            break;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(20));
    }
}
 
void ball::move_ball(const draw_field& obj)
{
    char sym_ball = '*';
    while (true)
    {
        mtx_ball.lock();
        set_cursor_position(round(x), round(y));
        std::cout << ' ';
        move(obj);
        set_cursor_position(round(x),round(y));
        std::cout << sym_ball;
        mtx_ball.unlock();
        std::this_thread::sleep_for(std::chrono::milliseconds(50));
    }
}
 
void ball::move(const draw_field& obj)
{
    collision_check(obj);
    x += speedx*cos(degtorad(angle));
    y += speedy*sin(degtorad(angle));
}
 
void ball::collision_check(const draw_field& obj)
{
    if ((round(x) >= size_win.size_hor - 3) || round(x) < 2)
    {
        angle *= -1;
        return;
    }
    if ((round(y) >= size_win.size_vert - 1))
        {
            collision_desk_and_ball(obj);
            if (angle < 0)
                angle -= 180;
            else
                angle += 180;
            speedx *= -1;
        }
    if (round(y) <= 1)
        {
            if (angle < 0)
                angle -= 180;
            else
                angle += 180;
            speedx *= -1;
        }
}
 
void ball::collision_desk_and_ball(const draw_field& obj)
{
    if (!((round(x) >= obj.coordX() - 5) && (round(x) <= obj.coordX() + 5)))
    {
        std::cout << "game over";
        exit(1);
    }
}
 
void windows_param::set_size_window()
{
    HWND hwnd;
    hwnd = GetConsoleWindow();
    MoveWindow(hwnd, 1000, 100, 600, 800, false);
    SetConsoleTextAttribute(hConsole, 2);
}
 
double degtorad(int angle)
{ 
    if (angle >= 360)
        angle -= 360;
    return angle > 0 ? (angle * M_PI / 180) : (180 + angle) * M_PI / 180;
}
 
void set_cursor_position(uint8_t x, uint8_t y)
{
    static const HANDLE h_out = GetStdHandle(STD_OUTPUT_HANDLE);
    std::cout.flush();
    COORD coord{ (uint8_t)x, (uint8_t)y };
    SetConsoleCursorPosition(h_out, coord);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "map.h"
 
 
int main()
{
    draw_field D;
    ball B;
    D.draw_map();
    std::thread thread_1([&D]() {D.move_desk();});
    std::thread thread_2([&]() {B.move_ball(D);});
    thread_1.join();
    thread_2.join();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2022, 11:57
Ответы с готовыми решениями:

Компиляция в mvs
Приветствую всех. У меня установлен Microsoft Visual Studio 2015. Как скомпилировать C++ программу, которая не использует .NET, чтобы...

Компиляция на MVS 2013
Подскажите как компилировать exe файлы что бы они работали где то помимо моего компьютера. На других компьютерах пишет &quot;Запуск...

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

20
35 / 28 / 10
Регистрация: 11.04.2022
Сообщений: 197
17.11.2022, 16:46  [ТС]
Студворк — интернет-сервис помощи студентам
Переделал с использованием sfml библиотек, не понимаю причину "подвисания" выхода из программы. При выходе из цикла IsRunning вижу, что все вроде бы ок, выводится "END", сделанное для проверки, т.e. join() должен был выполниться и поток завершиться с вызовом деструкторов структуры TTY, но окно висит еще около 5 секунд и только потом в консоли вижу подтверждение вызова деструктора ~TTY(), State тоже корректно отрабатывает и выводится в консоли.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Game.h"
#include "Window.h"
 
int main()
{
    Game game;
    std::thread thread2 ([&game](){game.ReadDataTTY();});
    while (game.IsRunning())
    {   
        game.Update();
        game.LateUpdate();
        game.Draw();
    }
    thread2.join();
    std::cout<<"END\n";
    std::cout.flush();
    return 0;
}
tty
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void TTY::read_data(std::atomic<bool>& state)
{
    while (state)
    {
        //Simple_timer st;
        tcflush(serial_port,TCIFLUSH);
        int num_bytes = read(serial_port,&buf,sizeof(buf));
        if (num_bytes <0)
            {
                perror("Error reading ");
                state = false;
                return;
            }
        buf_int = char_to_int(buf);
        //write_log_sensor_data(buf);
        std::this_thread::sleep_for(std::chrono::milliseconds(TIME_REQUEST));     // request every delta time
    }
    std::cout<<"State = "<<state<<std::endl;
    std::cout.flush();
};
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
#ifndef tty_h
#define tty_h
 
#include <fcntl.h>      // Contains file control like O_RDWR
#include <errno.h>      // Error integer
#include <termios.h>    // Contains POSIX terminal control definitions
#include <unistd.h>     // write(), read(), close()
 
#include <memory>
#include <atomic>
#include <thread>
 
#define TIME_REQUEST 30  // time (ms) request in buf_int 
 
#include <iostream>
 
struct TTY
{
    public:
        TTY()
            :buf_int(0)
            {serial_port = open("/dev/ttyACM0",O_RDWR);}
        ~TTY() {std::cout<<"~tty"; /*std::cout.flush();*/ close(serial_port);}
        void set_settings_tty();
        void read_data(std::atomic<bool>& state);
        int get_value_sensor() const;
        void write_log_sensor_data(const char* buf);
    private:
        int serial_port;
        termios tty;
        char buf[3];            // max bit depth for sensor (~300 cm)
        int buf_int;
        
 
};
 
int char_to_int(const char* buf);
 
#endif
Условие выхода из цикла IsOpen пока не нажат Esc, IsQuit пока нет столкновения с нижней границей окна и state, пока нет ошибок
C++
1
2
3
4
5
6
7
bool Game::IsRunning() 
{
    while (window.IsOpen() && !(ball.IsQuit()) && state)
        return true;
    state = false;      // for case if IsQuit or IsOpen generate quit
    return false;
}


Добавлено через 35 минут
забыл раскомменитть flush. Деструктор тоже вызывается, но все равно программа не завершается.

Добавлено через 27 минут
деструктор TTY вызывается при уничтожении класса Game, затупил. Т.е. процесс висит после завершения программы целиком.

Добавлено через 1 час 19 минут
Неправильно написал в деструкторе вывод, нужно было после функции close, чтобы видно было, что функция отработала, соответственно вычислил, что вешается порт, вешается на 30 сек, т.к. у него в настройках дефолтных столько стоит. Причину, почему вешается не нашел. Пробовал восстанавливать настройки local modes при выходе из функции read_data, все равно висит.

Добавлено через 3 часа 1 минуту
Косяк оказался в том, что я вместо c_iflag использовал c_lflag... для настроек режима и соответственно применялись не те маски и не туда, но странность в том, что я потом возвращал настройки считанных до изменений и все равно порт вешался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2022, 16:46

MVS 10 vs QT
Мне хотелось бы узнать что лучше QT или Microsoft Visual Stidio 2010. Учусь программировать на c++, для будущих проектов мне нужен...

COBOL MVS Mainframe
MVS Operating System, ISPF

MVS 2010
Пишу на Microsoft visual studio 2010 на с++. Проблема такая: После сборки программы и сохранения компонентов беру ексешник в папочке...

Функции в MVS C++
Народ работаю в MVS C++ 2008 когда создаю форму Windows Form Apllication там можно вставлять кнопочки какие надо встовлять кнопочки чтобы...

Цикл For. MVS 15.2
Только учусь и не до конца понимаю почему в цикле получился ответ 56. По моему i должно равняться 46, но если смотреть пошагово, то сразу...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru