pomoc w zadaniu

0

Witam,
Problem jest następujący, na SPOJU http://pl.spoj.com/problems/PP0502B/ wywala błąd wykonania (SIGSEGV) , a u mnie wszytko działa poprawnie

 
#include <iostream>
#include <vector>

using namespace std;

int main()
{
	short int test_amount;
	short int value;
	vector <int> tab[test_amount];

	cin >> test_amount;

	for(int i = 0; i < test_amount; i++)
	{
		cin >> value; 
		while( 0 < value )
		{
			int variable = 0;
			cin >> variable;
			tab[i].push_back(variable);
			value--;
		}
	}
	for(int i = 0; i < test_amount; i++)
	{
		for(int q = tab[i].size(); 1 <= q; q--)
		{
			cout << tab[i][q-1] << " ";
		}
	cout << endl;
	}
	return 0;
}
4
    short int test_amount;
    short int value;
    vector <int> tab[test_amount];

Po pierwsze - to nie jest C++ - C++ nie ma VLA. Po drugie: jaką wartość ma test_amount w momencie definicji tablicy? I dlaczego używasz tablicy w tym miejscu?

2
    short int test_amount;
    vector <int> tab[test_amount];

Co to wg Ciebie robi?

To jest undefined behavior przede wszystkim, a po drugie całkowicie bez sensu.

Przeczytałem treść zadania (do wskazania błędu w kodzie nie jest to nawet potrzebne :-) i w ogóle robisz to źleTM. Potrzebujesz jednej tablicy (std::array albo std::vector, wszystko jedno) o stałym rozmiarze 100. Alokujesz ją raz i zadaną liczbę razy wczytujesz co trzeba i wypisujesz odwrotnie.

1

short int test_amount;
short int value;
vector <int> tab[test_amount];

cin >> test_amount;

To ci się kompiluje dlatego, że kompilator GCC obsługuje rozszerzenie składni, zwane VLA, pozwalające na użycie zmiennej jako rozmiaru przy deklarowaniu tablicy.
Jest to mimo tego kod błędny, bo w linijce vector <int> tab[test_amount]; zmienna test_amount ma wartość nie zdefiniowaną.
Późniejsze cin >> test_amount jest bez znaczenia, tablica VLA już utworzona rozmiaru automagicznie nie zmienia.

Linijki powinny być w odwrotnej kolejności:

    cin >> test_amount;
    vector <int> tab[test_amount];

Miej jednak na uwadze, że to nie jest kod standardowy, i nie wszystkie kompilatory na coś takiego pozwalają.

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