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

Cloud VPS
0 głosów
444 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 (195,240 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 (195,240 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 (195,240 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 (195,240 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ź 561 wizyt
pytanie zadane 10 maja 2017 w C i C++ przez Benek Szeryf (93,190 p.)
0 głosów
0 odpowiedzi 594 wizyt
0 głosów
1 odpowiedź 427 wizyt
pytanie zadane 15 października 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 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

Kursy INF.02 i INF.03
...