Jsem chtěl rozšířit svůj program o další level, ale z nějakého důvodu mi TurboPascal píše Error 1: Out of Memory. Přitom proměnných je pořád stejně a když jsem to testoval s jedním upgradem od Mircosofta, tak jich tam bylo ještě daleko víc. Momentálně to vypadá tak, že jsou tři levely hotové a pro 4. a 5. je připravená kostra. Když dám jakýkoliv z těch dvou do komentáře, spustí se to, ale jakmile jsou oba platné, vyskočí chyba. Nevíte někdo, čím to je a jak to obejít? Předem dík.
Fórum › Pascal
Error 1: Out of Memory
Ukazatele nepoužívám a kdybych udělal chybu u proměnných, které řídí cykly, tak to napíše něco Out of range, a já to kvůli knihovně pro zvuk mám vypnutý takže by se to spustilo tak jako tak a pak by to dělalo kraviny. Jak píšu: mám tři levely a kostru pro dva další, přičemž kostra znamená jen kopie staršího kódu (kterej funguje), do kterýho pak připíšu novej kód. Jemu vadí když jsou ty dva levely aktivní oba najednou, ale když je jeden nebo druhej danej jako komentář, tak se to spustí.
Jsem blbej já, nebo vy neumíte číst?
To Lukfi: Já sem na tom podobně jako survik1 sice sem v packalu dělal ale už je to nějakej čas. Ale napadá mě ještě jedna varianta. Myslím, že nám učitel říkal že pascal má při kompilaci omezení paměti kterou může využít tudíž když zkompiluješ svůj kód nevejdeš se do toho omezení a vyhodí to tuhle chybu. Jen hádám ale pokud mám pravdu tak se tam dá určitě někde nastavit velikost tý paměti. Opravdu to je spíš střela od boku.
=>Matrix17: Jo, je tady v menu volba Memory sizes a v ní:
Stack size ... 16384
Low heap limit ... 0
High heap limit ... 655360 (tedy 640KiB)
Když zvýším to první, tak se nic nestane, a to druhý nejde nastavit vyšší než co už tam je. Tak to je teda v pr...
To Lukfi: Tak pak mám ještě jednu variantu a to že by sis dal všechny informace o levelech do nějakýho externího souboru ze kterýho by sis je vytáhl když bys je potřeboval. Zkrátíš si tím zdroják a snad i ušetříš paměť.
A co používáš za pascal?? od borlandu?? kdyžtak zkus FreePascal, třeba by to v něm šlo. Kód by nemělo být potřeba nějak významně editovat.
=>Matrix17: Rozsekat na knihovny... hmm... procedury na kreslení by se teoreticky daly dát do knihovny, kdybych to přepsal tak aby si netahaly parametry z globálních proměnnejch ale aby se jim předávaly. Nebo myslíš nějakej datovej soubor, ze kterýho by to četlo? Mě spíš napadla jiná věc, ale s tím by mi musel někdo pomoct - využít nějakou rozšířenou paměť (XMS/EMS).
=>Chiquita_CZ: Používám Turbo Pascal 7.0, FPC mám taky, ale Mircosoftovy knihovny tam nefungujou...
=>Matrix17: no to je sice fajn, ale práci se soubory mě nikdo nenaučil :'( a kromě toho, jaký data? konstanty? počet proměnnejch jsem při přidávání levelu nezvýšil, tak nevím k čemu by mi to pomohlo...
To Lukfi: Práci se souborama vygooglíš. V tom souboru bych to viděl takhle. Nejprve šáhneš do souboru vytáhneš si data 1. levelu. Hráč odehraje. Šáhneš znova do souboru pro nový data ty starý se přemažou a jede se dál. Kdybys náhodou nemohl nic najít tak bych ti sem něco hodil.
Já si to ale pořád nedokážu představit. Pro každý level se předem přiřazuje maximálně 10 hodnot, zbytek se generuje náhodně nebo se přiřazuje během hraní podle time indexu. Jinak to vypadá přibližně takhle:
velký REPEAT cyklus
case level:byte of
0: hlavní menu, pak jsou 254, 253, 250 různý vypisovací obrazovky, to neni důležitý
1: level
levelmenu
nastavení proměnných
malý repeat cyklus
until podmínky ukončení levelu - různé
end;{case}
UNTIL level=255
Těch levelů je dohromady 5 (dva z toho jsou teda jenom základ, kterej je stejnej pro všechny levely, např. ovládání. Jinak se ty levely liší právě podle toho kódu, každý vypadá úplně jinak, nejsou to jen "úrovně" které se liší jen rychlostí hry nebo počtem něčeho. Na začátku programu jsou definované všechny proměnné, jejich počet se s přidáváním levelů nezvyšuje (druhý level totiž potřebuje hodně souřadnic a ve třetím levelu jsou ty dvě pole tak porůznu použitý na všechno možný).
Takže jaký data bych tam jako měl načítat? :-|
Pokud možno co nejvíc dat který zůstavaj stejný. Pak se pokus aby co nejvíc proměnný který potřebuješ "chvilku" byly dostupný "chvilku". Myslím tím zavoláš funkci/proceduru která si vytvoří nějaký lokalní proměnný, který budou "dělat" to, co bude potřeba. Jakmile procedura/funkce skončí tyhle proměný odpadnou a je to.
Můžu leda udělat knihovnu a do ní si naházet procedury na kreslení, ale to je tak všechno. Data, který zůstávaj stejný, toho je minimum. Lokální proměnné nepoužívám, na všechno používám globální které jsou potřeba tak jako tak třeba v jiných levelech. Takže bych leda mohl udělat levely jako procedury a všude by se alokovaly nějaké lokální proměnné. Ale nevím, jestli by to pomohlo, protože ty se tváříš, jakože vůbec nebereš na vědomí tohle:
***********************************************
S počtem levelů neroste počet proměnných.
***********************************************
Na počtu vůbec nezáleží. Když budeš mít pole který má sto prvků. Tak záleží nejen na počtu ale hlavně na typu. Protože pole který má typ char bude mnohem menší než pole který má typ integer atd. Takže na počet se nezaměřuj. Teď teda k proměnejm. Prober se jima a ověř si jestli by nešli použít menší (místo integer short, místo longint integer - nejsem si jistej názvama v C++ je to trochu jinak) případně jestli někde nepoužíváš zbytečně velký pole než je třeba.
Proměnný používám jen takový co jsou třeba. Ale tím to nebude. V předchozí verzi programu jsem měl dvě pole, dohromady asi 80 longintů, než mě napadlo to otočit a mít 2 longinty a 160 integerů (plus jak jsem psal, jsem testoval jeden upgrade, kde bylo potřeba ještě další pole 80 integer nebo word a 80 shortint - a nebyl problém). Těch 160 integerů je potřeba pro jeden level - no asi by to šlo vyřešit i líp, ale pak stejně potřebuju v dalších levelech jiný proměnný, byť teda na ně stačí byte/shortint a ty si ukládám do toho pole. No každopádně jak se ti celou dobu snažím vysvětlit: se současnou sadou proměnných to chodilo dřív, neměnil jsem ani počet, ani typy.
Ale přišel jsem na jinou věc. Jen tak experimentálně jsem komentářem zrušil dvě procedury (kreslení, který v současnejch levelech nepotřebuju) a jelo to. Takže když udělám na kreslení knihovnu, budu mít zase nějakej prostor. Ale jenom to můj problém oddálí - za pár tejdnů si tu budu stěžovat zase. Chce to nějaké Endlösung.
Out of memory je chyba překladače, kterému nestačí paměť na překlad. S počtem ani velikostí proměnných vůbec nesouvisí, jenom s délkou kódu (= programu) a konstant. Objevuje se mi poměrně často a řeším ji takhle:
1) Compile -> Destination: disk (jestli to tak ještě nemáš)
2) Options -> Compiler -> vypnout Debug info a Local symbols (to ušetří docela dost)
3) Options -> Linker nebo tam někde -> nastavit Link buffer na disk (píše se o tom v helpu)
3) Compile -> Build. Kdyby nešlo všechno najednou, tak nejdřív buildni zvlášť všechny použité jednotky a až potom program (mimochodem, když program spustíš přes Ctrl+F9 těsně po buildu, tak v něm budeš mít mnohem víc volné paměti).
Kompiluješ v TURBO.EXE nebo v TPX.EXE? TPX má volné paměti daleko víc, protože překladač sídlí někde v HMA nebo tak nějak.
Už je to lepší?
Moje stránka.
Tak jsem vypnul to debuggování a přenastavil Link buffer na disk, a jede to. Kompiluju přes turbo.exe. Tak díky, pak když to zase nepůjde zkusím ten tpx.exe.
//update: tak evidentně žádnej TPX.EXE nemám...
Koukni ke mně do "užitečných drobností", první odkaz nahoře, první zip-soubor s exáčema, tam ho najdeš.
Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Fatal error: Allowed memory size — založil Franceq
MS Visual c++ 2010 - fatal error LNK1102: out of memory — založil Loli
Memory leak — založil CommanderZ
Memory exhausted — založil m->29
Moderátoři diskuze