Forum Delphi.cz

Delphi => Obecné => Téma založeno: vangog 11-06-2019, 08:30:43

Název: Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 08:30:43
Připomínám, že píšu v Delphi 7.

Pracuji teď na třídě, která má vytvářet regulární výrazy a později snad s nimi pracovat. Něco mám už napsané, ale teď jsem se dostal do kritického bodu, kdy se musím rozhodnout jestli budu pracovat jen s jednou úrovní předloh nebo s vícero. S jednou úrovní je to jednoduché.

Nejdříve terminologie, kterou jsem si pro třídu vytvořil.

Sekcí nazývám úsek regulárního výrazu:
a) celý výraz bez alternativ a vnořených předloh:
např. 'abc\w{1,3}'
b) sekce alternativ, příklad dvou úseků. 'ano|ne'
c) sekce s vnořenýma předlohama, příklad: '(ano|ne)/(ne|ano)'

Třídou znaku nazývám jakýkoliv zástupný znak, představující více znaků, např. \w, \s, \d
Pod to spadá, "klasická třída znaku": []

Jednotky obsahují buďto samostatné písmeno nebo zástupný znak reprezentovaný třídou. (Tohle asi budu měnit, že by písmeno mohlo být zařazeno přímo pod sekcí).

Tak a teď ke kořenu problému. Návrh typu TRegex_sec pro jednu úroveň předloh:

Kód: Delphi [Vybrat]
  1. type TRegex_sec = record
  2.   hasUnits: boolean;
  3.   units: Array of TRegex_unit;
  4.   len: word; // délka units
  5. end;
  6.  

V případě, že bych chtěl udělat víceúrovňové předlohy bych potřeboval něco podobného, což nelze nadefinovat:

Kód: Delphi [Vybrat]
  1. type TRegex_sec = record
  2.   secs: Array of TRegex_secs;
  3.   secLen: byte;  // length of the units
  4.   hasSections: boolean;
  5.   hasUnits: boolean;
  6.   units: Array of TRegex_unit;
  7.   unitsLen: byte;  // length of the units
  8. end;
  9.  

Při parsování by to vypadalo tato:
předloha: 'a(b)|b(c)'
sec('a(b)')->sec('b');
sec('a(b)')->sec('b');
sec('b(c)')->sec('c');

nebo složitěji:

předloha: 'a(b|bc)|b(c|ab)'
sec('a(b|bc)')->sec('b|bc')->sec('b');
sec('a(b|bc)')->sec('b|bc')->sec('c');
sec('b(c|ab)')->sec('c|ab')->sec('c');
sec('b(c|ab)')->sec('c|ab')->sec('ab');

takto by se dalo postupovat víc a víc do hloubky, ale jak vidíte při definici je problém v tom jak v definici typu použít něco co ještě nebylo nadefinováno... Totiž jakýsi odkaz na sebe sama.

type TRegex_sec = record
  secs: Array of TRegex_secs;
end;
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 11-06-2019, 09:20:11
Asi píšem zle, ale aj tak. Aj hlúposť môže nakopnúť správnym smerom.
Pri objektoch sa bežne používa "dopredná" deklarácia. Netuším či to je použiteľné na record. Tie vôbec neovládam.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 09:31:11
Forward mě taky napadnul, ale to znám jen na procedury:

Google mi napověděl toto:

Citace
In a unit's implementation section or in the body of a program or library, you can declare a function or procedure before you call it by declaring the header (name, parameters, and return type) with the forward directive. Delphi compiles a file by reading from its beginning to the end.

Dočetl jsem se ještě toto:
https://stackoverflow.com/questions/32848994/forward-declarations-for-record-types-or-arrays

že by to možná šlo udělat přes pointer, ale nevím jak, v pointerech jsem amatér a obávám se aby z toho ve výsledku nebyl guláš.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 11:08:43
Nevím jak to udělat, u pointerů je problém, že musíš deklarovat typ na který to odkazuje. Takže zase typ, který ještě nebyl deklarovaný.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 11-06-2019, 12:44:57
Nevím jak to udělat, u pointerů je problém, že musíš deklarovat typ na který to odkazuje. Takže zase typ, který ještě nebyl deklarovaný.

Pointery mají výjimku :-) Tohle projde:

