Pánové, opět mám zřejmě triviální otázku, ale přiznám se, že s ní bojuji už dost dlouho .
Záleží na pořadí psaní jednotlivých podprogramů v MP-LAB? Setkávám se často s tím, že se v programu odkáži na návěští, které je uvedeno na téže stránce o pár řádků dále a překladač mi oznámí, že návěští nebylo definováno. Pak stačí, když tento kratičký podprogram s “neexistujícím” návěštím přesunu o pár řádků výše, aby byl nad tou částí programu, odkud jej volám a vše je OK.
Připadá mi to, jako by muselo být nejprve překladačem rozpoznáno návěší a teprve potom “uzná” odkaz na něj, ale to je přece nesmysl - to bych musel neustále myslet na to, kde která návěší a odkazy na ně mám.
Asi je to nějaká blbost, které se zasmějete, ale zkuste, prosím … .
Dík,
Vl.
administrator: přejmenováno z "Způsob psaní podprogramů v MP-LAB"
Cau, todle se my stava v Cku , uplne posledni musi bejt main a z toho volat podprogramy nad nim jakmile neni volani nad ,neexistuje, ale v ASM se my todle este nestalo (teda co si este pamatuju), takze krom C s tim nemam problem (tet uz sem v ASMku dlouho nic nesesmolil)
edit: mozna skus hodit kod kde s tim mas problem, skusim to
Pří psaní programu v C je normální že bez deklarace můžeš volat pouze směrem nahoru, ale pokud napíšeš v úvodu deklaraci, můžeš volat kam chceš. Jak je to u ASM si už nepamatuji.
No, teď mi to pro změnu zase funguje …
Trošku jsem to pročistil, vyházel jsem vše, co není bezpodmínečně nutné a i když mám hlavní program “nahoře” a podprogramy, na které se obrací, až pod ním, jede to. Ted už se k tomu nebudu vracet, ale jakmile se to opět objeví, pošlu ukázku. Zatím dík.
V ASM to problém nedělá, akorat si musíš ošetřit PAGE, pokud jsi v PAGE0 a volaš do PAGE0, tak to musí fungovat, i kdyby jsi měl návěští kdekoliv v PAGE0. Pokud před voláním nastavíš pagesel, tak je jedno, kde to je v celé paměti.
Chlapi, to jsou základy C. Pokud cheš funkci definovat až za mainem, před main musíš vložit její prototyp.
Když budeš mít
void funkce1(void)
{
// telo funkce
}
až za mainem, před main musíš vložit
void funkce1(void);
Tedy
[code]#include …
void funkce1(void);
void main(void)
{
funkce1();
}
void funkce1(void)
{
// telo funkce
}[/code] normálně projde.
Hlavně když pak upravíte hlavičku funkce, nezapomeňte to změnit i na začátku, překladač vás možná neupozorní
Pokud máš namysli psaní v C,jen se zeptám, funkce deklaruješ i definuješ?.Pokud je to v ASM,měníš obsah PCLATH,např. při goto,nebo skoku na tabulku?Ten se musí samozřejmě měnit,pokud přecházíš na “jinou stránku” v paměti.Taky pozor na skoky např. při instrukcích btfss…