switch - fallthrough niezależne od argumentu

0

Witam.

Czy jest możliwość zrobienia fallthrough niezależnie od argumentu? Chodzi o to, że mój switch wygląda tak:

switch(getch()){
            case ARR_LEFT: 
                std::cout<<" ";
                ...
            case ARR_UP: 
                std::cout<<" ";
                ...
            case ARR_RIGHT: 
                std::cout<<" ";
                ...
            case ARR_DOWN: 
                std::cout<<" ";
                ...
            case 27:
                std::cout<<" ";
                ...
        }

I chciałbym zrobić coś w stylu:

switch(getch()){
    case whatever:
        std::cout<<" ";
    case ARR_LEFT:
        ...
    case ARR_UP:
        ...
    case ARR_RIGHT:
        ...
    case ARR_DOWN:
        ...
    case 27:
        ...
}

Czy jest takie coś możliwe? Myślę, że wtedy kod byłby bardziej czytelny.

0
switch(getch()){
    case ARR_LEFT: //left
    case ARR_UP: //up
    case ARR_RIGHT: //right
    case ARR_DOWN: //down
    case 27:
        std::cout<<" ";
}

O to chodzi?

0

Nie. 27 to kod Escape, to przywraca kursor i wychodzi z programu. Chodzi o to, że w switchu w każdym case używam std::cout<<" ";, a chciałbym po prostu na początku switcha to wykonać, a następnie byłoby sprawdzanie znaku i odpowiednia akcja.

3

A nie możesz po prostu zrobić tego cout PRZED całym switchem? :P

1

No to

std::cout << ' ';
switch(getch()){
    case 27:
        ...
}
0

@Shalom:
@kq:
Nie. Nie mogę tak zrobić.
Zaraz wyślę cały kod.

//#include "Diz.h"
#include "Coords/Coords.h"
#include <iostream>
#include <conio.h>
#include <thread>
#include <chrono>

#define ARR_UP 72
#define ARR_DOWN 80
#define ARR_LEFT 75
#define ARR_RIGHT 77

void ShowCursor(bool flag){
    HANDLE CHandle = GetStdHandle(STD_OUTPUT_HANDLE);

    CONSOLE_CURSOR_INFO CursorInfo;

    GetConsoleCursorInfo(CHandle, &CursorInfo);
    CursorInfo.bVisible = flag;
    SetConsoleCursorInfo(CHandle, &CursorInfo);
    CloseHandle(CHandle);
}


void Test(){
    Coords CoordsBackup = GetCurrentCoords();

    Coords c(30,30);
    c.GotoXY();

    while(1){
        std::cout<<"#\b";
        switch(getch()){
            case ARR_LEFT:
                std::cout<<" ";
                c.GotoXY(c.SetX(X-1), Y);
                break;
            case ARR_UP:
                std::cout<<" ";
                c.GotoXY(X, c.SetY(Y-1));
                break;
            case ARR_RIGHT:
                std::cout<<" ";
                c.GotoXY(c.SetX(X+1), Y);
                break;
            case ARR_DOWN:
                std::cout<<" ";
                c.GotoXY(X, c.SetY(Y+1));
                break;

            case 27:
                std::cout<<" ";
                CoordsBackup.GotoXY();
                exit(0);
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}


int main(){
    Test();
}

Jeśli chcecie Coords.cpp/h mogę podesłać.

3

Nie. Nie mogę tak zrobić.

Ja widzę że możesz.

3

Skorzystaj ze znanej zasady: powtarzane czynności opakuj w funkcję.

auto handle_xy = [&](int x, int y) {
    std::cout << ' ';
    c.GotoXY(c.SetX(x), c.SetY(y));
};

switch(getch()){
    case ARR_LEFT:
        handle_xy(X-1, Y);
        break;
    case ARR_UP:
        handle_xy(X, Y-1);
        break;
    case ARR_RIGHT:
        handle_xy(X+1, Y);
        break;
    case ARR_DOWN:
        handle_xy(X, Y+1);
        break;

    case 27:
        std::cout<<" ";
        CoordsBackup.GotoXY();
        exit(0);
}
1

Dziękuję bardzo. Te dwa miesiące pisania to chyba mi za dużo nie dały.

1 użytkowników online, w tym zalogowanych: 0, gości: 1