Przekazanie vectorów przez referencję wysypuje program.

0

Witam.

Mam problem z małą gierką, którą sobie piszę.
Używam w niej dwuwymiarowych vectorów, które przesyłam potem do funkcji przez referencję - niestety, dla jednej z funkcji po wywołaniu zaliczam śliczny SIGSEGV - przynajmniej to sugeruje debuger.
Najpierw myślałem, że to przez operacje, które wykonuję na wektorach wewnątrz funkcji - jednak po zakomentowaniu całego jej wnętrza nadal mam identyczny problem. Będę wdzięczny, jeśli ktoś wskaże mi co robię źle. "newconio.h" to biblioteka do obsługi konsoli.

#include <iostream>
#include <cstdio>
#include <ctime>
#include <vector>
#include "newconio.h"

using namespace std;

typedef vector <vector <int> >  vector2D;
enum fields {DEATH=0,CELL=1};
const int X_LONG = 73;
const int Y_LONG = 23;

/*
różne funcje
*/

vector2D next_move(vector2D& vect, vector2D& values, vector2D& next_board)  //to ta problematyczna
{
/*
*/
}

main()
{
    /*różne inicjalizacje*/
    vector2D  board(Y_LONG,vector<int>(X_LONG, DEATH));
    vector2D values(Y_LONG,vector<int>(X_LONG, DEATH));
    vector2D  board2(Y_LONG,vector<int>(X_LONG, DEATH+3));

    /*inne działania - board wypełniany jest zerami i jedynkami, values cyframi 0-9, board2 nie jest modyfikowane*/

     next_move(board, values, board2);  //crash

    /*inne działania*/

    return 0;
}


Środowiskiem moim jest Code::Blocks 10.05, kompilatorem GCC 4.4.1, a systemem operacyjnym - Windows 7 Home Premium 64-bit

Hmm... W sumie jak już piszę - jest jakiś sposób, żeby jakiejś globalnej stałej nadać losową wartość? Tzn przy starcie programu nadać jej wartość z przedziału (500,1500), a potem mieć pewność, że nie będzie w żaden sposób zmieniona?

I jeszcze jedna sprawa - można w jakiś sposób poprawić czytelność zawartości wektorów STL-a w debugerze z Code::Blocks? Bo teraz widać je jako
user image
A chciałoby się mieć jakiś prosty wzgląd w ich zawartość, jak przy zwykłych tablicach na przykład.

PS Kurdę, napisałem temat i olśnienie nie przyszło... Do tej pory wystarczyło, że mając problem zaczynałem pisać temat na 4P, a zanim dotarłem do końcu pojawiało się rozwiązanie i nie musiałem się publicznie ośmieszać ;-(
PS2 Żeby się nie pogrążać nie wrzucałem całości kodu, bo wydawało mi się, że nie ma ona związku z tym, co się tu dzieje - jeśli się mylę, dajcie znać.

Z góry dzięki za pomoc i poświęcony czas. ;-)

Pozdrawiam,
Jadeszek

1

Co do sigsegv to najprawdopodobniej gdzieś wyszedłeś poza tablicę, bez kodu nie da się ocenić. Pamiętaj o tym, żeby dodawać przedrostek const do referencji, gdy nie zmieniasz danych argumentów funkcji. Co do stałych, to zawsze możesz zrobić zmienne globalne, które działają jak stałe praktycznie w całym programie (polecałbym stosowanie konwencji nazewnictwa stałych) poza startem. Głównym problemem ze zmiennymi globalnymi jest taki, że jak ich za bardzo używasz, to ciężej jest rozumować co dana funkcja zrobiła i jak jej wywołanie będzie wpływało na wyniki innych funkcji. To jest głównym powodem, dlaczego zmienne globalne są niezalecane.

0

Dzięki za wskazówki. Tu jest całość kodu -http://wklej.org/hash/...d5/ - jeśli nie wywołam next_move() wszystko jest ok,
Zrobiłem wcześniej tak jak proponujesz ze zmienną globalną, która potem udaje stałą - to było oczywiste rozwiązanie, ale myślałem, że można to jakoś ładniej załatwić.
Do const przy referencjach będę się stosował.

0

Rozwiązano, debilny problem - wcześniej się pogubiłem, gdy nie działało mi przekazywanie przez referencję i next_move() miało zwracać vector2d - po zmianie typu wartości zwracanej na void crasha nie ma. Szczegół, że funkcja nie działa, ale z tym powalczę sam. Dzięki.

1

Kompiluj z włączonymi ostrzeżeniami (-Wall), wtedy w takich przypadkach byś nie musiał się po forach pytać i swojego czas marnować.

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