Komentarze do artykułu: Jak zlokalizować program czyli locale.library w praktyce

[#1] Re: Jak zlokalizować program czyli locale.library w praktyce
Witam Chciałem Ci zwrócić uwagę na pewny błąd, który popełniłeś w programowaniu biblioteli locale.library.



Funkcją OpenCatalogA() otwierasz (ładujesz do pamięci) plik z tłumaczeniem. Jeśli w pliku z tłumaczeniem znajduje się interesujący nas test, to funkcja GetCatalogStr() zwraca wskaźnik na ten tekst. Tekst do którego otrzymaliśmy wskaźnik, funkcją GetCatalogStr(), znajduje się w pamięci zarezerwowaej przez funkcję OpenCatalogA().

W swoim przykłądzie popełniasz poważny błąd. Otwierasz catalog, w liście textlist zapisujesz wskaźniki na teksty, które otrzymujesz funkcjami GetCatalogStr(), a następnie zamykasz catalog funkcją CloseCatalog(). W liście textlist masz wskaźniki na teksty których może już nie być w pamięci, gdyż zamknąłeś catalog.

Dlaczego program się nie wiesza? Dlatego że na Amidze wykonując funkcję Close..() nie usuwamy automatycznie z pamięci otwartego wcześniej obiektu. Obiekt zostanie usunięty z pamięci przez system w przypadku gdy będzie zapotrzebowanie na pamięć.

Funkcja Close...() zmniejsza tylko licznik użytkowników otwartego obiektu. Podczas zapotrzebowania na pamięć system usuwa wszystkie obiekty, których licznik użytkowników jest równy zero.



Problem nie odnosi się tylko do funkcji OpenCatalogA()/CloseCatalog(), ale również do innych par, np. OpenLibrary()/CloseLibrary().



Czyszczenie pamięci z nieużywanych obiektów można wykonać ręcznie przez polecenie avail flush (dokładnie nie pamiętam składni).



co robić?

1. zamykasz katalog dopiero na końcu programu, wtedy mamy pewność, że wszystkie teksty cały czas istnieją.

2. Jeśli chcesz koniecznie zamykać catalog po odczytaniu wszystkich tekstów, to jest to trochę trudniesze.

Po otrzymaniu wskaźnika na tekst funkcją GetCatalogStr() kopiujesz tekst gdzieś, np funcją StrCopy(). Jednak żeby gdzieś skopiować test oczywiście musisz zarezerwować na niego pamięć i potem pamiętać przed wyjściem z programu aby tą pamięć zwolnić.



Jak widać sposób 2 to niepotrzebne rozbudowywanie kodu, lepiej zastosować się do sposobu 1.



Grzegorz Chmiel

[#2] Re: Jak zlokalizować program czyli locale.library w praktyce
Jako dowód wklejam wycinek autodoca do biblioteki locale.library.



Unused catalogs are

automatically flushed from the system when there is not enough

memory.




czyli, nieużywane [zamknięte funkcją CloseCatalog()] catalogi są usuwane z systemu wtedy gdy brakuje pamięci.



Pod system Amiga OS nie programowałem już ładnych kilka lat (około 5), ale jeszcze zostały mi w głowie pewne podstawowe zasady programowania pod tym systemem. Programując należy się zawsze trzymać zaleceń znajdujących się w autodocach!! Byłem swego czasu w grupie programistów BlaBla, której celem było pisanie programów pod system AmigaOS zgodnie ze wszystkimi zaleceniami twórców systemu.



Grzegorz Chmiel

[#3] Re: Jak zlokalizować program czyli locale.library w praktyce

@melon, post #2

ZTCP Melon to miałeś okazję obejrzeć ten kawałek kodu lata temu w moim Multiview dla OS2.04+ (2b_mv na Aminecie). Nie jest to idealne, nie było i wtedy - ale jakoś działało dla mnie i tych kilkudziesięciu userów, którzy program zarejestrowali.



No i jakby nie patrzeć to kod przed ładnych paru lat jak stawiałem pierwsze kroki w programowaniu :) Dzisiaj AmigaE bym ominął szerokim łukiem.
[#4] Re: Jak zlokalizować program czyli locale.library w praktyce

@hrw, post #3

A wiesz że jak to pisałem, to nie skojażyłem, że to Ty i że to Twój program.
[#5] Re: Jak zlokalizować program czyli locale.library w praktyce

@hrw, post #3

Nie zapominajmy jeszcze o tabeli textlist, ktora zgodnie z deklaracja ma 12 elementow, ale dalej w programie jest uzywanych 18:



DEF textlist[12] : LIST



FOR a := 1 TO 18

textlist[a] := GetCatalogStr(catalog,a,textlist[a])

ENDFOR



:D
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem