• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zrefaktoryzujmy kod RAZEM, funkcja zmiany koloru.

Object Storage Arubacloud
0 głosów
285 wizyt
pytanie zadane 4 czerwca 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
edycja 13 czerwca 2017 przez Shiro

Cześć, 

Co Wy na to aby razem usprawnić kod ? Jeżeli jesteście na tak to zapraszam ;)

Cel kodu: Kod funkcji changeColor jest zmiana koloru pisania tekstu w chwili jej wywołana na podstawie koloru tekstu oraz koloru tła.

Kod: 

/*
Wrote by Shiro (www.shiro.pe.hu) Sebastian Hryszko, COPYRIGHT (c) 2017 Use but not signatures as you or copy.
Write name color with 'L' if light or 'D' if dark.
colors: "black", "blue", "green", "cyan", "red", "purple", "yellow", "white";
ex. Lblue, Dgreen, lcyan; You must not write 'l' or 'd' defauld is 'd' so can be blue (dblue), green (dgreen) etc. and is too gold and gray ;) 
*/
int NOTTOUSEColorCode(string Color, bool Tone)
{
    int Code;
    const string colors[8] = { "black", "blue", "green", "cyan", "red", "purple", "yellow", "white" };

    if (Color == "gold")Code = 6;
    else if (Color == "gray")Code = 8;
    else
    {
        Color = changeSizeLetterOnWord(Color, 's');
        if (Color[0] == 'l')Tone = false;

        if (Color[0] == 'l' || Color[0] == 'd')Color.erase(0, 1);

        for (int i = 0; i < 8; i++)
        {
            if (colors[i] == Color)
            {
                Code = i;
                break;
            }
        }
        if (Tone == false) Code += 8;
    }    return Code;
}

/*
Write name color with 'L' if light or 'D' if dark.
colors: "black", "blue", "green", "cyan", "red", "purple", "yellow", "white";
ex. Lblue, Dgreen, lcyan; You must not write 'l' or 'd' defauld is 'd' so can be blue (dblue), green (dgreen) etc. and is too gold and gray ;) 
*/
void changeColor(string fgColor, string bgColor)
{
    #pragma once
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    //fg - foreground = text, bg - background = back;
    bool fgTone = true, bgTone; // is dark ?
    int fgCode, bgCode; // code color between 0 and 15
    const string colors[8] = { "black", "blue", "green", "cyan", "red", "purple", "yellow", "white" };

    int colorCode;

    fgCode = NOTTOUSEColorCode(fgColor, fgTone);
    bgCode = NOTTOUSEColorCode(bgColor, bgTone);

    colorCode = 16 * bgCode + fgCode;

    SetConsoleTextAttribute(hConsole, colorCode);
}

Aby funkcja u Was zadziałała są potrzebne dwie inne mojego autorstwa dlatego należy użyć tego pliku: https://goo.gl/5PzQsG

Mam nadzieje że wyniknie z tego ciekawa dyskusja i niezła zabawa ;) Miłego dnia! Shiro!

1 odpowiedź

+1 głos
odpowiedź 4 czerwca 2017 przez j23 Mędrzec (194,920 p.)
wybrane 13 czerwca 2017 przez Shiro
 
Najlepsza

Dwa razy powtarzasz ten sam kod do wyliczania fgColor i bgColor. Wpakuj go do funkcji (lub lambdy), którą wywołasz dwa razy dla tych dwóch kolorów.

 

I popraw na:

       if (fgColor == "gold")fgCode = 6;
        else if (fgColor == "gray")fgCode = 8;
		else 
		{
			for (int i = 0; i < 8; i++)
			{
				if (colors[i] == fgColor)
				{
					fgCode = i;
					break;
				}
			}
		}
		
        if (fgTone == false) fgCode += 8;

Jeśli colors musi być tablicą string[], niech będzie to zmienna statyczna.

komentarz 13 czerwca 2017 przez Shiro Stary wyjadacz (10,300 p.)
Wydaje mi się że zastosowałem się do Twoich rad. Kod został zaktualizowany (plik i kod w wpisie)

Czy da się zrobić funkcję w funkcji albo jest chociaż jakaś niepisana zasada jak nazywać funkcję jeżeli dotyczy ona innej funkcji i raczej nie będzie nigdy używana przez nikogo innego niż tę funkcję ?
1
komentarz 13 czerwca 2017 przez j23 Mędrzec (194,920 p.)

Czy da się zrobić funkcję w funkcji

Da się - użyj wspomnianej lambdy. Co do funkcji prywatnych: definiuj je tylko w plikach źródłowych i jako static. Możesz także użyć przestrzeni nazw, np. o nazwie private__.

Po co ta pragma, tablica colors w changeColor?

 

komentarz 13 czerwca 2017 przez Shiro Stary wyjadacz (10,300 p.)
Co do lambdy:
    Czytałem trochę na jej temat i nawet próbowałem jej użyć, ale kompilator nic nie rozumie. Prawdopodobnie używam starszej wersji niż C++11. Jak to sprawdzić / zmienić w vs17 ? :D

Co do nazewnictwa:
    Zrobiłem kombo static + private__ :D (Update tylko w pliku) A tak dokładniej to static na nic więcej nie wpływa ?

Co do reszty:
    Pragma zauważyłem że gdy używałem tej komendy wcześniej to HANDLE.. w kodzie mogło być tylko raz dlatego też to wstawiłem, gdy to przeczytałem zdałem sobie sprawę jak bardzo było to niepotrzebne i to usunąłem. Co do tablicy zapomniałem ją usunąć :)

Dziękuje Ci za wszystkie uwagi!
komentarz 13 czerwca 2017 przez j23 Mędrzec (194,920 p.)

VS2017 musi obsługiwać standard C++11. Być może coś źle napisałeś.

 Zrobiłem kombo static + private__ :D

Jeśli funkcja jest statyczna, to wrzucanie jej do nowej przestrzeni nazw jest IMO bezcelowe.

A tak dokładniej to static na nic więcej nie wpływa ?

Co masz na myśli?

komentarz 13 czerwca 2017 przez Shiro Stary wyjadacz (10,300 p.)
Niby tak, ale nie mogłem się zdecydować. Zostawię tylko private__

No np. const uniemożliwia zmianę, myślałem że może to jest coś więcej jak informacja dla programisty :)
komentarz 13 czerwca 2017 przez j23 Mędrzec (194,920 p.)

Ale const to nie tylko info dla programisty, ale też dla kompilatora - może lepiej zoptymalizować kod. Z kolei static dla funkcji i zmiennych globalnych ogranicza ich widoczność do jednej jednostki kompilacji (internal linkage). W przypadku zmiennych lokalnych powoduje, że istnieją one przez cały czas działania aplikacji.

O takie wyjaśnienie chodziło?

komentarz 13 czerwca 2017 przez Shiro Stary wyjadacz (10,300 p.)

Dokładnie o takie. Pisząc 

No np. const uniemożliwia zmianę, myślałem że może to jest coś więcej jak informacja dla programisty :)

Miałem na myśli że static być może jest tylko informacją dla programisty ;) Jeszcze raz wielkie dzięki ;) 

Podobne pytania

0 głosów
1 odpowiedź 282 wizyt
pytanie zadane 10 maja 2017 w C i C++ przez Benek Szeryf (91,070 p.)
0 głosów
0 odpowiedzi 326 wizyt
0 głosów
1 odpowiedź 322 wizyt
pytanie zadane 15 października 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)

92,581 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...