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

Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

18. 1. 2024, 7:14

robokop píše: 18. 1. 2024, 7:02 Je zajimave ze mas s timhle problem
Ja na to nikdy nenarazil
Buď rád. Třeba Norbertu Schnechnerovi (autor Gmoccapy) se ten problém podařilo nasimulovat jen jednou na nějakém starém PC, jinak ne. Takže, když ho nemůže pořádně nasimulovat, tak ho nemůže ani opravit. Jsem rád, že na EN fóru aspoň nikdo nezpochybňuje, že ten problém existuje.

Jsem si kvůli tomu koupil nové PC a nepomohlo to. Mě se ten problém objevoval častěji. Teď mám dočasně smazané řádky zajišťující automatické G43.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22400
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

18. 1. 2024, 7:25

To je hodne zajimave.
A co tam dat G04 🤣
Vsechna prava na chyby vyhrazena (E)
atlan
Příspěvky: 3347
Registrován: 7. 2. 2011, 9:12

18. 1. 2024, 8:22

emctaskmain.cc nema subor hh.?

Mozes tu nahray obidva subory?
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

18. 1. 2024, 8:46

robokop píše: 18. 1. 2024, 7:25 To je hodne zajimave.
A co tam dat G04 🤣
Bohužel G04 je pro interpretr příkaz jako každý jiný, takže to nic neřeší. Tohle jsem zkoušel jako první.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

18. 1. 2024, 8:49

atlan píše: 18. 1. 2024, 8:22 emctaskmain.cc nema subor hh.?
Nemá
https://github.com/LinuxCNC/linuxcnc/tr ... c/emc/task
atlan píše: 18. 1. 2024, 8:22 Mozes tu nahray obidva subory?
https://github.com/LinuxCNC/linuxcnc/bl ... f/halui.cc
https://github.com/LinuxCNC/linuxcnc/bl ... askmain.cc
LinuxCNC - MESA 7i96
zz912.webnode.cz
atlan
Příspěvky: 3347
Registrován: 7. 2. 2011, 9:12

18. 1. 2024, 9:49

Tak najednoduchsie asi bude uoravit nejaky spolocny subor napr <signal.h> tam umiestnit premenu. Po preklade by mala byt dostupna v oboch suboroch. Cc

Otazka je ci sa nebude linux vzpierat, a bude to fungivat len tebe, lebo upravis kniznicu ktora je standartizovana, a po updejte prekladaca a danejnkniznice ti to nepojde znova zkompilovat.

Proste prasacina. Ale na skusku....
Uživatelský avatar
Radhard
Příspěvky: 288
Registrován: 1. 7. 2020, 10:19
Bydliště: Praha
Kontaktovat uživatele:

18. 1. 2024, 4:52

Úplně do LCNC nevidím, ale nějaká možnost předávání (sdílení) přes společnou sdílenou paměť asi možná je. Použil to kolega ve firmě pro jeden testovací program. Ale nepsal jsem to, tak podrobnosti nevím.
Možná rychlejší to bude vyřešit přes nějakýho démona (zavede se jako první), se kterým obě aplikace komunikují přes socket a on pro ně udržuje ve "své" paměti sdílené informace.
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

18. 1. 2024, 5:40

Vyzkoušim to pres ten signal.h, ale stejne to nebude reseni hodno PullRequestu. Co jsem pochopil, tak LCNC je postaveny na NNL. NeutralMessageLanguage. Asi to NML budu muset nastudovat.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
CZ_Pascal
Příspěvky: 870
Registrován: 14. 1. 2008, 8:24
Bydliště: Brno

18. 1. 2024, 5:50

Zdravím vespolek,

Přiznám se že jsem už utahanej abych studoval jak to napasovat, ale zkus jestli by ti neposloužila sdílená paměť kterou používala třeba kinematika ProbeKins.

Zkus vygooglit něco kolem rtapi_shmem_new

LinuxCNC má mechanismus, kde přes "klíč" (obyčejný Int) můžeš alokovat paměť a stejně tak se pak z jiného "procesu" na toto místo "dostat" jak pro čtení tak pro zápis a to tak že i v realtime výpočtech.

Trochu jsem si s tím hrál pro přiohnutí mechanismu ruční výměny nástroje a přemapování M6 a nějaké navázání na GUI v AXIS. Používám to tedy přes Python, ale o to větší je to občas opruz. (samozřejmě je to další z milionu rozdělaných úkolu, jejichž dokončení nevím jestli se dožiju)
miv
Příspěvky: 777
Registrován: 17. 9. 2019, 11:55