Kód: Delphi [Vybrat]
  1. type
  2.      pPokus=^tPokus;
  3.  
  4.      tPokus=record
  5.       a, b: integer;
  6.      end;
  7.  

Ale to píšu jen k těm pointerům, nedíval jsem se, jak moc se pointery hodí pro Tvůj případ.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 12:52:06
Díky moc!

Kód: Delphi [Vybrat]
  1. type
  2.   pTRegex_sec=^TRegex_sec;
  3.   TRegex_sec = record
  4.   secs: Array of pTRegex_sec;
  5.   len: byte;  // length of the sections
  6.   hasSections: boolean;
  7.   hasUnits: boolean;
  8.   units: Array of TRegex_unit;
  9. end;
  10.  

Je to fakt síla, tenhle kód, to by mě v životě nenapadlo, že se to dá napsat pod jeden typ. Já to píšu vždy odděleně.

A jak vlastně k tomu přistupovat? Kam mám dát tu stříšku ^?

Mohu k tomu přistupovat přímo, když nastavuju to pole?
Kód: Delphi [Vybrat]
  1. procedure TTrackerRegex.incSection;
  2. begin
  3.   setlength(Assertions.secs, Assertions.len+1);
  4.   Inc(Assertions.len);
  5. end;
  6.  

Kód: Delphi [Vybrat]
  1. with Assertions.secs[info.sec].units[info._unit].charClasses[info.charClass] do ...
  2.  

Radši se ptám, aby mi to nekde nepřetékalo.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 17:11:49
Mohl by mi někdo ukázat jak přidělit paměť, když chci navýšit sekci z 0 na délku 1?

Zkoušel jsem použít GetMem, ale dostávám chybu "Incompatible types": Assertions.secs[info.sec]

Kód: Delphi [Vybrat]
  1. procedure TTrackerRegex.incSection;
  2. begin
  3.   info.sec := Assertions.len;
  4.   setlength(Assertions.secs, Assertions.len+1);
  5.   GetMem(Assertions.secs[info.sec], SizeOf(TRegex_sec));
  6.   Inc(Assertions.len);
  7. end;
  8.  
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 11-06-2019, 18:31:46
Kód: Delphi [Vybrat]
  1. New(Assertions.secs[info.sec]);
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 18:46:50
Následoval jsem návod zde:
https://hub.packtpub.com/delphi-memory-management-techniques-for-parallel-programming/
 (https://hub.packtpub.com/delphi-memory-management-techniques-for-parallel-programming/)
jim to funguje. Mě ne.

Tvůj návod mi ale dělá úplně stejnou chybu.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 11-06-2019, 18:59:03
Třeba je problém ještě jinde. Tohle by mělo normálně fungovat:

Kód: Delphi [Vybrat]
  1. type tZaznam=record
  2.       a, b: integer;
  3.      end;
  4.  
  5.      pZaznam=^tZaznam;
  6.  
  7. var Prom: pZaznam;
  8.  
  9. new(Prom);
  10. Prom^.a:=1;
  11. Prom^.b:=2;
  12.  
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 19:17:54
Ptal jsem se taky na stacku, a tam mi bylo vysvětleno, že tu alokaci prý udělal ten setlenght.

https://stackoverflow.com/questions/56548289/how-to-allocate-memory-to-pointer-to-a-record-delphi-7 (https://stackoverflow.com/questions/56548289/how-to-allocate-memory-to-pointer-to-a-record-delphi-7)

A tvůj příklad funguje.

Nicméně dneska jsem už příliš unavený, takže dnes už nic nevyzkouším.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 11-06-2019, 19:50:31
Řekl bych, že setlength jen alokuje prostor pro ten ukazatel, ale ne tu odkazovanou proměnnou jako takovou.
Ostatně můžeš se podívat, jako hodnotu obsahuje Assertions.secs[info.sec] poté, co uděláš setlength(Assertions.secs, Assertions.len+1) - tipuju, že nil, tzn. proměnná není alokovaná, dokud nepoužiješ New.

Ono je teda otázkou, jestli vlastně chceš mít pole ukazatelů (tak to máš teď - Array of pTRegex_sec), nebo rovnou pole hodnot (Array of TRegex_sec - pak bys New nepoužíval).
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 21:26:52
No tak jasně že pole hodnot by bylo lepší, než pole ukazatelů. Dal jsem to jako pole ukazatelů abych to mohl nadeklarovat.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 11-06-2019, 21:29:46
Tohle ale normálně projde:

Kód: Delphi [Vybrat]
  1.      tPokus=record
  2.       Test: array of tPokus;
  3.      end;
  4.  
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 11-06-2019, 21:33:56
Tak jsem to vyzkoušel:
setlength(Assertions.secs, Assertions.len+1);
Kód: Delphi [Vybrat]
  1. setlength(Assertions.secs, Assertions.len+1);
  2. // sec:
  3. // (((), 0, False, False, ()))
  4.  

Tohle nevypadá jak ukazatel.

Dnes už nedokážu uvažovat.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 11-06-2019, 21:36:18
Možná jsem to přehlídnul, ale jak je vlastně deklarovaný Assertions? :-)
Jinak "len" možná ani nepotřebuješ ukládat, pokud teda ve Tvé verzi Delphi taky už funguje length(Assertions.secs);
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 12-06-2019, 08:20:37
Assertions to celé zabaluje a je členem třídy.

