Nowe posty

Autor Wątek: kolejki w C  (Przeczytany 4411 razy)

popiolkas

  • Gość
kolejki w C
« dnia: 2009-05-20, 13:54:31 »
Tresc zadania: Napisz program, ktory utworzy lancuch n procesow. Proces i-ty powinien komunikowac sie z procesem (i+1) szym za pomoca indywidualnej kolejki i dzialac zgodnie z nastepujacym schematem:

a) i=1 - proces pobiera dlugosc kolejki (parametr n) oraz tresc komunikatu ze standardowego wejscia, nastepnie wysyla komunikat do kolejki laczacej go z procesem (i+1)szym, konczy dzialanie

b) 1
c) i=n- proces odbiera komunikat z kolejki laczacej go z procesem (i-1)szym i usuwa ta kolejke, nastepnie wypisuje go na stand. wyjscie, konczy dzialanie


podczas pracy nad programem natknalem sie na dziwny blad,
wyglada mi to na jakies problemy zwiazane z pamiecia (nadpisywanie
pamieci?),

sory za balagan w kodzie ale nie mialem czasu poprawiac kosmetyki, a pastebin jeszcze namieszal:)

http://pastebin.pl/8209 oto kod:) pozdrawiam i z gory dzieki za pomoc

jk33

  • Gość
kolejki w C
« Odpowiedź #1 dnia: 2009-05-20, 17:46:54 »
1) gcc -Wall -pedantic wskaże Ci pierwszy błąd.
2) Jakie argumenty powinieneś podać funkcji msgrcv?

Edit:
3) W tablicy o długości 11 jesteś w stanie zmieścić string o długości tylko 10!

popiolkas

  • Gość
kolejki w C
« Odpowiedź #2 dnia: 2009-05-20, 23:50:14 »
ja juz nic nie wiem;( poddaje sie.... kolego jak wiesz o co chodzi to b. prosze pomoz:) pozdr

jk33

  • Gość
kolejki w C
« Odpowiedź #3 dnia: 2009-05-22, 19:31:24 »
Cytat: popiolkas
ja juz nic nie wiem;(
To znaczy czego nie wiesz?
I gdzie szukałeś już rozwiązania?

goscccccccccccc

  • Gość
kolejki w C
« Odpowiedź #4 dnia: 2009-05-25, 14:05:46 »
popiolkas, podzielisz się kodem??

wiewiorek

  • Gość
kolejki w C
« Odpowiedź #5 dnia: 2009-06-02, 04:15:42 »
Hmm, szkolny błąd:)
Źle "wywróżyłeś" wartość stałej COMM_SIZE. Wykasuj ją i nie używaj.
W procedurach msgsnd i msgrcv do parametru określającego ilość danych użyj sizeof(buff) lub sizeof(struct comm_str), w zależności co wysyłasz i odbierasz.

Z tego co widać w kodzie to sizeof(struct comm_str) jest na pewno różne od COMM_SIZE, co powodowało przesyłanie za małej ilości danych.

Dla leniwych polecam program-kombajn "valgrind", automatycznie wykrywający część wycieków i nieprawidłowych dostępów do pamięci. Ponieważ korzysta z danych debugujących należy przy kompilacji programu użyć przełącznika -g (wtedy valgrind pokaże nam gdzie dokładnie w naszym kodzie pojawiają się błędy).
Mi tu pomógł wystawić szybką diagnozę.