Kolejka fifo, funkcja pobierająca element, segmentation fault

Kolejka fifo, funkcja pobierająca element, segmentation fault
ĄO
  • Rejestracja:około 12 lat
  • Ostatnio:3 dni
  • Postów:238
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

edytowany 3x, ostatnio: flowCRANE
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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)

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

pracujesz na nullu...

edytowany 2x, ostatnio: fasadin
ĄO
  • Rejestracja:około 12 lat
  • Ostatnio:3 dni
  • Postów:238
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.

fasadin
nie zobaczylem tego, sorki. Zobacze jeszcze raz
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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

Kopiuj
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

Kopiuj
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

Kopiuj
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

edytowany 5x, ostatnio: fasadin
ĄO
  • Rejestracja:około 12 lat
  • Ostatnio:3 dni
  • Postów:238
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:

Kopiuj
[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

edytowany 2x, ostatnio: flowCRANE
fasadin
bez debugerra nie moge Ci pomoc bo nie widze bledu tak na oko. Uzyj debuggera on Ci pomoze znalezc blad.
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:18 dni
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;


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
ĄO
  • Rejestracja:około 12 lat
  • Ostatnio:3 dni
  • Postów:238
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.

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:18 dni
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
fasadin
no chyba tak, skoro main podal prowadzoncy, a tam uzywa tych rzeczy wlasnie jak na wzor c, z domieszka c++. Ale zgodze sie z Toba ze takie cos jest bezsensu.
ĄO
  • Rejestracja:około 12 lat
  • Ostatnio:3 dni
  • Postów:238
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 ?

edytowany 1x, ostatnio: Ąowski

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.