[C++]Dużo opcji wyboru w jednej funkcji


(MalyEdiPl) #1

Witam.

Nie mam pomysłu na poradzenie sobie z problemem dużej ilości konfiguracji funkcji. Naprzykład funkcja ConsoleSetAttributeText()

1.SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),kolor)

2.SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),kolor | BACKGROUND_INTENSITY);

3.SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),kolor | BACKGROUND_RED | BACKGROUND_INTENSITY);

4.SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),kolor | FOREGROUND_BLACK | BACKGROUND_RED | FOREGROUND_INTENSITY);

I tak dalej… Wywołanie, np.: z batch wygladaloby naprzyklad tak: Teoria:

program.exe jakistekst foregroundred foregroundgreen foregroundblue foregroundintensity backgroundred backgroundgreen backgroundblue backgroundintensity

Praktyka:

program.exe "tekst o potworze" 1 0 0 1 1 0 0 1

albo jeszcze inna kombinacja, na przykład:

program.exe "fopa" 0 0 0 0 0 0 0 1

Co robić w takich przypadkach? Najlepiej prosiłbym o przykładowy kod. Początek i problem:

int main(int argc, char *argv[])

{

//przyklad: program.exe -cx 'tekst' 'kolor ' piszciagle(1-tak)' foregroundred foregroundgreen foregroundblue foregroundintensity backgroundred backgroundgreen backgroundblue backgroundintensity

    if(argv[1] == cx && argv[2] != NULL && argv[3] != NULL && argv[4] != NULL && argv[5] != NULL && argv[6] != NULL && argv[7] != NULL && argv[8] != NULL && argv[9] != NULL && argv[10] != NULL && argv[11] != NULL && argv[12] != NULL)

    {

        char * tekst = argv[2];

        int kolor = atoi(argv[3]);

        int varzm = atoi(argv[4]);

        int foregroundred = atoi(argv[5]); //opcja1

        int foregroundgreen = atoi(argv[6]);

        int foregroundblue = atoi(argv[7]);

        int foregroundintensity = atoi(argv[8]); //opcja2

        int backgroundred = atoi(argv[9]); //opcja3

        int backgroundgreen = atoi(argv[10]);

        int backgroundblue = atoi(argv[11]);

        int backgroundintensity = atoi(argv[12]); //opcja4


        //opcje z wyswietlaniem tekstu

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), kolor | BACKGROUND_RED | FOREGROUND_INTENSITY);


                std::cout << tekst << std::endl;

        if(varzm == 1)//piszciagle

        {

            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);

        }

        if(varzm== 0 )

        {

            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),kolor);

        }


    }

return 0;

}

P.S Wiem że początek z ifem mogę zrobić lepiej, potem się tym zajmę.


(Rolek0) #2

dafuq?

Przykład:

#include 


int main(int argc, char* argv[])

{

	if(argc < 2)

		return 1;

	WORD attr = 0;

	for(char* p = argv[1]; *p; ++p)

		switch(*p)

		{

		case 'r': attr |= BACKGROUND_RED; break;

		case 'g': attr |= BACKGROUND_GREEN; break;

		case 'b': attr |= BACKGROUND_BLUE; break;

		case 'i': attr |= BACKGROUND_INTENSITY; break;

		case 'R': attr |= FOREGROUND_RED; break;

		case 'G': attr |= FOREGROUND_GREEN; break;

		case 'B': attr |= FOREGROUND_BLUE; break;

		case 'I': attr |= FOREGROUND_INTENSITY; break;

		}

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), attr);

	return 0;

}

Użycie:

prog.exe rgbiRGBI

Małe litery - tło; wielkie litery - znaki; dowolna kombinacja, pisane łącznie, kolejność dowolna.

Napisane w ok. minutę :stuck_out_tongue:


(MalyEdiPl) #3

Myślałem z godzinę, ale wymyśliłem po godzinie równie podobny kod. I tak dzięki za fatygę(czasem dobrze sobie zrobić przerwę od kompa i oczyścić umysł, a same pomysły wpadną do głowy :wink: )