Stránka 2 z 3

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

Napsal: 18. 1. 2024, 7:14
od zz912
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.

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

Napsal: 18. 1. 2024, 7:25
od robokop
To je hodne zajimave.
A co tam dat G04 🤣

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

Napsal: 18. 1. 2024, 8:22
od atlan
emctaskmain.cc nema subor hh.?

Mozes tu nahray obidva subory?

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

Napsal: 18. 1. 2024, 8:46
od zz912
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í.

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

Napsal: 18. 1. 2024, 8:49
od zz912
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

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

Napsal: 18. 1. 2024, 9:49
od atlan
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....

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

Napsal: 18. 1. 2024, 4:52
od Radhard
Ú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.

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

Napsal: 18. 1. 2024, 5:40
od zz912
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.

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

Napsal: 18. 1. 2024, 5:50
od CZ_Pascal
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)

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

Napsal: 18. 1. 2024, 11:25
od miv
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).

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

Napsal: 19. 1. 2024, 8:29
od Milan199
to miv
Moc díky za poučný příspěvek.
Škoda že od tebe není učebnice k céčku.

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

Napsal: 19. 1. 2024, 8:44
od zz912
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.

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

Napsal: 19. 1. 2024, 10:30
od atlan
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>

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

Napsal: 19. 1. 2024, 11:01
od zz912
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.

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

Napsal: 19. 1. 2024, 2:00
od robokop
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.