Program finalnie ma być czytnikiem RSS, są jednak pewne problemy, które mam nadzieję, że pomożecie rozwiązać. O dziwo problematyczna funkcja działa jak należy na ubuntu, a na windowsie wyskakuje okienko z komunikatem, że program przestał odpowiadać.
Mam zdefiniowany typ ze strukturą (ktoś wie jak to się naprawdę nazywa? [bo chyba nie typ ze strukturą:p]):
typedef struct dane_kanalu {
struct dane_kanalu *nast;
char *tytul; /* na razie testuje tylko na tytule */
long poczatek;
long koniec;
} kanaly_rss;
Stworzyłem funkcję wyszukującą i zapisująca pozycje zaraz za znacznikiem otwierajacym [poczatek] i przed zamykajacym [koniec]. Nazwa znacznika jest podana w parametrze funkcji. np. <title>[POCZATEK]Tytuł wiadomości[KONIEC]</title> (mam nadzieję, że jest to zrozumiałe). Funkcja również w parametrze pobiera czy ma zapisać dane do struktury czy do tablicy dwuelementowej.
Na początku uruchamiam funkcję aby wyszukała początek i koniec każdej wiadomości (znacznik <item>...</item>), poźniej zapisuje te pozycje do struktury i tak powstaje lista struktur zawierających wypełnione jedynie pola poczatek i koniec (czyli pozycji od których zaczyna się dana wiadomości i kończy).
Do tej pory program działa bez żadnych zastrzeżeń.
Stworzyłem również drugą funkcję która ma za zadanie wyświetlić np. wszystkie tytuły wiadomości[co ma wyświetlić jest podane w parametrze].
Funkcja wygląda tak:
int zapisz_element( kanaly_rss *kanal, FILE *file, char *szuk ){
kanaly_rss *wsk=kanal;
int i=1;
long save[2] = { 0 }; /* tylko 1 element ma byc 0 */
long ile;
while( wsk != NULL ){
fseek(file, wsk->poczatek, 0);
szukaj_krancow(wsk, file, szuk, save);
ile = save[1] - save[0]+1; /* +1 bo np. "abc" -> 'c' znak 3., 'a' znak 1. -> 3-1=2 */
fseek(file, save[0]-1, 0); /* -1 bo funkcje odczytuja nastepny znak */
/* 1 */
wsk->tytul = malloc((ile) * sizeof(char));
if(fgets(wsk->tytul, ile+1, file) == NULL) return -1; /* +1 dla znaku '\0\' */
printf ("Tytul %d: %s\n", i, wsk->tytul);
wsk = wsk->nast;
++i;
save[0] = 0;
}
return 0;
}
Co nie działa?
Program zawiesza się jedynie na windowsie(tylko na 7 testowałem) na Ubuntu działa bez problemów. Moment w którym przestaje odpowiadać chyba zależy od tego jaki plik (plik to oczywiście ściągnięty i zapisany kanał RSS [w tym prawie na 100% nie ma błędu bo robię to ręcznie]) przetwarza, ponieważ przy różnych plikach przy innej (czasami się oczywiście powtórzy) wiadomości się zawiesza, ale dla danego pliku __zawsze__przy tej samej wiadomości (zrozumiałe? chyba tak).
Nie wiem co jest dokładnie źle, ale zawsze zawiesza się program przy którymś tam przypisaniu adresu zarezerwowanej pamięci do wsk->tytul (linia po /* 1 */). Na 100% program się nie zawiesza z powodu braku pamięci [chyba oczywiste bo malloc inaczej wtedy reaguje :p, poza tym niektóre pliki posiadające 60+ wiadomości odczytuje bez problemu a niektóre przy 10 wiadomości się zawiesza)
Co już próbowałem robić?
Próbowałem w miejsce /* 1 */ wstawiać różne rzeczy:
Przy wstawieniu:
printf("dziala?");
malloc(1);
printf("zarezerwowalo");
REZULTAT: Program wyświetla tyle razy "dziala?zarezerwowalo" ile razy poprawnie wyświetla wiadomość. Przy wiadomości przy której się zawiesza widoczny jest jedynie napis "dziala?"
Przypominam, że błąd występuje jedynie na moim laptopie z windows 7 przy Ubuntu nie było tego problemu.
Program kompiluje się bez błędów i ostrzeżeń z flagą -Wall.