Błąd "signal 6" w zadaniu akcelerator w kursie na main2.edu.pl

0

Witam, stworzyłem sobie programik do tego zadania https://main2.edu.pl/c/kurs-podstaw-algorytmiki-druga-e/p/akc/
U mnie nie powoduje żadnych błędów, lecz na stronie po wysłaniu zadania do sprawdzarki w większości testów otrzymuję błąd wykonania "process exited due to signal 6"

Oto kod:

#include <iostream>

using namespace std;

long szukaj_pierwszej(long poczatek, long koniec, long *x, long *tablica){  //wyszukiwanie binarne ;)
    long srodek;
    while (poczatek < koniec)
    {
        srodek = (poczatek + koniec) / 2;
        if(tablica[srodek] >= *x)
            koniec = srodek;
        else
            poczatek = srodek + 1;
    }
    if(tablica[poczatek]==*x){
        return poczatek;
    }
    else{
        return -1;
    }
}

long szukaj_ostatniej(long poczatek, long koniec, long *x, long *tablica){
    long srodek;
    while (poczatek < koniec)
    {
        srodek = (poczatek + koniec+1) / 2;
        if(tablica[srodek] <= *x)
            poczatek = srodek;
        else
            koniec = srodek - 1;
    }
    if(tablica[poczatek]==*x){
        return poczatek;
    }
    else{
        return -1;
    }
}

int main()
{
    long liczba_czastek;
    cin >> liczba_czastek;
    long * ciag = new long[liczba_czastek];
    for(long i=0; i<liczba_czastek; ++i){
        cin >> ciag[i];
    }
    long liczba_zapytan;
    cin >> liczba_zapytan;
    long zapytania[liczba_zapytan];
    for(long i=0; i<liczba_zapytan; ++i){
        cin >> zapytania[i];
    }

    for(long i=0; i<liczba_zapytan; ++i){
        long * liczba_szukana = new long;
        *liczba_szukana = zapytania[i];
        long * indeks_pierwszej_szukanej = new long;
        *indeks_pierwszej_szukanej = szukaj_pierwszej(0, liczba_czastek-1, liczba_szukana, ciag);
        if(*indeks_pierwszej_szukanej==-1){
            cout << "0" << endl;
        }
        else{
            long * indeks_drugiej_szukanej = new long;
            *indeks_drugiej_szukanej = szukaj_ostatniej(0, liczba_czastek-1, liczba_szukana, ciag);
            long * ilosc_wystapien = new long;
            *ilosc_wystapien = (*indeks_drugiej_szukanej-*indeks_pierwszej_szukanej)+1;
            delete indeks_drugiej_szukanej;
            cout << *ilosc_wystapien << endl;
            delete ilosc_wystapien;
        }
        delete liczba_szukana;
        delete indeks_pierwszej_szukanej;
    }
    delete [] ciag;
    delete [] zapytania;

    return 0;
}

Ma ktoś może pomysł co jest powodem tego błędu? Pozdrawiam serdecznie

0

(poprawiono link do zadania)

1
long liczba_zapytan;
cin >> liczba_zapytan;
long zapytania[liczba_zapytan];
//...

https://4programmers.net/Forum/C_i_C++/296862-dynamiczna_tablica_a_statyczna
a potem jeszcze ją usuwasz, a nie przydzieliłeś dynamicznie.

delete [] zapytania;

Utwórz tablicę normalnie operatorem new.

0

Faktycznie! ;_;
Teraz działa
Początkowo było wszystko statycznie i bez wskaźników, ale pokazywało mi, że się w czasie nie mieści xD
Dziękuję bardzo, pozdrawiam! :)

3

A ja się przyczepię do tego abyś nie pisał w ten sposób:

long liczba_zapytan;
cin >> liczba_zapytan;
long zapytania[liczba_zapytan];

VLA nie należą do standardu C++, pomimo, że C99 dopuszcza taką konstrukcję. To, że na Twoim kompilatorze to działa, nie znaczy, że tak jest na każdym. Co więcej skoro piszesz w C++ użyj czegoś bezpieczniejszego niż gołe tablice. Możesz użyć chociażby std::vector

BTW, mój kompilator przy próbie kompilacji wywala błąd:
[BCC32 Error] File1.cpp(9): E2313 Constant expression required

No i co ja miałbym robić jeśli by to było jakieś publiczne repo z kodem którego potrzebuję...? :]

0

@Mr.YaHooo:
Tej konstrukcji nauczyłem się w "Szkole Programowania" Stephena Praty. W tej samej publikacji czytałem że zmienna w [rozmiar_tablicy] musi być stałą. Czy jak zrobię coś na zasadzie:

long liczba_zapytan;
cin >> liczba_zapytan;
const long ArSize = liczba_zapytan;
long zapytania[ArSize];

to według standardu będzie poprawnie? Poza tym, co to są w ogóle te tablice VLA? :D
I nie za bardzo rozumiem o co chodzi w ostatnim zdaniu:
No i co ja miałbym robić jeśli by to było jakieś publiczne repo z kodem którego potrzebuję...? :]

1

VLA -> Variable Length Array :)

Generalnie poczytaj sobie to http://en.cppreference.com/w/cpp/language/array Tu masz wyjaśnione ładnie jak się definiuje tablice:
noptr-declarator [expr] attr
gdzie expr to integral constant expression co dalej wg linka http://en.cppreference.com/w/cpp/language/constant_expression jest:

Defines an expression that can be evaluated at compile time.

Zatem może to być zmienna typu const:

const long ArSize = 10;
long zapytania[ArSize];
1
Mr.YaHooo napisał(a):

VLA nie należą do standardu C++, pomimo, że C99 dopuszcza taką konstrukcję. To, że na Twoim kompilatorze to działa, nie znaczy, że tak jest na każdym.

Z popularnych kompilatorów VLA obsługują GCC i Clang (zarówno w C jak i w C++), a nie obsługuje Visual C++ (ani w C ani w C++).
Z mniej znanych VLA działa też pod LabWindows/CVI (ale to jest kompilator wyłącznie C).

Właściwie to nie znam kompilatora, który obsługiwałby zgodnie ze standardami, czyli VLA w C a brak VLA w C++ :-)

0

To w takim razie podsumowując. Jaką tablicę mam używać aby móc określić jej rozmiar w trakcie trwania programu i było to zgodne z wszystkimi kompilatorami?

2

Użyj std::vector

1 użytkowników online, w tym zalogowanych: 0, gości: 1