C++ export proměné skrze hlavičkový soubor

Uživatelský avatar
robokop
Site Admin
Příspěvky: 22399
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

19. 1. 2024, 2:14

Potvrzeno
Loadusr halui
Tzn halui je samostatny program nezavisly na dalsich modulech tudiz sdileni promennych neni mozne.
Musis to udelat prez NML
Vsechna prava na chyby vyhrazena (E)
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

19. 1. 2024, 5:06

robokop píše: 19. 1. 2024, 2:14 Potvrzeno
Loadusr halui
Tzn halui je samostatny program nezavisly na dalsich modulech tudiz sdileni promennych neni mozne.
Musis to udelat prez NML
Dik. Tech pokusů pres hlavickovy soubor jsem udelal mraky a nic nevedlo k uspechu.
LinuxCNC - MESA 7i96
zz912.webnode.cz
miv
Příspěvky: 777
Registrován: 17. 9. 2019, 11:55

19. 1. 2024, 6:15

zz912 píše: 19. 1. 2024, 8:44
miv píše: 18. 1. 2024, 11:25 Ta otázka je nesmyslná (promiň). Nic takového, jako exportování, v c-čku neexistuje.
Omlouvám se za svou neodbornost. Se vším, co píšeš souhlasím, bohužel v praxi mi to nefunguje. Něco dělám blbě. nevím kde všude mám psát extern, jestli mám používat extern static, jestli musí/by měli být definovány proměnné ve všech souborech atd. Ono do toho budou vstupovat ty podprogramy, moduly jak to tady nazývají. Použil jsem schválně slovo exportovat, protože se nechci omezovat je na hlavičkové soubory.

Takhle vypadá koncepce LCNC:
LinuxCNC-block-diagram-small.png
http://linuxcnc.org/docs/stable/html/co ... notes.html

Není mi jasné, jestli se mám snažit "propojit" ty soubory přes hlavičkový soubor a nebo přes NML. Také mi není jasné, jestli halui patří do boxu GUI v diagramu.
Já ten systém makefilů pro linux cnc neznám. Psal jsem Ti pouze obecně, jak funguje překladač a linker.

Obecně v hlavičkovém souboru ta deklarace nedělá nic, jen musí být stejná jako ta, která je v c-čkovém souboru. Deklarace z hlavičkového souboru se používá pouze jako informace o tom, že daná proměnná je definována někde v nějakém c souboru nebo dokonce jen v obj souboru.
Prefix extern psát nemusíš nikde. Je to totiž default.

Pokud je v c-čkovém souboru nějaká proměnná definována jako static, pak je lokální v tom daném souboru a nemůžeš se na ni odkazovat nikde jinde, než právě v tomto souboru. Odjinud je neviditelná. Samozřejmě pokud se ti nepodaří pojmenovat svoji statickou proměnnou stejně, jako nějakou externí definovanou v jiném souboru.

Pár příkladů

Mějme soubor mojepromenne.c s obsahem

int a = 0; // definice proměnné externí viditelné i odjinud
extern int b = 15; // definice proměnné externí viditelné i odjinud
static int c = 5; // definice statické proměnné viditelné jen v tomto souboru
// na zaklade výše uvedených definic překladač zařazuje popisy promennych pro linker, který je následně umístí do paměti a odkazy na ně nahradí příslušnými adresami.

mojepromenne.h
#ifndef mojeprom_h

int a; // deklarace proměnné a definovane v souboru mojepromenne.c
int b; // deklarace proměnné b definovane v souboru mojepromenne.c

// tyto deklarace můžeš začlenit do svých .c souborů pomocí direktivy #include a v těchto souborech je pak používat.
#endif

Pokud chceš upravovat zdrojové soubory a případně psát vlastní kód, musíš se to c-čko opravdu naučit. Nelze programovat bez základní znalosti, jak funguje překladač a linker a co dělají. Pokud mohu doporučit, začni s jednoduššími věcmi. Viz např. klasický helloworld.c.
StoupaCZ
Příspěvky: 543
Registrován: 2. 6. 2017, 8:12

19. 1. 2024, 8:36

To, že se to kompiluje do jiného modulu (binárky) bylo zřejmé už z toho prvního logu, kde byly vypsány i vstupující object files. Nemá tedy cenu se pokoušet to dělat pomocí extern, protože to nemůže z principu fungovat.

CZ_Pascal ti tady radil, že máš použít rtapi_shmem, to vypadá jako cesta. Pokud nevstřebáš z té dokumentace jak to funguje, nemá opravdu smysl sahat do tak rozsáhlého projektu jako LinuxCNC. Ty znalosti jsou opravdu potřeba, musíš vědět co děláš.

Binárkami jsem myslel samostatný binární soubor, který se natahuje do paměti jako samostatný program, nebo knihovna. Jak už psal Robokop, nelze přistupovat přímo do paměti jiného programu, to šlo v dřevních dobách ale protože je to bezpečnostní riziko, bylo to záhy ošetřeno.
Sieg SX4, Interkrenn IKD-400, Vernier Minishape 28
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

19. 1. 2024, 8:58

Chtel bych Vám všem podekovat za zprávy. Posunulo me to dál.
LinuxCNC - MESA 7i96
zz912.webnode.cz
miv
Příspěvky: 777
Registrován: 17. 9. 2019, 11:55

19. 1. 2024, 10:28

Milan199 píše: 19. 1. 2024, 8:29 to miv
Moc díky za poučný příspěvek.
Škoda že od tebe není učebnice k céčku.
Děkuji za pochvalu. Přímo se rdím. Ale ta učebnice již existuje. Napsali ji pánové Kernighan a Richie okolo roku 1970 nebo tak nějak. A je to tenké a výborně pochopitelné. A, popravdě řečeno, nikdo nic lepšího od té doby nevymyslel. Všechny moderní jazyky jsou víceméně klony téhož. I když jistý "mírný pokrok v mezích zákona" přece jen nastává.
Odpovědět

Zpět na „LinuxCNC - drive pod nazvem EMC2“