type TRegex_assertions = record
  on: boolean;
  isBefore: boolean;
  isAfter:  boolean;
  len: byte;  // length of the sections
  secs: Array of TRegex_sec;
end;

Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 12-06-2019, 08:41:17
Jo, tady máš secs: Array of TRegex_sec; tj. stačí opravdu setlength, protože prvky pole jsou přímo ty záznamy a ne ukazatele.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 12-06-2019, 10:17:53
Ještě bych potřeboval poradit. Teď jsem si uvědomil, že budu potřebovat pracovat s pointerama, abych se k sekcím dostal dynamicky. Takže potřebuju napsat funkci, která vrátí pointer.

Jak ale takovou funkci nadeklarovat?

Co chci použít je:
var pSection: ^pTRegex_sec;
pSection := getCurrentSectionPointer();
incSection(false, pSection); // zavedení první sekce

A teď vysím u té deklarace:
Kód: Delphi [Vybrat]
  1. function getCurrentSectionPointer(): ???;
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 12-06-2019, 10:22:47
Ještě bych potřeboval poradit. Teď jsem si uvědomil, že budu potřebovat pracovat s pointerama, abych se k sekcím dostal dynamicky. Takže potřebuju napsat funkci, která vrátí pointer.

Jak ale takovou funkci nadeklarovat?

Co chci použít je:
var pSection: ^pTRegex_sec;
pSection := getCurrentSectionPointer();
incSection(false, pSection); // zavedení první sekce

A teď vysím u té deklarace:
Kód: Delphi [Vybrat]
  1. function getCurrentSectionPointer(): ???;

var pSection: ^pTRegex_sec je asi špatně;
TRegex_sec je záznam
pTRegex_sec je ukazatel na ten záznam
^pTRegex_sec je ukazatel na ukazatel na záznam, to pravděpodobně nepotřebuješ

function getCurrentSectionPointer(): pTRegex_sec  ? (vrací ukazatel na záznam)
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 12-06-2019, 10:44:28
EDIT 1

Co jsem zatím vymyslel (ale ještě nefunkční):

Kód: Delphi [Vybrat]
  1. procedure TTrackerRegex.incSection(newLevel: boolean; pSec: PTRegex_sec; pPrevLevSec: PTRegex_sec = nil);
  2. begin
  3.   if (false) then
  4.     begin
  5.       info.sec := Assertions.len;
  6.       setlength(Assertions.secs, Assertions.len+1);
  7.       Inc(Assertions.len);
  8.     end
  9.   else
  10.     begin // CREATE NEW LEVEL INTO CURRENT SECTION
  11.       setlength(pSec.secs, pPrevLevSec.len+1);
  12.       Inc(pPrevLevSec.len);
  13.       Inc(info.sec_level);
  14.     end;
  15. //  info.sec_levels[] // zápis úrovní pøístupu k aktuálnì zpracovávané sekci
  16. end;
  17.  

Kód: Delphi [Vybrat]
  1. function TTrackerRegex.getCurrentSectionPointer(): pTRegex_sec;
  2. begin
  3. end;
  4.  