18. 1. 2024, 11:25

zz912 píše: 16. 1. 2024, 7:32 ...
Potřebuji eportovat proměnou "int halui_sent_mdi" z halui.cc do emctaskmain.cc.
...
Ta otázka je nesmyslná (promiň). Nic takového, jako exportování, v c-čku neexistuje. Mimochodem, ty soubory se sice jmenují s příponou cc, ale jsou to ve skutečnosti c-čkové zdrojáky. C++ je nadmnožina c-čka. C-čkový program c++ překladačem a linkerem bez problémů přeložíš a slinkuješ.

Je třeba rozlišovat mezi deklarací a definicí. V .h jde o deklaraci a je to vlastně jen oznámení o existenci. V .c jde o definici a je to povel pro kompilátor, aby daný objekt uložil do object souboru pro linker, který pak přidělí místo v paměti.

Pokud je proměnná s nějakým jménem nadefinována v nějakém zdrojovém souboru (tedy .c nebo .cc) - (nikoliv v hlavičkovém - tam jsou jen deklarace, nikoliv definice), a je externí (extern, což je default), pak extern proměnnou se stejným jménem nelze nadefinovat v jiném linkovaném .c souboru. Ta proměnná je v celém programu pouze jediná. I když je její definice přinesena prostřednictvím object filu a máš k ní v čitelné formě jen deklaraci v nějakém hlavičkovém souboru.

Hlavičkové soubory slouží pouze jako deklarace. To znamená, že jen říkají, že proměnná s tímto jménem existuje a je někde (v .c souboru nebo linkovaném obj souboru, jde-li o knihovnu) nadefinována. Stejná proměnná může být deklarována klidně ve více .h souborech a vůbec to nevadí (pochopitelně musí být deklarována stejně, jinak kompilátor řve).

Takže, pro tvůj případ platí, že, pokud jsi nadefinoval v nějakém svém .c souboru danou proměnnou a linker neřval, pak jsi nelinkoval object file s původní proměnnou. Sice se to přeložilo, ale byla to jiná proměnná, než jsi očekával (byla to ta "tvoje"). Proto to nefungovalo.

Samozřejmě extern proměnnou můžeš normálně používat a i do ní zapisovat. Ovšem následky jsou nedefinované, protože nevíš, jak s ní zachází ten původní .c soubor (pokud k tomu nemáš zdrojáky a pracuješ jen s cizí knihovnou).
Milan199
Příspěvky: 2937
Registrován: 18. 8. 2010, 9:04

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.
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

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.
LinuxCNC - MESA 7i96
zz912.webnode.cz
atlan
Příspěvky: 3347
Registrován: 7. 2. 2011, 9:12

19. 1. 2024, 10:30

najdi kde v systeme sa nachadza <signal.cc> tam dopis svoju premenu napr: uint8 mojapremena = 0;
potom v <signal.hh> dopln toto: extern uint8 mojapremena;

tym ze je signal.hh zapisany v oboch tvojich suboroch ktore ta zaujimaju. tak mozes v jednom urobit toto. mojapremena = 0; a v druhom if (mojapremena == 1) "vykonaj nieco". plati reciprocne.

kludne uint alebo int , 8 az 32 neviem aku ti treba premenu napr int32, ale vsade musi byt rovnaka

mozno budes musiet pouzit carovne slovicko sudo a nautilus aby si mohol otvorit a zapisat sybory v <signal>
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

19. 1. 2024, 11:01

atlan píše: 19. 1. 2024, 10:30 najdi kde v systeme sa nachadza <signal.cc> tam dopis svoju premenu napr: uint8 mojapremena = 0;
potom v <signal.hh> dopln toto: extern uint8 mojapremena;

tym ze je signal.hh zapisany v oboch tvojich suboroch ktore ta zaujimaju. tak mozes v jednom urobit toto. mojapremena = 0; a v druhom if (mojapremena == 1) "vykonaj nieco". plati reciprocne.

kludne uint alebo int , 8 az 32 neviem aku ti treba premenu napr int32, ale vsade musi byt rovnaka

mozno budes musiet pouzit carovne slovicko sudo a nautilus aby si mohol otvorit a zapisat sybory v <signal>
Zkusim, jak se k tomu dostanu.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22400
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

19. 1. 2024, 2:00

Zasadni dotaz
Je nebo neni halui samostatny modul ktery se loaduje pri startu?
Jestli si dobre pamatuju tak je.
Tudiz to je z hlediska kernelu jiny program ktery bezi vpodstate nezavisle.
Vsechna prava na chyby vyhrazena (E)
Odpovědět

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