#3 Staon
Moc dík. Šlo mě o to jak by to mělo být napsané trochu na úrovni, aby to bylo rychlé. Tu jednoduchou konverzi znaků jsem právě napsal a bylo to hrozně pomalé, tak mě zajmalo jestli na to není třeba nějakej matematickej fígl. Šlo klasicky o řetězec v 10kové soustavě.
Příspěvky odeslané z IP adresy 90.178.131.–
Nevím jestli to nutně musí být nějaké řady, přijde mě to prostě jako sčítaní a odčítaní libovolných zlomků. Já bych to tedy převedl na stejného jmenovatele a pak to sečíst/odečíst, případně to na závěr pokrátit, což ale v zadání není... Snad jen s tím krácením a nalezením nejnižšího společného jmenovatele by mohl být trochu problém, který by nejspíš krom jiného vedl k hledání prvočísel menších než nějaká hodnota.
#17 BDS
Ano chápeš to správně. Jde mě o to jestli právě to VBA nějak rozliší co si alokovalo samo a to co přišlo odjinud, nebo jestli to zruší úplně stejně, nebo jak to udělat, aby se k tomu chovalo jako ke svému.
A vy co tomu rozumíte, tak jak jsem psal zrovna u těch řetězců je funkce SysAllocString, řetězec z té funkce se uvolňuje zas přes SysFreeString a podobně je spousta jiných funkcí, kde jedna vytváří a další ruší. Vrtá mě hlavou co zrovna v tomto, nebo jiných případech ta funkce udělá, že ta rušící funkce pozná, odkud jsou ta samá data, to znamená, že pokud nejsou vytvořena pomocí funkce, tak mazací funkce hlásí chybu.
#7 Kit
Tak jednak se snažím přejít na C++, navíc ten kód je použitelnej jak ve VBA tak v C a mělo by to i běhat rychlejš než kdyby to bylo čistě ve VBA, alespoň ty místa kde to nejvíc drhne přepisuju do C. Další věc co mě na VBAčku štve, je že nejde kompilovat a zdrojový kód nejde zabezpečit, heslo je tam spíš jen tak na okrasu.
#5 Kit
Takže ještě pro jistotu, ať už tedy vytvořim ten řetězec kdekoliv mimo VBA, tak se o něj VBA postará?
Jo tohle jsem před časem řešil.. udělat na začátku dostatečně dlouhý řetězec a pak tam vepisovat ty kratší je o dost rychlejší. Teď právě kvůli operacím s řetězci dělam knihovnu v C++.
Jde mě o to VBAčko, kde se uvolňování děje aniž to mohu ovlivnit... Ať už to tedy funguje jak chce, tak hlavní je teď pro mě, jestli to správně uvolní i řetězec, který pochází z mojí dll knihovny, nebo jestli se o jeho zrušení musím postarat taky já. Jestli v tom VBAčko nevidí rozdíl odkud řetězec pochází, nebo jestli musí být nějak speciálně alokovaný...
Nevim jak přesně funguje Garbage Collector, ale tedy nejspíš sníží počet referencí a pokud je počet 0, tak to tu paměť až se mu zachce uvolní?
Chtěl bych vědět co se děje na pozadí VBA, když dojde třeba na přiřazení řetězce.
dim retezec as string
dim retezec2 as string
retezec="aaa"
retezec2="bbbbbb"
retezec = retezc2
Moje představa je, že se nejdřív uvolní paměť proměnné retezec, aby nezůstal navždy v paměti a pak se předá ukazatel na nový řetězec, nebo je to jinak? Řetězce ve VBA jsou typu BSTR, BSTR je ukazatel na data řetězce, která jsou (aspoň v mojí knihovně) uložené na hromadě přes new... Taky jestli se VBA při rušení řetězce postará a smazaní toho co bylo alokováno přes new, což jsou všechny data toho BSTR (prefix, data, terminator)?
Už to asi mam, dereferencovat pointer pres copymemory a pak přes objekt volat funkce.
A když mam pouze ukazatel na kolekci, je nějaká možnost jak zavolat členskou funkci, kterou prvek např. přidam?
Snažil jsem se googlovat, ale marně, všude jen jak se kolekce používají, ale nikdy jak to funguje ve VBA. Potřeboval bych to nejlépe rozepsané jako je to na http://bytecomb.com/vba-internals-getting-pointers/ , tam je popsané jak ve skutečnosti funguje např. pole, že je to struktura SAFEARRAY, nebo řetězce, které se ukládají jako BSTR. No a já bych potřeboval jak jsou uložená data kolekce.
Zatím jsem přišel jen na to, že ukazatel na kolekci + 16 je Long size.
dim size as long
Copymemory size, byval ObjPtr(kolekce) + 16, 4
Ten timer po té co vyprší hodí zprávu, že požadovaný čas vypršel a spustí se funkce... a kdy tedy proběhne tato funkce, když právě probíhá ve vlákně jiný kód? Podle toho jak na pohled průběh vypadá a jestli je to v jednom vlákně, tak to možná po vypršení času kód zastaví, proběhne ta funkce a pak pokračuje původní kód. Pokud by to bylo, tak je problém podobný, protože uprostřed funkce může spustit tu samou funkci.
Díky.
Napadá mě, že by to možná šlo taky řešit pomocí vytváření kopií proměnných, takže by každá funkce měla svoje a mohli by pak běžet zároveň bez omezení.
A otázka mimo, i když to možná souvisí. Jak funguje winapi funkce SetTimer, jestli si vytváří svoje vlákno, nebo jak to funguje, když se po vypršení limitu volá nějaká funkce zatímco jiný kód již běží.
Mam ve funkci jak lokální proměnné uvnitř funkce, tak sdílené v rámci modulu (ty používá několik funkcí) - ty má také každá funkce vlastní?
Takže spíš než že by se dělaly funkce, které je možné spustit několikrát zároveň, tak se to řeší až při jejich použití, kdy pokud je funkce už spuštěna, tak se znova nevolá, dokud neskončí to první volání?
Jako na potvoru to teď nechce spadnout :) Hned jak se to povede to sem hodim, ale myslím že to je obecná chyba typu nastala kritická chyba program bude ukončen. Program nad kterým to VBAčko běží, ale nejspíš dělá ke každém pádu celkem dlouhý log s výpisem paměti a spoustou dalších věcí... ze kterých já stejně prd poznam:(5
Ahoj,
Předpokládám, že je teoreticky možné možné, že i funkce z VBA může být spuštěna v jeden moment několikrát v různých vláknech, ale jde mě o to jak to funguje obecně. Nevím jak je to určitě, ale tipnul bych, že v paměti je funkce jen jedna a tedy případné několikanásobné spuštění bude používat stejné proměnné ve funkci, což povede k blbosti, nebo rovnou chybě v přístupu. Rád bych tedy věděl jak se tento problém řeší, aby funkce šla bezpečně použít, i když je volána několikrát ve stejný čas.