Kolejka fifo, funkcja pobierająca element, segmentation fault

0

Mam następujący kod:

main - http://ideone.com/Q3e1Hw
Fifo.h - http://ideone.com/IrjkSM
Fifo.cpp - http://ideone.com/bo94ly

Dodam, że wszystko co znajduje się w pierwszym linku nie może zostać zmienione. Mam problem z funkcją get. Kiedy jej używam dostaje komunikat segmentation fault. Jeśli usunę z niej zwalnianie pamięci to wtedy działa dobrze tylko, że znowu mam wyciek. Nie wiem jak rozwiązać ten problem, byłbym wdzięczny za pomoc. Z góry dziękuje.

Pytanie bonusowe na które nie udało mi się znaleźć odpowiedzi, a nie chce już zakładać nowego wątku. Czym różni się przekzywanie przez referencję od przekzywania przez wskaźnik ?

poprawienie linków do ideone.com - fp

0

nie dolacza sie .cpp dolacza sie tylko i wylacznie .h (.hpp)

przekazywanie przez wskaznik/referencje mozna powiedziec ze nie rozni sie niczym. Obiekt nie jest kopiowany, wiec glowne zalozenie jest spelnione. We wskazniku bedziesz uzywac -> by sie dostac do metod a przy referencji bedziesz robic kropke (.). Sa roznice, ale takie szczegoly to nie temat newbie moim zdaniem. Ew wygoogluj difference between pointer and reference c++ (jest odpowiedz na stackoverflow)

Fifo* init(){
	Fifo *f=NULL;
	return f;
} 

pracujesz na nullu...

0

Sa roznice, ale takie szczegoly to nie temat newbie moim zdaniem.

Kiedyś w końcu muszę wyjść z tego poziomu : )
Co do programu, to nie pracuje na NULL, bo po drodze jest put(Fifo *f, std::string value), który mi dodaje elementy, więc w momencie get już powinno być ok.

0

ok juz wiem co robisz. Nie mam tu jak uzyc debuggera dla Twojego projektu wiec musisz sam to zrobic i popatrzec na stack co w nim sie znajduje ale

jak przekazujesz wskaznik to modyfikujesz obiekt ktory przekazales, ale nie modyfikujesz oryginalnego wskaznika wiec jak zrobisz

void funkcja (int *ptr) {ptr = null;}

to przekazany do tej funkcji ptr nadal bedzie mial ustawiona wartosc ktora mial, mimo ze w funkcji ptr jest ustawiany na null

void funkcja (int *&ptr) {ptr = null;}

przekazany do tej funkcji ptr staje sie nullem.

wlasnie to gdzies robisz w swoim projekcie, gdzie dokladnie jest blad? nie wiem, uzyj debuggera i sprawdz, ale uzycie samych wskaznikow powinno pomoc.

tutaj masz kod ktory powinien Ci rozjasnic bardziej

http://ideone.com/adH2xU

edit zeby nie bylo. Te dwie funkcje nie sa rownoznaczne. Jakby tam bylo

void funkcja1 (int **ptr)

a wywolanie byloby funkcja1(&ptr) wtedy byloby to samo co z referencja. albo uzywasz referencji albo wskaznika. Nie Uzywaj referencji na wskaznik bo to jakbys uzyl wskaznik na wskaznik

0

a wywolanie byloby
funkcja1(&ptr) wtedy byloby to samo co z referencja. albo uzywasz
referencji albo wskaznika. Nie Uzywaj referencji na wskaznik bo to
jakbys uzyl wskaznik na wskaznik

Rozumiem, ale problem w tym, że plik main jest narzucony przez prowadzącego labolatoria dlatego nie mogę zmienić w nim ani literki, bo wtedy bym tak nie kombinował niepotrzebnie. W każdym razie wydaje mi się, że nie w tym rzecz mimo wszystko, bo sprawdzałem to przekzywanie wszędzie i wszystko działa pomijając ten get nieszczęsny, a w zasadzie nieszczęsna dealokacja, bo jak sobie napisze //delete help, to wszystko działa jak należy tylko, że programy są sprawdzane też pod względem wycieków pamięci także nie mogę tego tak zostawić.

W sumie, to nawet przechodzi tego pierwszego get'a. Bo na wyjściu mam:

[jeden, dwa, trzy, cztery]
[cztery, trzy, dwa, jeden]
[jeden, dwa, trzy, cztery]
[cztery, trzy, dwa, jeden]
cztery
Segmentation Fault

Czyli pierwszy get przeszedł i wypluł "cztery", więc musiało wszystko pójśc, później chce wziąć drugi element drugim get'em i coś mi nie pasuje, nie wiem co : O, może zmiana tego f jest coś nie tego?

dodanie znacznika <code> dla wyjścia - fp

0

To jest jakiś mega WTF.
Działasz w C++ a używasz technologii z C rodem?
Albo rób w C albo w C++ taka mieszanina do niczego dobrego nie prowadzi.
W C to musi wyglądać mniej więcej tak: http://ideone.com/X8r6Y6;

0

Działasz w C++ a używasz technologii z C rodem?

Albo rób w C albo w C++ taka mieszanina do niczego dobrego nie prowadzi.

Nie wątpie, ale takie jest zadanie podane przez prowadzącego niestety.

0

To znaczy jakie?
Zrobić dziwoląga w C++ na wzór C ?

0

Generalnie założenie jest takie, że dostajemy na laborkach main.cpp a resztę mamy dopisać, to jest jeden z takich main-ów z poprzedniego roku także no : )
W sumie to można stworzyć klasę i metody dla niej i wywoływać metody w tych funkcjach, które są w main'ie, będzie wtedy łatwiej ?

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