switch - fallthrough niezależne od argumentu

switch - fallthrough niezależne od argumentu
PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • 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.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
edytowany 2x, ostatnio: kq
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 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?


kq
Odpowiedzi w odpowiedziach.
PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • 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.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
1

No to

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

PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • 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ć.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
edytowany 4x, ostatnio: PrezesiQ
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

Nie. Nie mogę tak zrobić.

Ja widzę że możesz.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 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:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
1

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


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes

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.