Iniciace:
Kód: Delphi [Vybrat]
  1. pSection := getCurrentSectionPointer();
  2. incSection(false, pSection);
  3.  
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 12-06-2019, 11:24:42
Jak napsat toto (tučná část), abych získal pointer?

function TTrackerRegex.getCurrentSectionPointer(pCurrentLevSec: PTRegex_sec = nil): pTRegex_sec;
begin
  if ( pCurrentLevSec = nil) then
    Result := Assertions.secs[info.sec]
  else
    Result := Assertions.secs[info.sec]
end;

Chyba:
Incompatible types: 'TRegex_sec' and 'pTRegex_sec'
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 12-06-2019, 11:26:06
Result := @Assertions.secs[info.sec]
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 12-06-2019, 11:37:37
Díky
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 14-06-2019, 18:28:06
Co dělám špatně?

Kód: Delphi [Vybrat]
  1.    TTrackerRegex = Class
  2.     private
  3.     Sections: pTRegex_sec; // wrapper
  4. ...
  5.  

Přidělení paměti:
Kód: Delphi [Vybrat]
  1. Sections := new(pTRegex_sec);
  2.  
V této části když to prohlédnu v kukátku ^Sections
vidím toto: #19
Co to znamená? Očekával jsem že uvidím tu výše nadeklarovanou strukturu pTRegex_sec.

destructor:
Kód: Delphi [Vybrat]
  1. Dispose(sections);
  2.  
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 14-06-2019, 19:25:44
Dík, tak tohle se mi ještě plete.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: pf1957 14-06-2019, 22:29:34

V této části když to prohlédnu v kukátku ^Sections
vidím toto: #19
Co to znamená?
Zajimave. To vypada, ze Delphi na urovni bubaku rozumi caret notation a ty jsi napsal ^S = Ctrl-S = #19
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 15-06-2019, 07:29:47
Nerozumím vám, musíte na mě polopaticky.

Každopádně ještě potřebuju poradit. Takže když používám setlength rekurzivně, musím to potom zase rekurzivně uvolnit z paměti, nebo se to uvolňuje samo?

Ptal jsem se předtím na stackoverflow na to jak mám nastavovat ten typ sekce a bylo mi řečeno, že první úroveň (wrapper) mmám nastavit tím setlength. A ty vnořené, že jim musím předělit paměť pomocí New. A teď když to realizuju a ladím tak se to asi potvrzuje, že to jinak nejde (ale sám nevím proč):

Kód: Delphi [Vybrat]
  1. procedure TTrackerRegex.incSection(newLevel: boolean; pSec: pTRegex_sec = nil);
  2. begin
  3.   if (pSec = nil ) then
  4.     begin
  5.       // A WRAPPER secs[0]
  6.       Sections := new(pTRegex_sec);
  7.       // The root section parent is self
  8.       Sections.parent := Sections;
  9.       Sections.len := 0;
  10.       Sections.hasSections := false;
  11.       Sections.hasUnits    := false;
  12.       exit;
  13.     end;
  14.   if (not newLevel) then
  15.     begin // EXPAND SECTION
  16.       setlength(psec.secs, psec.len+1);
  17.       psec.secs[psec.len].parent := psec.secs[psec.len];
  18.       Inc(psec.len);
  19.     end
  20.   else
  21.     begin // CREATE NEW LEVEL INTO CURRENT SECTION
  22.           pSec.hasSections := true;
  23.           setlength(psec.secs, psec.len+1);
  24.           Inc(psec.len);
  25.     end;
  26. end;

V té části, kde je // CREATE NEW LEVEL INTO CURRENT SECTION
Kód: Delphi [Vybrat]
  1. pSec.hasSections := true;
  2. setlength(psec.secs, psec.len+1);
  3.  
kukátko psec.secs ukazuje nil.

Takže sice nevím proč se nepřidělí paměť automaticky, ale rozumím, že musím přidělit paměť pomocí New. A při destruktoru rekurzivně zase deallokovat pomocí Dispose().
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 15-06-2019, 18:39:39
I found the clue

