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