Způsob psaní podprogramů v MP-LAB. Záleží v C na pořadí?

Pánové, opět mám zřejmě triviální otázku, ale přiznám se, že s ní bojuji už dost dlouho :slight_smile:.

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 … :slight_smile:.

Dík,

Vl.

:arrow_right: 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.

Vl.

není problém v bankách ?

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.

Asi dělám někde chybu já. Snad na to přijdu :slight_smile:
Vl.

zdravim…funkce ktere volate musi byt jiz uvedeny pred vlastnim volanim…
tedy:

funkce2() {/* dalsi neco */…;}

funkce1(){ /* zase neco */…; funkce2();}

main()
{ /* neco… */ …; funkce1();}

a nebo:

//tady jen reknete prekladaci ze tam ty funkce jsou…jednoduse receno.
funkce1();
funkce2();
// tu zacina program…
main()
{ /* neco… */ …; funkce1();}

funkce1(){ /* zase neco */…; funkce2();}

funkce2() {/* dalsi neco */…;}

na poradi nezalezi…

pokud ale volate navesti
…;
goto navesti;
…;
navesti:
…;

tak je chybe jinde…:slight_smile:

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í :wink:

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…