Kód: Delphi [Vybrat]
  1. pSec.hasSections := true;
  2. setlength(psec.secs, psec.len+1);
  3. psec.secs[psec.len] := New(PTRegex_sec);
  4. psec.secs[psec.len].parent := psec;
  5. Inc(psec.len);
  6.  
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 15-06-2019, 19:58:19
Já jsem dlouze přemýšlel v čem dělám chybu. Furt jsem myslel na to nil (element pole, jak se tam dostal). Pak mi to najednou došlo. Že to přižazování se tam děje ve dvou úrovních. První úroveň je nastavení délky pole pointerů... Tím se tam dostane to nil. A druhá úroveň je pak to, že ten pointer musí někam směřovat, tedy tomu objektu přidělím paměť... Takže jsem z toho konečně moudřejší.

Navíc jsem řešil jak si pohlídat dealokování všech těch elementů, abych to nedělal rekurzivně. Tak jsem vymyslel toto

Kód: Delphi [Vybrat]
  1. destructor TTrackerRegex.Destroy();
  2. var i: integer;
  3. begin
  4. { Despose all objects from the last one
  5.   to the first one }
  6.   for i := info.AllSecPointers_currentIndex downto 0 do
  7.      Dispose(AllSecPointers[i]);
  8.    inherited;
  9. end;
  10.  

info.AllSecPointers_currentIndex se nastaví vždycky když allokuju paměť pro vnořenou sekci, čili nastavuju ukazatel pro element pole pointerů. A každý ukazatel si zazálohuju do pole, kde všechno sbírám. Toto pole je jednorozměrné, takže se vše dá snadno dealokovat.

Procedura pro alokování paměti vnořených objektů:

Kód: Delphi [Vybrat]
  1. procedure TTrackerRegex.incSection(newLevel: boolean; pSec: pTRegex_sec = nil);
  2. begin
  3.   if (pSec = nil ) then
  4.     begin
  5.       Sections := New(pTRegex_sec);
  6.       // Backup pointer
  7.       AllSecPointers[0] := Pointer(Sections);
  8.       info.AllSecPointers_currentIndex := 1;
  9.       // The root section parent is self
  10.       Sections.parent := Sections;
  11.       Sections.len := 0;
  12.       Sections.hasSections := false;
  13.       Sections.hasUnits    := false;
  14.       exit;
  15.     end;
  16.   if (not newLevel) then
  17.     begin // EXPAND SECTION
  18.       setlength(psec.secs, psec.len+1);
  19.       psec.secs[psec.len] := New(PTRegex_sec);
  20.       // Backup pointer
  21.       AllSecPointers[info.AllSecPointers_currentIndex] := Pointer(Sections);
  22.       Inc(info.AllSecPointers_currentIndex);
  23.       if (info.AllSecPointers_currentIndex>length(AllSecPointers)) then
  24.         setLength(AllSecPointers,length(AllSecPointers)+10);
  25.       psec.secs[psec.len].parent := psec.secs[psec.len];
  26.       Inc(psec.len);
  27.     end
  28.   else
  29.     begin // CREATE NEW LEVEL INTO CURRENT SECTION
  30.       pSec.hasSections := true;
  31.       setlength(psec.secs, psec.len+1);
  32.       psec.secs[psec.len] := New(PTRegex_sec);
  33.       // Backup pointer
  34.       AllSecPointers[info.AllSecPointers_currentIndex] := Pointer(psec.secs[psec.len]);
  35.       Inc(info.AllSecPointers_currentIndex);
  36.       if (info.AllSecPointers_currentIndex>length(AllSecPointers)) then
  37.         setLength(AllSecPointers,length(AllSecPointers)+10);
  38.       psec.secs[psec.len].parent := psec;
  39.       Inc(psec.len);
  40.     end;
  41. end;
  42.  
  43.  

Zítra bych tam mohl přidat try block. Já to normálně nepoužívám, ale tu by to nejspíš chtělo.

