Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Využij akce až 80 % zdarma při nákupu e-learningu - více informací. Zároveň pouze tento týden sleva až 80 % na e-learning týkající se Swift
Avatar
Jan Michálek:29.11.2018 13:11

Zdravim,

(Předem se omluvám za založení vlákna se stejným programem, který jsem tu už jednou na foru vložil |-) )

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)

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

Editováno 29.11.2018 13:13
Odpovědět
29.11.2018 13:11
Nemá cenu nic programovat, pokud se to neprogramuje geniálně.
Avatar
Zbyňa
Člen
Avatar
Zbyňa:11.3.2019 21:11

U te proměnné vstup v cyklu for místo toho vstup tam dej int lenght = (int)sizeof(pole) / sozeof(pole[0]) tuším páč chceš délku resp počet prvků v poli ne?

 
Nahoru Odpovědět
11.3.2019 21:11
Avatar
Patrik Valkovič
Člen IT Redactor Gang
Avatar
Odpovídá na Jan Michálek
Patrik Valkovič:11.3.2019 22:54

Co když bude vstup 0? Kromě toho při nesprávném vstupu neuvolňuješ paměť.
Komentář nademnou ignoruj, sizeof ti nepomůže.

Editováno 11.3.2019 22:55
Nahoru Odpovědět
11.3.2019 22:54
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Patrik Valkovič
Člen IT Redactor Gang
Avatar
Patrik Valkovič:11.3.2019 22:58

Až teď jsem si všiml, že se jedná o 3 měsíce staré vlákno....ach jo

Nahoru Odpovědět
11.3.2019 22:58
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Zbyňa
Člen
Avatar
Odpovídá na Zbyňa
Zbyňa:13.3.2019 15:42

OK tak tedy long double * poleA = new long double [vstup];
for ( int i=0; i<vstup; i++){
cin >> poleA[i];
if (cin.fail()){
cout << "Nespravny vstup." << endl;
delete[] poleA; /// to same v poleB
return 0;
}
}

 
Nahoru Odpovědět
13.3.2019 15:42
Avatar
Zbyňa
Člen
Avatar
Zbyňa:13.3.2019 18:00

mno pravdu díte. ale příště prosím ne tak ofenzivně :-)

 
Nahoru Odpovědět
13.3.2019 18:00
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.