Vajíčková mánie Vajíčková mánie
Od 15. do 21.4. slevy 20 až 80% v sekci C/C++. Když ne teď, tak kdy?
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde

Diskuze: Metoda vracející hodnotu - zápis výsledku.

Aktivity (4)
Avatar
Filip
Člen
Avatar
Filip:9.5.2018 17:34

Ahoj, mám dotaz ohledně vrácení hodnoty. Která varianta je podle vás ta správná? Je mi jasné, že vytvoření další proměnné pro výpočet bude stát nějakou tu paměť a čas (což je v tomto případě dost zanedbatelné). Ovšem v 2. variantě mi zase přijde, že v případě nějakého většího výpočtu by to mohlo být trochu nepřehledné/ne­elegantní.
Děkuji za každou reakci.
Přeji hezký den.
1.varianta:

int Soucet(int a, int b)
{
        int soucet = a + b;
        return soucet;
}

2. varianta

int Soucet(int a, int b)
{
        return a + b;
}
 
Odpovědět 9.5.2018 17:34
Avatar
Odpovídá na Filip
Erik Šťastný:9.5.2018 18:04

Takovéto jednoduché příklady compiler většinou sám optimalizuje do druhé varianty.

 
Nahoru Odpovědět  +1 9.5.2018 18:04
Avatar
Odpovídá na Filip
Erik Šťastný:9.5.2018 18:12

Zde maličký příklad... Zkompiloval jsem projekt s těmito metodami...

private int FourBytesToInt(byte[] array)
{
    int res = 0;
    res += array[0] * 256 * 256 * 256;
    res += array[1] * 256 * 256;
    res += array[2] * 256;
    res += array[3];
    return res;
}

private byte[] IntToFourBytes(int intValue)
{
    byte[] array = new byte[4];
    array[0] = (byte)(intValue >> 24);
    array[1] = (byte)(intValue >> 16);
    array[2] = (byte)(intValue >> 8);
    array[3] = (byte)intValue;
    return array;
}

Pomocí dekompilace jsem dostal zpátky už jen tohle... zvláštně dobrá je druhá metoda, kde to zůstalo vše v returnu.

private int FourBytesToInt(byte[] array)
{
  return 0 + (int) array[0] * 256 * 256 * 256 + (int) array[1] * 256 * 256 + (int) array[2] * 256 + (int) array[3];
}

private byte[] IntToFourBytes(int intValue)
{
  return new byte[4]
  {
    (byte) (intValue >> 24),
    (byte) (intValue >> 16),
    (byte) (intValue >> 8),
    (byte) intValue
  };
}
Editováno 9.5.2018 18:13
 
Nahoru Odpovědět 9.5.2018 18:12
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Filip
Marian Benčat:9.5.2018 18:35

takovéto jednoduché příklady compiler vůbec nebude dělat jako metodu, ale prostě je inline-ne.

Nahoru Odpovědět 9.5.2018 18:35
Totalitní admini..
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Erik Šťastný
Marian Benčat:9.5.2018 18:36

To co si poslal je decompile určitě develop codu.. jinak ti compiler vždycky spočítá konstanty, pokud mu v tom nic nebrání.

Nahoru Odpovědět  +2 9.5.2018 18:36
Totalitní admini..
Avatar
Filip
Člen
Avatar
Filip:9.5.2018 18:55

Dekuji. Nasel jsem si priklad: Posloupnost naplnena x poctem cisel. Mam v ni najit nejvetsi a nejmensi cislo a udelat z nej rozdil a zaroven udelat soucin ze sudych cisel. Bohuzel, jsem nikde nenasel spravne reseni, mohl by mi to někdo zkontrolovat prosim? Samozrejme program pracuje jak ma, jde mi hlavně o optimalizaci.
Btw. jedná se o C++ konzolovou aplikaci, nedopatrenim jsem toto tema zalozil v .NET sekci, omlouvam se.
Děkuji

int PosloupnostCisel(int &roz, int pp);

int main()
{
        int pocetPrvku, roz = 0, soucin;
        cin >> pocetcisel;

        soucin = PosloupnostCisel(roz, pocetcisel);

        if (soucin == 0)
                cout << "Soucin nelze vypocitat, protoze se v posloupnosti nenachazi sude cislo" << endl;
        else
                cout << "Soucin: " << soucin << endl;

        cout << "Rozdil nejvetsiho cisla a nejmensiho cisla je: " << roz << endl;

        system("pause");
    return 0;
}

int PosloupnostCisel(int &roz, int pp)
{
        int cislo, soucin = 1, maximum = -RAND_MAX, minimum = RAND_MAX;
        bool kontrolaSoucinu = false;

        for (int i = 1; i <= pp; i++)
        {
                cout << "Zadej cislo: ";
                cin >> cislo;

                if (cislo > maximum)
                        maximum = cislo;

                if (cislo < minimum)
                        minimum = cislo;

                if (cislo % 2 == 0)
                {
                        soucin *= cislo;
                        kontrolaSoucinu = true;
                }
        }

        roz = maximum - minimum;

        if (kontrolaSoucinu)
                return soucin;
        else
                return 0;
}
Editováno 9.5.2018 18:57
 
Nahoru Odpovědět 9.5.2018 18:55
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.