Dotaz:
Když to ladím stylem, že dám zarážku, alokuju paměť, zastavím na zarážce a pak restartuju debugger, tak dojde k "memory leak"? Protože debugger mi opakovaně padá.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 15-06-2019, 20:05:37
Citace
Když to ladím stylem, že dám zarážku, alokuju paměť, zastavím na zarážce a pak restartuju debugger, tak dojde k "memory leak"? Protože debugger mi opakovaně padá.
Ty nepoužívaš napr. FMM4? Ja bez toho neurobím pri ladení ani krok!
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 15-06-2019, 21:20:07
FMM4? Kde se to dá sehnat a jak se to používá? Tedy pokud je to pro Delphi7?
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 15-06-2019, 21:27:24
Nemáš google? Napr:
https://github.com/pleriche/FastMM4 (https://github.com/pleriche/FastMM4)
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 15-06-2019, 21:31:50
Aby som nebol zlý, tak doplňujem:
Kód: Delphi [Vybrat]
  1. program PoBeS;
  2. {$R *.dres}
  3. uses
  4.   {$IFDEF DEBUG}
  5.   FastMM4 in 'C:\Users\Public\Documents\Embarcadero\Studio\FastMM4\FastMM4.pas',
  6.   FastMM4Messages in 'C:\Users\Public\Documents\Embarcadero\Studio\FastMM4\FastMM4Messages.pas',
  7.   {$ENDIF }
  8. ...
V každom prípade si prejdi konfiguračný súbor a zapni full debug mode. Budeš si musieť skopírovať knižnice k exe. Tu v diskusiách sa to už preberalo niekoľkokrát :(
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 15-06-2019, 23:06:00
Ale já nemám Embarcadero Delphi
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 16-06-2019, 09:19:30
Ale já nemám Embarcadero Delphi
Na tom vôbec nezáleží. Ja som Ti len dal príklad ako sa to má použiť. Musí to byť uvedené ako prvé. A je úplne jedno aké cesty si tam dáš!
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 16-06-2019, 15:06:08
Dík za odkaz, ale nevím kdy budu mít čas to zkoumat.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 16-06-2019, 16:30:25
Dík za odkaz, ale nevím kdy budu mít čas to zkoumat.
Ak máš na mysli FMM4, tak tam nemáš čo skúmať.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 09:32:12
Staženo mám. Musím něco kompilovat?
Jsou tam dvě složky jedna "FullDebugMode DLL" a druhá "Replacement BorlndMM DLL\Delphi" ta obsahuje "FastMMDebugSupport.pas" a pak je tam precompiled\for Delphi IDE\Performance

Tak nevím co mám vybrat. Mám tu složku někam zkopírovat nebo nic nekopírovat jen vybrat cestu?
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 17-06-2019, 09:43:12
Citace
Musím něco kompilovat?
Nie.
Pre D7 si to už nepamätám.
Tam kde sa vytvára *.exe (Debug adresár) mám
Ostatné mám vo vlastnom adresári, ktorý používam pre všetky aplikácie. Viď moje dpr. Tam mám všetko
Urob si to podobne. Ak bude niečo zle, tak dostaneš oznam o chýbajúcej knižnici. To si už vyriešiš.
Určite si si stiahol aj súbor ako to inštalovať. Čo sa tak doň pozrieť?
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 11:12:46
Nápovědu k instalaci jsem nenašel. Nicméně si nemohu vzpomenout kde v Delphi 7 najdu nastavení projektu -> Linker abych tam přidal tu zkompilovanou knihovnu. Mám tam Project->Options->Directories ... tam nic nastaveno není. A Pod kartou Linker taky není seznam ovladačů. Mám tam nainstalované nějaké balíčky, ale to je něco jiného...

Edit:
Ta direktiva {$R *.dres} znamená co? To tam taky musím dát?
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 17-06-2019, 11:29:59
Citace
Nápovědu k instalaci jsem nenašel.
To som sa pomýlil. Mal som na mysli návod. Zvyčajne ReadMe.
Citace
Ta direktiva {$R *.dres} znamená co? To tam taky musím dát?
Nie, to je odkaz na resource.
Mám zozbierané návody, ale spakované majú 1,3 MB. Tu sa nedajú priložiť. Pošli mi mail, aby som Ti to poslal.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 13:28:38
Ten rar soubor se mi nepovedlo otevřít. Buď neznámý formát nebo je poškozený. Zkus to zabalit do zipu.

edit
Jaktože tam máš ty soubory .dcu? Já je tam nemám a ten program je po mě chce   :o
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 17-06-2019, 14:03:57
Už ich máš. To bolo dosť dávno čo som to robil. Ale hosip.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 14:21:39
Dík za návody.

Ještě potřebuju sehnat ty soubory .dcu, páč je nemám.

Ten návod na dll se mi bude hodit, protože bych chtěl tu svojí aplikaci dát do dll.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: pf1957 17-06-2019, 14:25:44
Jaktože tam máš ty soubory .dcu? Já je tam nemám a ten program je po mě chce   :o
Protoze delas neco spatne. Proste nekam ty soubory vybal a v .dpr souboru projektu hned za uses pridej 2 radky, ktere budou ukazovat na soubory tam, kam sis je dal a pripadne .dcu soubory smaz.
Kód: Delphi [Vybrat]
  1. uses
  2.   fastmm4 in '..\..\LIB\PAS\3RD\FastMM\fastmm4.pas',
  3.   FastMM4Messages in '..\..\LIB\PAS\3RD\FastMM\fastmm4Messages.pas',
  4.  
A dej build projektu. A kdyz to po spusteni aplikace bude narikat, ze mu chybi FastMM_FullDebugMode.dll, tak ji nakopiruj do adresare, kam prekladas .exe.

Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 14:49:23
Mám toto:

Kód: Delphi [Vybrat]
  1. uses
  2. FastMM4 in 'P:\PROGRAMY\programování\PAS\delphi7\FastMM4\FastMM4.pas',
  3. FastMM4Messages in 'P:\PROGRAMY\programování\PAS\delphi7\FastMM4\FastMM4Messages.pas',
  4. Classes, ExtCtrls, Dialogs, Menus, Controls, StdCtrls, Forms, Gauges,
  5. ExtCtrls, Dialogs, Menus, Controls, StdCtrls, Forms, Gauges,
  6.   SysUtils, WinTypes, WinProcs, Messages,
  7.   Classes, Graphics, Controls,
  8.   Forms, Dialogs, StdCtrls, ExtCtrls, Menus,
  9.   Uc_obr2,vyslheb, jmeno, book, Gauges, Buttons,
  10.   uspech,testfnt, Napoveda,antiwin,otviram,
  11.   arguments, convert_fnc, functions,
  12.   procedures, procedures_gui,
  13.   globals,
  14.   DIRegEx,
  15.   jpeg,
  16.   pngimage,
  17.   translation_fnc;
  18.  

Zmáčknu ctrl+F9

a výsledkem je chaos:
uses
Kód: Delphi [Vybrat]
  1. FastMM4, ExtCtrls, Dialogs, Menus, Controls, StdCtrls, Forms, Gauges,
  2.   Classes in 'P:\PROGRAMY\programování\PAS\delphi7\FastMM4\FastMM4.pas',
  3. FastMM4Messages in 'P:\PROGRAMY\programování\PAS\delphi7\FastMM4\FastMM4Messages.pas',
  4. Classes, ExtCtrls, Dialogs, Menus, Controls, StdCtrls, Forms, Gauges,

Mě to přehází ty řádky kódu

Mi v tom udělal takový bordel že už se v tom nevyznám co tam mám a hodilo se to tam dvakrát.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 17-06-2019, 14:56:27
Tak použi direktívu {$IFDEF DEBUG}... Beztak to nepotrebuješ spúšťať v release verzii. Podľa mňa by to tým pádom nemalo prehadzovať. Osobne som sa s niečím takým nestretol.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 17-06-2019, 15:00:22
Teraz som si spomenul, že sa mi automaticky dopĺňajú do uses "chýbajúce jednotky" ak ich editujem ručne a nemám tam ešte čiarku. Potom tam sú dvakrát.
Priprav si to celé v *.txt a celé to tam naraz skopíruj. To by malo pomôcť.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 15:11:49
Když to dám až na konec tak to problém nedělá, ale chce to po mě FastMM4.dcu
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 15:31:42
Takže se ptám jak tu jednotku dcu vytvořit?
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 15:36:08
Jo už jsem na to přišel kam to mám dát, ale dostal jsem chybu:

FastMM has detected GetMem call after FastMM was uninstalled
Runtime error 203 at ....

To hlásí během ukončování programu. Nemůže to být způsobeno nějakým balíčkem jako např. Yunga DiRegex?

Q: Jakým způsobem se v projektu nastavuje Debug/Release?
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: pf1957 17-06-2019, 16:46:34
FastMM has detected GetMem call after FastMM was uninstalled
Runtime error 203 at ....
A mas ty FastMM units jako prvni za uses?
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 17:15:25
Jo mám. Procházel jsem kód a funkci getmem jsem našel jenom jednu a tu jsem zkusmo zakomentoval, ale to nebylo v kódu, který bych inkludoval a nemělo to vliv. Tak si myslím, že to možná dělá ta zmíněná demo knihovna pro regex protože tam něco běží v paměti, jako časovač nebo tak něco (domnívám se že se ukončuje jako poslední).
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 17-06-2019, 19:58:22
Veď si urob nový projekt. V ňom si iba vytvor objekt a neuvoľň ho. Pri zatvorení projektu Ti vypíše memory leak.
Hneď budeš vedieť na čom si.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 17-06-2019, 20:20:56
Veď si urob nový projekt. V ňom si iba vytvor objekt a neuvoľň ho. Pri zatvorení projektu Ti vypíše memory leak.
Hneď budeš vedieť na čom si.

No já to zkusím až budu programovat. Teď jsem měl pauzu a nevím kdy zas začnu. Snad zítra. Neměl by ten memory leak vypsat spíš při ukončování programu (ne projektu)?
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: Stanislav Hruška 17-06-2019, 20:24:17
Ja pod tým projektom myslím program :)
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 18-06-2019, 12:12:22
Zatím mi to funguje, kromě te chyby při ukončování programu.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 18-06-2019, 22:18:55
Dají se v Delphi provádět bitwise AND/OR operace na byte?

Chtěl bych udělat pole
options: Array of byte;

S tím, že každý znak v řetězci s předlouhou má vlastní options.

Příklad takového řetězce:
'(?i)Hello(?I) Andy'
Odpovídá deseti znakům. Options by pak bylo pole bajtů o délce 10, kde každé písmeno má své nastavení.

  char binary options:
  decimal value:
  0 - no options
  1 - '.' any character
  2 - '^' begin of the string
  4 - '$' end of the string or carriage return
  8 - '?' the character may be skipped e.g. dady?
  16 - (?i) insensitive search on
  32 - (?m) multiline search on
  64 - \K  can be used instead of lookbehind: h\Kd matches only the second d in adhd

Co jsem se zatím díval do nápovědy tak jsem našel použití jen s integery, což mi ale přijde hodně neefektivní, protože když používám rozsah jen 8 bitů, tak by musel porovnávat 32 bitů na 32 bitovém systému, 64 bitů na 64 bitovém systému, což mi nedává smysl.

Na pokus jsem zkoušel:
Kód: Delphi [Vybrat]
  1. setLength(options,1);
  2. options[0] := 0 or 8;
  3. if ( 4 and options[0] ) then
  4.    begin
  5.    end;
  6.  

Vrací chybu "Type of expression must be BOOLEAN"
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 18-06-2019, 22:38:08
Funguje i s byte.
Kód: Delphi [Vybrat]
  1. if (options[0] and 4)<>0 then
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: pf1957 18-06-2019, 23:01:29
Co jsem se zatím díval do nápovědy tak jsem našel použití jen s integery, což mi ale přijde hodně neefektivní, protože když používám rozsah jen 8 bitů, tak by musel porovnávat 32 bitů na 32 bitovém systému, 64 bitů na 64 bitovém systému, což mi nedává smysl.
Au to boli... za tu dobu, co nam tady vylizujes mozky a prudis uz sis taky mohl poridit nejakou ucebnici programovani :-(
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 18-06-2019, 23:04:38
Mohl bys to napsat ještě jednou a česky prosím? Tvou ajťáckou komunikaci nezvládám.
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vandrovnik 18-06-2019, 23:04:54
Premature optimization je IMHO o co tu jde.

Já jsem zvědav, jestli nakonec neobjeví kouzlo assembleru :-)
Název: Re:Návrh typu pro regex - problém s vnořením do sebe sama
Přispěvatel: vangog 18-06-2019, 23:14:32
Funguje i s byte.
Kód: Delphi [Vybrat]
  1. if (options[0] and 4)<>0 then

Dík. S touto syntaxí jsem se ještě nesetkal.