Java týden Java týden
Pouze tento týden sleva až 80 % na celý Java e-learning!
Brno? Vypsali jsme pro vás nové termíny školení OOP v Brně!
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  +1 29.11.2018 13:11
Nemá cenu nic programovat, pokud se to neprogramuje geniálně.
Avatar
Zbyňa
Člen
Avatar
Zbyňa:11. března 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  -1 11. března 21:11
čistý kód a čitelnej
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Jan Michálek
patrik.valkovic:11. března 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. března 22:55
Nahoru Odpovědět  +1 11. března 22:54
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:11. března 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. března 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. března 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. března 15:42
čistý kód a čitelnej
Avatar
Zbyňa
Člen
Avatar
Zbyňa:13. března 18:00

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

Nahoru Odpovědět 13. března 18:00
čistý kód a čitelnej
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.