switch - fallthrough niezależne od argumentu

switch - fallthrough niezależne od argumentu
PrezesiQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 187
0

Witam.

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

Kopiuj
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:

Kopiuj
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.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0
Kopiuj
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?

PrezesiQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 187
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.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

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

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

No to

Kopiuj
std::cout << ' ';
switch(getch()){
    case 27:
        ...
}
PrezesiQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 187
0

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

Kopiuj
//#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ć.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

Nie. Nie mogę tak zrobić.

Ja widzę że możesz.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
3

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

Kopiuj
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);
}
PrezesiQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 187
1

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.