Alokovaný rozsah v paměti – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Alokovaný rozsah v paměti – C / C++ – Fórum – Programujte.comAlokovaný rozsah v paměti – C / C++ – Fórum – Programujte.com

 

Jan
~ Anonymní uživatel
187 příspěvků
29. 11. 2018   #1
-
0
-

Zdravim,

mám napsat program do školy pro výpočet Cosinovy míry podobnosti. Program jsem napsal a v CodeBlocksu vypadá, že je vše funkční. Program prostě dělá to co má. viz. kod programu.

#include <iostream>
#include <math.h>
#include <iomanip>

using namespace std;

int main()
{
    double n,y, vektorovySoucin;
    vektorovySoucin = 0;
    int vstup;
    cin >> vstup;
    cout << fixed << showpoint << setprecision(3);
    if (cin.fail() || vstup <0 ){
        cout << "Nespravny vstup." << endl;
        return 0;
    }
    //Naplneni pole A a B
    long double * poleA = new long double [vstup];
    for ( int i=0; i<vstup; i++){
        cin >> poleA[i];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }
    long double * poleB = new long double [vstup];
    for ( int i=0; i<vstup; i++){
        cin >> poleB[i];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }
    // vektorovy soucin
    for (int i=0; i<vstup; i++){
        long double hodnota = poleA[i] * poleB[i];
        vektorovySoucin = vektorovySoucin + hodnota;
    }

    // vektor1
    for (int i=0; i<vstup; i++){
        long double hodnota;
        hodnota = pow (poleA[i],2);
        n = n + hodnota;
    }

    //vektor2
    for (int i=0; i<vstup; i++){
        long double hodnota;
        hodnota = pow (poleB[i],2);
        y = y + hodnota;
    }
    long double V1 = sqrt(n);
    long double V2 = sqrt(y);

    //Vypocet CSM
    long double CSM = ((vektorovySoucin)/(V1*V2));
    cout << "CSM: " << CSM << endl;

    delete[] poleA;
    delete[] poleB;

    return 0;
}

Pokud, ale "zdroják" vložím do progtestu tak mi program spadne. V zadání mám napsané toto:
Program bude testován, zda správně pracuje s pamětí. Pokud paměť budete pracovat s indexy mimo alokovaný rozsah, program v testu práce s pamětí spadne. Dále bude kontrolováno, zda Váš program správně uvolnil veškerou dynamicky alokovanou paměť.

Důvod proč program spadnul se mi napíše toto:
Test 'Test náhodnými daty + test práce s pamětí': Program provedl neplatnou operaci a byl ukončen (Segmentation fault/Bus error/Memory limit exceeded/Stack limit exceeded)s

Čučím do toho už druhý den a nemůžu přijít na to co je špatně. Jsem začátečník a nemám tolik zkušenosti. Zdá se mi že tady tento problém je na mě jako na začátečníka dost velký a nebo se na to dívám ze špatného úhlu    .

Byl by tu někdo tak hodný a dokazal by mi poradit?
Předem mnohokrát děkuji.

Nahlásit jako SPAM
IP: 62.209.204.–
gna
~ Anonymní uživatel
1849 příspěvků
29. 11. 2018   #2
-
0
-

new při chybě vyhodí vyjímku. Můžeš ji odchytit (try-catch), nebo použít nothrow variantu a testovat návratovou hodnotu.

Nic jiného tam nevidím.

Nahlásit jako SPAM
IP: 213.211.51.–
29. 11. 2018   #3
-
0
-

Možná se mu nelíbí, že při chybě vstupu provedeš return bez uvolnění již alokované paměti, např. zde: 

long double * poleA = new long double [vstup];
    for ( int i=0; i<vstup; i++){
        cin >> poleA[i];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;  //je alokovano poleA, neni uvolneno
        }
    }

hu

Nahlásit jako SPAM
IP: 195.178.67.–
29. 11. 2018   #4
-
0
-

Ještě pozn.: nijak neověřuješ, zda alokování pole proběhlo úspěšně.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
29. 11. 2018   #5
-
0
-

Ještě se tam opakovaně vyskytuje long double hodnota; Překladač nenapsal alespoň varování? Uvnitř funkce by proměnná měla být deklarována pouze jednou.

Dále velikost datových typů. Máš double n,y, vektorovySoucin; a přičítáš do nich obsah long double hodnota; Je dobré si promyslet s jakými čísly pracuješ a volit a systematicky pracovat s vhodnými datovými typy.

Možná mi něco uniklo, ale proměnné n a y nejsou inicializovány.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jan
~ Anonymní uživatel
187 příspěvků
29. 11. 2018   #6
-
0
-

#3 hlucheucho
Mnohokrát děkuji za radu. Už je to funkční    Neuvolněna paměť při špatném vstupu při vkládání hodnot do pole.

Nahlásit jako SPAM
IP: 185.158.64.–
gna
~ Anonymní uživatel
1849 příspěvků
29. 11. 2018   #7
-
0
-

Jasně, přesně na to ta hláška vypadá...

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Uvolneni pameti — založil BigBear

C+ - Operace s pamětí — založil Matherz

Realokace paměti — založil kilroy

Uvolňování paměti — založil petr

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý