Gwóźdź w głowie

Jun 08, 2006 5 Replies

Witam Ten gwóźdź to algorytm programu w C51 z którym nie mogę sobie poradzić. To co napisałem zajmuje koszmarnie dużo pamięci a sądzę i jestem pewien, że jest prostsze rozwiązanie.(siedzi mi to w głowie jak ten gwóźdź, którego nie mogę wyciągnąć). Chodzi o to, że mam ciąg liczb naturalnych powiedzmy: 3,4,5,6,7,8,9,10,11. Jeśli je ponumerujemy od 1 to mamy ich razem 9. Do numeru liczby jest przyczepione okno o szerokości np. 5. Ilość liczb jak i szerokość okna są dowolnie wybierane(oczywiście szerokość okna nie może być większa od ilości liczb. To tytułem wprowadzenia. Załóżmy, że numer liczby jest 3 to w oknie widzimy 5,6,7,8,9. W tym momencie jest to proste, ale sytuacja komplikuje się, gdy numer liczby osiągnie np. 8. Wtedy w oknie będziemy widzieli:



10,11,3,4,5. Itd. itp. Może ktoś rozpracował podobny problem i pomoże wyciągnąć mi ten gwóźdź. Z góry dzięki za podpowiedzi.

Użytkownik "ZbychJ" snipped-for-privacy@wp.pl napisał w wiadomości news:e685p9$nt5$ snipped-for-privacy@atlantis.news.tpi.pl...

Nie wiem w czym problem z tą pamięcią, nie piszesz jak duży jest ten ciąg, jeśli ładujesz go do jakiejś tablicy, to sprawa jest banalna, deklarujesz tablicę , a potem w pętli powtarzasz funkcję succ( ) , która poda Ci następny element ciągu. Jeśli ciąg jest za wielki na sensowną tablicę, to robisz pętlę w pętli, jedna zwiększa liczbę wynikającą z szerokości okna, a w dugiej sprawdzasz czy osiągnąłeś max liczbę w ciągu, jeśli tak to zmieniasz ją na min liczbę w ciągu i kontynuujesz .... Piotr Ps. sprawdź składnię bo succ używałem kilkanaście lat temu :)

Użytkownik "ZbychJ" snipped-for-privacy@wp.pl napisał w wiadomości news:e685p9$nt5$ snipped-for-privacy@atlantis.news.tpi.pl... W tym momencie jest to proste, ale sytuacja komplikuje

Jak duża jest ta tablica? Jeśli masz miejsce w pamięci to może wpisać ją do pamięci dwa razy tzn:

3,4,....11,3,4..11 i szukać tylko do połowy.(Jesli okno bedzie max. wielkośc tablicy) pozdrawiam, Andrzej

Użytkownik "ZbychJ" snipped-for-privacy@wp.pl napisał w wiadomości news:e685p9$nt5$ snipped-for-privacy@atlantis.news.tpi.pl...

Uzyj modulo;> W X masz adresa tablicy, w Y przesuniecie.

y<- numer liczby -1 (-1 bo numerujesz liczby od 1) 'wypiszujesz', dodajesz jeden, liczysz mod, 'wypisujesz'.. i tak 5 razy

pozdr bartekltg

A co znaczy "zabiera koszmarn¹ iloœæ pamiêci"?

20 bajtów czy 500bajtów?

Masz tablicê, je¿eli to tablica elementów jednobajtowych o rozmiarze <256 to jaki problem?

Ustawiasz wskaŸnik na konkretny element tablicy i odczytujesz dane pocz¹wszy od wskaŸnika do zadanej d³ugoœci okna. WskaŸnik po inkrementacji poddajesz operacji modulo (rozmiar tablicy) i masz obliczony aktualny wskaŸnik, albo sprawdzasz wartoœæ wskaŸnika <rozmiar tablicy+1, jesli nie to go zerujesz.

Pozdrawiam Darek

unsigned char tab[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11 }; unsigned char okno = 5; unsigned char numElements = sizeof( tab ) / sizeof( tab[0] );

void wypisz_okno( unsigned char index ) { unsigned char i; if ( --index >= numElements ) { // Blad, index spoza dozwolonego zakresu <1, numElements>

return; }

for ( i = 0; i < okno; ++i ) { printf( "%u", tab[index] ); // wypisz wartosc elementu if ( ++index >= numElements ) index = 0; } }

zamiast kodu if ( ++index >= numElements ) index = 0; mozesz zastosowac jednolinijkowca index = ( index + 1 ) % numElements; ale tamten pierwszy nie ma dzielenia wiec wykona sie szybciej, no chyba ze masz wartosc numElements rowna potedze 2 wtedy kompilator moze zoptymalizuje to do wyrazenia AND bitowe np numElements = 4 ->

index = ( index + 1 ) & 0x03;

Mariusz

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required