NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Diskuze: Chyba za běhu programu ale ne při debuggingu; dynamické pole uvnitř funkcí

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Ziki
Tvůrce
Avatar
Ziki:8.12.2014 21:46

Ahoj, ve škole jsme měli za úkol udělat program na řešení soustav lineárních rovnic pomocí Gaussovy elim. metody a Cramerova pravidla. to jsem sice zvládl, ale aplikace mi při předvádění vyhazovala chybu (poněkud trapná situace), tak jsem to doma zkoumal a zjistil jsem že když ji pustím přes Visual Studio 2013 přes F5 (nezáleží na debug/release) tak funguje bezchybně, ale když ji pustím přes .exe soubor tak padá.

Konkrétně se jednalo o případ, kdy zadáte výpočet determinantu matice ten proklikáte (úspěšně), poté ho zkusíte znovu a někdy v průběhu (nebo na zač. třetího pokusu) to vyhodí běhovou chybu. Zdrojový kód zde (http://www.itnetwork.cz/dev-lighter/475). mám podezření, že chybu způsoboval příkaz system("cls"), ale je mi divný proč někdy jo a někdy ne.

Další můj dotaz je směřován na deklaraci (pomocných) dynamických polí v rámci funkce, například pro výpočet determinantu jsem si nechtěl rozházet původní matici, tak jsem na začátku funkce deklaroval stejně velkou a hodnoty zkopíroval, ale když jsem se alokovanou paměť na konci funkce pokusil uvolnit, tak mi aplikace vyhodila chybu, takže jsem tu paměť neuvolňoval. Je to další programátorská prasečina které se dopouštím nebo je to běžný postup? případně jak to obchází když potřebuju dynamické pole pouze v rámci funkce (na nějaký výpočet či cokoliv) a pak paměť opět uvolnit když funkce proběhne? Uveřejňuju konkrétní část kódu (na adrese výše je někde celá funkce)

double determinant(double** _matrix, int sizeX) {
        //vytvoøení duplicitní matice, aby se nesmazaly hodnoty
        double** matrix = new double*[sizeX];
        for (int i = 0; i < sizeX; i++) {
        matrix[i] = new double[sizeX];
        }

        //kopírování hodnot

        for (int x = 0; x < sizeX; x++) {
                for (int y = 0; y < sizeX; y++) {
                        matrix[x][y] = _matrix[x][y];
                }
        }

        //poèítání determinantu pomocí gaussovy eliminace, souèet prvkù na hlavní diagonále dá dohromady determinant.
.
.
.
.

        double determinant = 1;
        for (int i = 0; i < sizeX; i++) {
                determinant *= matrix[i][i];
        }

        //mazání dynamicky vytvoøených polí vyhazuje chybu (dùvod?)
        /*for (int i = 0; i < sizeX; i++) {
                delete[] matrix[i];
        }
        delete[] matrix;*/

        if (determinant == 0) return 0; // kvùli "záporné nule"

        return determinant;
}
Editováno 8.12.2014 21:47
Odpovědět
8.12.2014 21:46
Ve vědění je síla.
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 1 zpráv z 1.