Dziwne zachowanie sprawdzarki na "Szkopuł"

0

Robię zadanie z OI, wysyłam rozwiązanie, "Process due to signal 11", sprawdzam debuggerem i valgrind = 0 błędów (u mnie na komputerze wszystko działa jak należy), po pół godzinie kombinowania dowiaduje się że dla sprawdzarki w pętli for(int i = 5; i >= 0; i--) i w pewnym momencie może wynieśc -1 O_o, dlaczego ?
Kod do zadania, pokazujący dziwne zachowanie:

#include <bits/stdc++.h>

using namespace std;

class Bottle{
public:
    int t;
    int a;
    int w;

    void load(){
        cin >> t >> a >> w;
    }
};

const int INF = 1e9 + 7;

vector<vector<int>> dp (79 + 1, vector<int> (21 + 1, INF));
vector<Bottle> bottles (1000);

int calc_min_bottle_weight(Bottle & bottle, int need_t, int need_a, int n){
    for (int i = need_a; i >= 0; i--){
        for (int j = need_t; j >= 0; j--){
            if (i > dp.size() - 1 || i < 0 || j > dp[0].size() - 1 || j < 0){
                cout << i << "_" << j << "JAKIM_CUDEM_i=-1???";
                return 0;
            }
            dp[i][j] = 2137;
        }
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(NULL);

    int need_t, need_a, n;
    
    cin >> need_t >> need_a;
    cin >> n;

    for (int i = 0; i < n; i++)
        bottles[i].load();
    
    dp[0][0] = 0;
    for (int b = 0; b < n; b++)
        calc_min_bottle_weight(bottles[b], need_t, need_a, n);
    
    cout << dp[need_a][need_t];

    return 0;
}

Tutaj "Testuje": https://szkopul.edu.pl/problemset/problem/sJ1qx1ofWZlg2bZR40XJB_0O/site/?key=submit

0

No w pewnym momencie i bedzie rowne -1 i to zakonczy petle.

Jak rozumiem masz i == -1 i cialo petli sie wykonuje?

0

Nie tylko na szkopule jak widac :)

stivens@S410UA ~ $ ccpp test.cpp 
test.cpp: In function ‘int calc_min_bottle_weight(Bottle&, int, int, int)’:
test.cpp:24:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::vector<int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   24 |             if (i > dp.size() - 1 || i < 0 || j > dp[0].size() - 1 || j < 0){
      |                 ~~^~~~~~~~~~~~~~~
test.cpp:24:49: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   24 |             if (i > dp.size() - 1 || i < 0 || j > dp[0].size() - 1 || j < 0){
      |                                               ~~^~~~~~~~~~~~~~~~~~
test.cpp:21:37: warning: unused parameter ‘bottle’ [-Wunused-parameter]
   21 | int calc_min_bottle_weight(Bottle & bottle, int need_t, int need_a, int n){
      |                            ~~~~~~~~~^~~~~~
test.cpp:21:73: warning: unused parameter ‘n’ [-Wunused-parameter]
   21 | int calc_min_bottle_weight(Bottle & bottle, int need_t, int need_a, int n){
      |                                                                     ~~~~^
test.cpp:31:1: warning: control reaches end of non-void function [-Wreturn-type]
   31 | }
      | ^
stivens@S410UA ~ $ ./a.out 
5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
-1_5JAKIM_CUDEM_i=-1???-1_5JAKIM_CUDEM_i=-1???-1_5JAKIM_CUDEM_i=-1???-1_5JAKIM_CUDEM_i=-1???-1_5JAKIM_CUDEM_i=-1???2137%  
0

Wyjaśnij mi JAKIM_CUDEM w treści zadania znalazł się opis, że masz wypisać "JAKIM_CUDEM_i"?

Nie widzę powodu do SIGSEGV, ale nie widzę też powodu, żeby twój program miałby działać poprawnie.

4

Nie widzę powodu do SIGSEGV

Funkcja ma zwrocic inta ale nie zwraca nic. Nie znam sie az tak dobrze na tych C/C++ ale jesli to jest jeden z tych UB to kompilator moze zrobic co chce :D

1

Błąd nie występuje jak nie masz UB takiego jak np. niezwracanie z funkcji, którą deklarujesz jako zwracającą int.

wystarczy czytać komunikaty kompilatora

1

No tak, wziąłem twój kod i usunąłem warninngi i w ten sposób usunąłem problem :).

Tu się odtwarza: https://godbolt.org/z/b987bM

0

Używam vscode, kompiluje to przez klikanie w "Run with Debug" :), pokazuje mi tylko błędy które uniemożliwiają działanie programu, jak powinienem kompilować program żeby pokazywał mi jak najwięcej blędów ?

0

Z terminala albo sobie pozmieniaj ustawienia w tym VSC

0

Jaki kompilator? Dla MSVC wydaje się, że mają jakieś kuriozalne --no-warnings defaultowo: https://github.com/microsoft/vscode-cpptools/issues/2091

Sam z reguły sobie robię prosty makefile, który odpalam z build commands i tam wszystko ustawiam zgodnie z upodobaniem.

1

Hmm, jeśli używasz MSVC, to przestań, bo na OI tylko gcc jest i nie sądzę, że warto się ewentualnie frustrować z powodu różnic.

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