array size

This forum is for eXpress++ general support.
Post Reply
Message
Author
Victorio
Posts: 620
Joined: Sun Jan 18, 2015 11:43 am
Location: Slovakia

array size

#1 Post by Victorio »

Hi,
Can be some limits for number of array elements although I read on several points that Xbase have not limits ?
I have array where temporary store some strings. On some situationst number of elements is more than 400000. Every string have not more than 80 characters, and can be also blank = only CRLF.
At this situation my program not work correctly, and I do not know why.

I want try control content of variable with wtf but this break with error after store some part from 400000 elements :

FATAL ERROR LOG
Error within the error handling!
SYS Thread-ID: 2436
Module: EXE
Error Codes: EH: 1006 Sub: 0(0) OS: 0 XPP: 15
Call Stack of Thread 1 (1084):

User avatar
rdonnay
Site Admin
Posts: 4722
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: array size

#2 Post by rdonnay »

Are you saying that WTF causes the error?
The eXpress train is coming - and it has more cars.

Victorio
Posts: 620
Joined: Sun Jan 18, 2015 11:43 am
Location: Slovakia

Re: array size

#3 Post by Victorio »

I am not sure, but when running long time, and have have many rows, program crashes.
My program froze when read some number of elements (about 260000), but window stay open,
but when use wtf, program show error, but I must test again, because not remember what error show.

I will write when it happens again.

Victorio
Posts: 620
Joined: Sun Jan 18, 2015 11:43 am
Location: Slovakia

Re: array size

#4 Post by Victorio »

Hi Roger,
I get this error when use wtf to monitoring variables

I do not claim that it is wtf error, problem is in my program, resp. in data which I processing.
Program is simple, only open file, store content to variable, read data from this variable with controlling EOL to know where row end, , and store it to variable and after processing variable save to file.
File is not very large only 56MB, and this system works years, but now I have one file in which are blank rows with only CRLF sign, and this looks posses problem
With wtf I want find, on which row crashes.

Code: Select all

FATAL ERROR LOG 
Error within the error handling!
SYS Thread-ID: 1084 
Module: EXE
Error Codes: EH: 1006 Sub: 0(0) OS: 0 XPP: 15
Call Stack of Thread 1 (1084):
DC_SKIPARRAY(3919)
(B)@DC_XBPBROWSE@I@INIT(581)
@XBPBROWSE@I@DOSKIP(2816)
@XBPBROWSE@I@FORCESTABLE(1314)
@DC_XBPBROWSE@I@FORCESTABLE(1427)
DC_DEBUGBROWSE(579)
FHTSU3D(1593)
HLAD3(857)
HVZ_SQL(3396)
(B)wolp_sql(848)
@DC_XBPPUSHBUTTONXP@I@ACTION(1422)
(B)@DC_XBPPUSHBUTTONXP@I@INIT(216)
@XBPPUSHBUTTON@I@HANDLEEVENT(1530)
@DC_GETLIST@I@EVENTLOOP(4651)
@DC_GETLIST@I@READGUI(3832)
DC_READGUI(111)
WOLP_SQL(1404)
(B)APPMENU2@1553(872)
@DC_XBPPUSHBUTTONXP@I@ACTION(1422)
(B)@DC_XBPPUSHBUTTONXP@I@INIT(216)
@XBPPUSHBUTTON@I@HANDLEEVENT(1530)
@DC_GETLIST@I@EVENTLOOP(4651)
@DC_GETLIST@I@READGUI(3832)
DC_READGUI(111)
APPMENU2(2287)
MAIN(1684)
Call Stack of GUI Thread (1256):
Call Stack of Thread 3 (2084):
@DC_SETTIMEREVENT@I@TIMERLOOP(2620)
(B)@DC_SETTIMEREVENT@I@INIT(2575)
Call Stack of Thread 4 (2172):
@JD_MAGICHELPTHREAD@I@EXECUTE(95)
(B)@JD_MAGICHELPTHREAD@I@INIT(41)
Call Stack of Thread 5 (2216):
@DC_SETTIMEREVENT@I@TIMERLOOP(2620)
(B)@DC_SETTIMEREVENT@I@INIT(2575)
Call Stack of Thread 6 (2332):
Call Stack of Thread 7 (2436):
@DC_GETLIST@I@EVENTLOOP(4131)
@DC_GETLIST@I@READGUI(3832)
DC_READGUI(111)
DC_DEBUGWINDOWBROWSE(931)
(B)_DebugBrowseWindow(618)
File: C:\PRG\Rauknw_30108\RAUKNW.exe
TimeStamp: 20190714 12:13
End of FATAL ERROR LOG

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: array size

#5 Post by Eugene Lutsenko »

Maybe, in the case of an empty string, when it consists only of CRLF, add one special character to the string, which will mean the absence of data?

Victorio
Posts: 620
Joined: Sun Jan 18, 2015 11:43 am
Location: Slovakia

Re: array size

#6 Post by Victorio »

Eugene, I do not know if this can help, on other files I have also blank lines, only CRLF and run without problems.
Only one file is special, where I read many rows to array, one block of file have about 416000 lines, and when reading, it slows in case of number rows readed.

I mean, this is memory problem.

Roger, in wtf can be some limit to read more than about 65000 rows ? I tested it, and stil when read to debug table about 65000 rows, crashed.

User avatar
rdonnay
Site Admin
Posts: 4722
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: array size

#7 Post by rdonnay »

I need to make a change to WTF because it calls DC_Array2String() to put the contents in the browse window.
I will need to change it so it only does that on small arrays.

The memory failure is probably in DC_Array2String().
The eXpress train is coming - and it has more cars.

Victorio
Posts: 620
Joined: Sun Jan 18, 2015 11:43 am
Location: Slovakia

Re: array size

#8 Post by Victorio »

Ok, Roger, this is not so important now, I deal with it to show wtf only every x-th record, to not exceed 60000 rows.

This is not my main problem, main problem is that I do not know why my function cannot read many records to array.
I am sure problem was on processing string, his dividing to rows using EOL code, now I start again with blank cycle only read rows, and later add other function to processing rows.

Just for interest here is code but not very correct formatting when store to board. Sorry there are more comments and not active blocks...
Function is for searching string in text file, when found string in some of block beginning and ending with "special" combination of characters, save this block to temporary variable and then save to file.

Code: Select all

*********
FUNCTION FHTSU3D(prechody,pomcisku,pomnazku,cSourceFile3,cTargetFile3,cTargetFile3d,hladtext1,hladtext2,hladtext3,pomtyp,pomtypx,pomtypd,davkovo,pkey3dpocet,hladtext4)
***************************************************************************************************************************************************************
LOCAL GetList := {}
LOCAL nSource3,nTarget3
*LOCAL nTarget3d[20]
LOCAL nTarget3d[1000]		// zvyšujem na 100  kvoli stavbám
LOCAL cBuffer
* premenné pre vstupný reťazec
LOCAL cSourceString3:="",nSourceString3
* premenné pre výstupný reťazec
LOCAL cTargetString3:="",nTargetString3
LOCAL j3:=0,x3:=0,i3d:=0
LOCAL velkostsuboru3:=0,velkostsuboruout:=0,pocetriadkovsuboru:=0
LOCAL pocetriadkov:=0
LOCAL count:=0,countpom:=0,outpocet:=0
LOCAL znak:=space(0),pomznak
LOCAL minznak:=space(0),budznak:=space(0),ret:=space(0)
LOCAL poziciaEOL:=0, lastpoziciaEOL:=0
LOCAL zostatok3:=0,dlzkariadku:=0
LOCAL ctext:=space(0),ctext2:=space(0)
LOCAL pocnt:=0
LOCAL q1:=0,q2:=0,mempp:=0,mempos:=0,memapos:=0,ptext:=""


LOCAL rp:=0,nt:=.F.,pomrp:=0,np:=.F.

*LOCAL ntd[20]
*LOCAL ntd[1000]			// zvyšujem kvoli stavbám na 100
*qqq 30.9.2016 zvyšujem kvôli chronológii Ba
LOCAL ntd[30000]		// zvyšujem kvoli stavbám na 100

LOCAL ntdand:=0			// pri podmienke and, 0 vyhovujú všetky >0 jeden a viac nevyhovuje		
* teraz oznacene s 2 aby som vedel generovať do výstupu nezávisle od povodnej verzie

LOCAL outriadok3:=""

*LOCAL outriadok3d[20]                // pre dávkové protokoly
*LOCAL outriadok3d[1000]                // pre dávkové protokoly	// zvyšujem na 100 kvôli stavbám
*qqq 30.9.2016 zvyšujem kvôli chronológii Ba
LOCAL outriadok3d[30000]                // pre dávkové protokoly	// zvyšujem na 100 kvôli stavbám

LOCAL pomriadok3:=""
LOCAL pomnt:=.F.
LOCAL pprechody:=0
LOCAL prvyprechod:=.T.        // ak prvý prechod, tak .T., ak ďalší tak .F.

LOCAL lastrow:="",chronolv:=0	// predch.riadok a príznak že sa jedná o chronológiu LV

LOCAL bloksize:=100000000	// nastavenie veľkosti bloku, final 100.000.000 Bytov
*LOCAL bloksize:=1000000	// test blok 1MB
*LOCAL bloksize:=25000
*LOCAL bloksize:=10000		// test blok 10kB
*LOCAL bloksize:=5000		// nastavenie veľkosti bloku, pre testovanie iba 5000 znakov
*LOCAL bloksize:=10

LOCAL velkostbloku:=0,poziciadelenia:=0,lastpozicia:=0
LOCAL poziciafileout:=0,poziciafile:=0
LOCAL nacitanychznakov:=0
LOCAL datpvz:=date(),vrozsahu:=.F.


DECLARE polozkavz[100000]

*qqq dávka, nulovanie premenných
for i3d:=1 to pkey3dpocet
        ntd[i3d]:=.F.
        outriadok3d[i3d]:=""
next

SET EXACT ON        // tj. porovná presne identické reťazce

* ak TYP ZMENY, VLASTNÍK a mená vlastníkov v array
if prechody=3
	hladtext1:=upper(lat_ibm(alltrim(hladtext1)))
	hladtext2:=upper(lat_ibm(alltrim(hladtext2)))

	* úprava pre array
	*hladtext3:=upper(lat_ibm(alltrim(hladtext3)))
	for i3d=1 to pkey3dpocet
	        hladtext3[i3d]:=upper(lat_ibm(alltrim(hladtext3[i3d])))
	        hladtext4[i3d]:=upper(lat_ibm(alltrim(hladtext4[i3d])))
	next

* ak VLASTNIK a mená vlastníkov v array
elseif prechody=2
	hladtext1:=upper(lat_ibm(alltrim(hladtext1)))

	* úprava pre array
	*hladtext2:=upper(lat_ibm(alltrim(hladtext2)))
	for i3d=1 to pkey3dpocet
	        hladtext2[i3d]:=upper(lat_ibm(alltrim(hladtext2[i3d])))
	        hladtext4[i3d]:=upper(lat_ibm(alltrim(hladtext4[i3d])))
	next

* ak iba jeden prechod ale chrono LV 
elseif prechody=1
	* úprava pre array

*qqqx 15.6.2018 optimalizácia, vyradenie úprav upper, latibm, ak sa nespracovávajú texty s diakritikou
* pôvodné
*
	for i3d=1 to pkey3dpocet
        	hladtext1[i3d]:=upper(lat_ibm(alltrim(hladtext1[i3d])))
        	hladtext4[i3d]:=upper(lat_ibm(alltrim(hladtext4[i3d])))
	next


endif

if prechody=1 .and. pkey3dpocet>=4 .and. substr(hladtext1[1],1,8)="LIST VLA"
	*ladenie("spracovanie chronológie LV , chronolv=1")
	chronolv:=1

endif



*qqq 9.9.2016 - keďže hore som to upravil aj pre variant 3 prechodov, tu toto blokujem !!!
*hladtext3:=upper(lat_ibm(alltrim(hladtext3)))

* skúška úpravy 13.3.2016 - ale nefungovalo to, zatiaľ neskúmam prečo
*hladtext:=upper(lat_ibm_u(alltrim(hladtext)))
*hladtext:=upper(lat_ibm_u(alltrim(hladtext)))
*hladtext:=upper(lat_ibm_u(alltrim(hladtext)))

********************************************************
* doplnenie hviezdičky pred a za hľadací kľúč ak wildcard povolené, aby našlo vnútri riadku
*if povolwild==.T.
*        if left(hladtext,1)!="*"
*                hladtext:="*"+hladtext
*        endif
*        if right(hladtext,1)!="*"
*                hladtext:=hladtext+"*"
*        endif
*endif

* pri dávkovom zadaní hladtext1 obsahuje údajovú skupinu, napr. VLASTNICI PARCIEL
if povolwild==.T.
               if left(hladtext1,1)!="*"
                       hladtext1:="*"+hladtext1
        endif
               if right(hladtext1,1)!="*"
                       hladtext1:=hladtext1+"*"
        endif
endif

*qqq 9.9.2016 tu ošetriť na variant 2 a 3 kľúčov
if prechody=2

	* pri dávkovom zadaní hladtext2 obsahuje pole zadaných kľúčov, napr. mená vlastníkov
	* úprava pre array
	for i3d=1 to pkey3dpocet
	        if povolwild==.T.
	                if left(hladtext2[i3d],1)!="*"
	                        hladtext2[i3d]:="*"+hladtext2[i3d]
	                        hladtext4[i3d]:="*"+hladtext4[i3d]
	                endif
	                if right(hladtext2[i3d],1)!="*"
	                        hladtext2[i3d]:=hladtext2[i3d]+"*"
	                        hladtext4[i3d]:=hladtext4[i3d]+"*"
	                endif
	        endif
	next

	* pri dávkovom zadaní hladtext3 neobsahuje nič, hľadanie je nateraz iba dvojprechodové
	if povolwild==.T.
	        if left(hladtext3,1)!="*"
	                hladtext3:="*"+hladtext3
	        endif
	        if right(hladtext3,1)!="*"
	                hladtext3:=hladtext3+"*"
	        endif
	endif

*qqq 9.9.2016 doplnený variant pre 3 kľúče, typ zmeny, súbor, a vlastník napr. ktorý je v array dávkovo
elseif prechody=3

	* pri dávkovom zadaní hladtext2 obsahuje pole zadaných kľúčov, napr. mená vlastníkov
	* úprava pre array
	for i3d=1 to pkey3dpocet
	        if povolwild==.T.
	                if left(hladtext3[i3d],1)!="*"
	                        hladtext3[i3d]:="*"+hladtext3[i3d]
	                        hladtext4[i3d]:="*"+hladtext4[i3d]
	                endif
	                if right(hladtext3[i3d],1)!="*"
	                        hladtext3[i3d]:=hladtext3[i3d]+"*"
	                        hladtext4[i3d]:=hladtext4[i3d]+"*"
	                endif
	        endif
	next

	* pri dávkovom zadaní hladtext3 neobsahuje nič, hľadanie je nateraz iba dvojprechodové
	if povolwild==.T.
	        if left(hladtext2,1)!="*"
	                hladtext2:="*"+hladtext2
	        endif
	        if right(hladtext2,1)!="*"
	                hladtext2:=hladtext2+"*"
	        endif
	endif

endif

*ladenie("FHTSU3 po uprave :"+hladtext1+"/"+hladtext2+"/"+hladtext3+"/")

* otvorenie vstupného súboru a kontrola či bol otvorený
** súbor sa nedá otvoriť
IF ( nSource3 := FOpen( cSourceFile3, FO_READ ) ) == -1
        oznam2("Vstupný súbor sa nedá otvoriť:",cSourceFile3)
        return(.F.)
** súbor sa otvoril, tak otvára aj súbor na výstup

* !!! tu iba otvoriť a nevytvárať súbor, lebo by mal byť uź vytvorený v hlavnej funkcii
* ktorá FHTSU volá
*ELSEIF ( nTarget3 := FCreate( cTargetFile3, FC_NORMAL ) ) == -1

** ošetrenie na povolenie zápisu a zároveň povolenie zápisu iba jednému užívateľovi
ELSEIF ( nTarget3 := FOpen( cTargetFile3, FO_READWRITE+FO_DENYWRITE ) ) == -1
        FClose( nSource3 )
        oznam2("Výstupný súbor sa nedá otvoriť:",cTargetFile3)
        return(.F.)
ENDIF

*qqq tu doplniť otváranie dávkových súborov

*qqq 30.9.2016 - ak chronológia, tak čiastkové dávkové súbory nevytvárať , to isté aj keď všetky zmeny LV
**************
if chronolv!=1		// toto ošetrené všade kde nTarget3d
**************
	for i3d=1 to pkey3dpocet
	        IF ( nTarget3d[i3d] := FOpen( cTargetFile3d[i3d], FO_READWRITE+FO_DENYWRITE ) ) == -1
	                FClose( nSource3 )
	                oznam2("Výstupný súbor sa nedá otvoriť:",cTargetFile3d[i3d])
	                return(.F.)
	        ENDIF
	next
endif
*****

* skok na koniec súboru na výstup !!!, bez toho by prepisoval znova od zač.súboru
*************************
FSeek(nTarget3,0,FS_END)
*************************

*qqq 30.9.2016 - ak chronológia, tak čiastkové dávkové súbory nevytvárať , to isté aj keď všetky zmeny LV
* aj pre dávkové súbory
***************
if chronolv!=1
***************
	for i3d=1 to pkey3dpocet
	        FSeek(nTarget3d[i3d],0,FS_END)
	next
*****
endif
*****

* zistenie počtu riadkov súboru pozor trvá dlho výpočet, cca 11sec pre 22MB súbor
* vyradené, nepotrebujem to !!!
*pocetriadkovsuboru=DC_TxtCount(nSource3)

* vynulovanie výstupného reťazca
cTargetString3:=""

* zistenie veľkosti súboru
***************************
velkostsuboru3:=filesize(cSourceFile3)
velkostsuboru3p:=velkostsuboru3		// iba pre zapamätanie celej velkosti suboru, lebo neskor sa premenna
					// velkostsuboru prepisuje podla velkosti bloku
*ladenie("FILESIZE-velkostsuboru3=velkostsuboru3p "+str(velkostsuboru3))

* výpočet zistenie počtu blokov , bloky nastavujem na 100MB viď vyššie bloksize
***********************************************************
pocetblokov:=int(velkostsuboru3/bloksize)+1
pb:=pocetblokov

*ladenie("počet blokov= "+str(pb))

/* qqq 23.9.2016 blokujem, tu zbytočné už , lebo neskôr riešené bloky
* vytvorenie premennej o veľkosti predvoleného buffra
cSourceString3 := Space( velkostsuboru3 )
*/

*zostatok3:=velkostsuboru3

* načítanie súboru do premennej , reťazec
** nSourceString3 tu je iba uložené asi či načítal alebo nie ?
** samotný súbor je uložený v premennej cBuffer

/* - blokujem, lebo už nový systém dávam na delenie blokov

* NAČÍTANIE OBSAHU SÚBORU DO REŤAZCA
*********************************************************************
nSourcestring3 := FRead( nSource3, @cSourceString3, velkostsuboru3 )
*********************************************************************
*/

* NAČÍTANIE OBSAHU SÚBORU DO REŤAZCA - nová verzia z postupným načítaním blokov zo vstup.súboru
***********************************************************************************************
* cyklus pre spracovanie blokov
*****************************************
FOR aktblok=1 to pocetblokov
*****************************************
*ladenie("aktblok="+str(aktblok))

*****************
* NOVY SYSTEM !!!
*****************

* iba jeden blok  - toto OK! zhoda 100%
*****************
if pocetblokov==1

	*ladenie("pocetblokov 1, jednoprechodovy system")

	*ladenie("velkostsuboru3=velkostsuboru3= "+str(velkostsuboru3))

	velkostbloku:=velkostsuboru3					// určenie veľkosti bloku

	cSourcestring3:=Space(velkostsuboru3)				// vytvorenie space pre fread

	nSourcestring3 := FRead( nSource3, @cSourcestring3, velkostbloku)	// načítanie bloku predbežne iba pre zistenie EOL			
									// Fread vracia počet skutočne načítaných znakov
	*ladenie("načítal som nsourcestring3 znakov : "+str(nSourceString3))

	velkostsuboru3:=velkostsuboru3					// velkost pre spracovanie kódovania	


* spracovanie posledného bloku
*******************************
elseif pocetblokov!=1 .and. aktblok==pocetblokov

	*ladenie("spracovavam posledny blok")

	velkostbloku:=velkostsuboru3p-nacitanychznakov			// určenie veľkosti bloku, zostatok do konca súboru

	*ladenie("velkost zostatkového bloku pre nacitanie "+str(velkostsuboru3p)+"/"+str(velkostbloku))

	*ladenie("Space-vytvaram space pre Fread : "+str(velkostbloku))
	cSourcestring3:=Space(velkostbloku)				// vytvorenie space pre fread

	nSourcestring3 := FRead( nSource3, @cSourcestring3, velkostbloku)	// načítanie bloku predbežne iba pre zistenie EOL			
	*ladenie("FREAD final načital som text,počet znakov: ["+cSourcestring3+"],"+str(nSourcestring3))

	*ladenie("dlžka cSourcestring3 :"+str(len(cSourcestring3)))

	velkostsuboru3:=nSourcestring3					// velkost pre spracovanie kódovania	

* spracovanie ostatných blokov 
********************************
elseif pocetblokov!=1 .and. aktblok!=pocetblokov

	*ladenie("spracovavam blok :"+str(aktblok))

	velkostbloku:=bloksize							// určenie veľkosti bloku, zostatok do konca súboru
	*ladenie("velkostbloku:"+str(velkostbloku))
	
	* zistenie pozicie EOL
	lastpozicia:=FSeek(nSource3,0,FS_RELATIVE)	
	*ladenie("lastpozicia pred hľadaním EOL:"+str(lastpozicia))
	
	cSourcestring3 := Space( velkostbloku )					// vytvorenie space pre načítanie zo súboru
	nSourcestring3 := FRead( nSource3, @cSourcestring3, velkostbloku )		// načítanie bloku predbežne iba pre zistenie EOL
	*ladenie("načital som text,počet znakov: ["+cSourcestring3+"],"+str(nSourcestring3))

	poziciadelenia:=at((chr(13)+chr(10)),cSourcestring3,velkostbloku-85)
	*ladenie("poziciadelenia: "+str(poziciadelenia))

/* povodne ako to už zhruba išlo
	do while poziciadelenia==0
	*	ladenie("opakovanie hľadanie pozície delenia, lebo poziciadelenia=0")
		poziciadelenia:=at((chr(13)+chr(10)),cSourcestring3,velkostbloku-3)
	*	ladenie("poziciadelenia: "+str(poziciadelenia))
	enddo
*/

	* tu úprava aby aj pozicia delenia sa menila
	do while poziciadelenia==0
	*	ladenie("opakovanie hľadanie pozície delenia, lebo poziciadelenia=0")
		velkostbloku=velkostbloku-30
		poziciadelenia:=at((chr(13)+chr(10)),cSourcestring3,velkostbloku)
	*	ladenie("poziciadelenia: "+str(poziciadelenia))
	enddo

	velkostbloku:=poziciadelenia+1

	*ladenie("velkostbloku: "+str(velkostbloku))
	poziciafile:=FSeek(nSource3,lastpozicia,FS_SET)
	*ladenie("idem na poziciafile:"+str(poziciafile))

	*ladenie("Space-vytvaram space pre Fread : "+str(velkostbloku))
	cSourcestring3 := Space( velkostbloku )					// vytvorenie space pre načítanie zo súboru

	nSourcestring3 := FRead( nSource3, @cSourcestring3, velkostbloku )		// načítanie bloku predbežne iba pre zistenie EOL
	*ladenie("FREAD final načital som text,počet znakov: ["+cSourcestring3+"],"+str(nSourcestring3))
*???
/*
	* ak by delil EOL chr(13)+chr(10)
	cSourcestring3p:=space(1)
	if right(cSourcestring3,1)==chr(13)
		*ladenie("na konci je chr(13)")
		FRead( nSource3, @cSourcestring3p, 1 )		
		cSourcestring3+=cSourcestring3p
		nSourcestring3++
	endif
*/
	*ladenie("dlžka cSourcestring3 :"+str(len(cSourcestring3)))

	velkostsuboru3:=nSourcestring3							// priradenie pre nasledujúci cyklus
	*velkostsuboru3:=bloksize
	
	nacitanychznakov+=nSourcestring3	
	*ladenie("nacitanych znakov pocitadlo :"+str(nacitanychznakov))

endif
* POTIAĽ NOVÝ SYSTÉM
**********************

pprechody:=prechody

* pri dávkovom hľadaní tu toto je v poriadku, lebo sa iba urobí prvé hľadanie pre skupinu VLASTNÍCI
hladtext:=hladtext1                // ako default ide hladtext1 1.kľúč

* !!! nútené doplnenie znaku EOL, aby korektne spracoval aj súbory nekončiace na EOL
***************************************************************************************************************
*if right(cSourceString3,2)!=EOL
*        cSourceString3+=EOL
*endif

*qqq 25.3.2016 doplnenie špeciálneho riadiaceho textu
*cSourceString3+="| ENDIMPORT"+EOL

* doplnenie riadiacej značky
*cSourceString3+="| POLOZKA"+EOL

*********************
DO WHILE pprechody>=1                // začiatok cyklu prechodov, možné ich aj neskôr rozšíriť na viac podmienok
*********************

* nulovanie premenných lebo mohlo ostať z minulého prechodu
rp:=0
nt:=.F.
ntdand:=0			// mením z logical na číslo 0 že všetky vyhovujú, >0 jeden alebo viac nevyhovuje
for i3d=1 to pkey3dpocet
	ntd[i3d]:=.F.
next
pomrp:=0
np:=.F.
outriadok3:=""
pomriadok3:=""
ctext1:=""
ctext2:=""
ctext:=""
poziciaEOL:=0
lastpoziciaEOL:=0

*DECLARE polozkavz[20000]

* nulovanie poľa polozkavz
*for x3=1 to 20000
*        polozkavz[x3]:=""
*next

* !!! nútené doplnenie znaku EOL, aby korektne spracoval aj súbory nekončiace na EOL
***************************************************************************************************************
*if right(cSourceString3,2)!=EOL
*        cSourceString3+=EOL
*endif

*qqq 25.3.2016 doplnenie špeciálneho riadiaceho textu
*qqq 27.3.2016 doplnenie EOL vždy, aj keď duplovane bude
cSourceString3+=(EOL+"| ENDIMPORT"+EOL)

* doplnenie riadiacej značky
*cSourceString3+="| POLOZKA"+EOL

* výpočet veľkosti súboru resp. bloku už v reťazci načítaného , tj. nie filesize
zostatok3:=len(cSourcestring3)

*qqq pokusne prekonvertovanie názvu kat.územia , toto dá správne iba do hlavičky nie ale v hľadaní
pomnazkut:=convtoansiCP(pomnazku)

* Vygenerovanie hlavičky do protokolu
* generovanie hlavičky iba ak nieje typ X
*if prvyprechod=.T.                // ak prvý prechod, doplním hlavičku k.u.
if pomtypx==0
        outriadok3+="#*****************************************************************************"+EOL
*       outriadok3+="#* "+pomcisku+" - "+pomnazku+EOL
        outriadok3+="#* "+pomcisku+" - "+pomnazkut+EOL
        outriadok3+="#*****************************************************************************"+EOL
*else
elseif pomtypx==1
*        outriadok3:=outriadok3+"#******************************************************************POMTYPX1*DP"+EOL
*        outriadok3:=outriadok3+"#* "+pomcisku+" - "+pomnazkut+EOL
*        outriadok3:=outriadok3+"#*****************************************************************************"+EOL
endif

*qqq 6.5.2016  zadefinovanie premennej pre zapamätanie predchádzajúceho riadku
lastrow:=""

* cyklus pre načítavanie riadkov z reťazca
*****************************************************
*DO WHILE (len(cSourcestring3))>0
DO WHILE zostatok3>0

	*lastrow:=pomriadok3	// zapamätanie posledne načítaného riadku

        * znak vo vyjadrení číselnej Ascii hodnoty
        * znak:=asc(cSourcestring3[i])
        * znak vo vyjadrení char tj. ako znak
        * znak:=cSourcestring3[i]

        * načítanie znaku z reťazca zo zvolenej pozície a budúcej pozície
        * detekcia znaku EOL resp. chr(13)+chr(12)
        * + uloženie riadku do premennej
        ** ak prvý riadok
        if lastpoziciaEOL==0
                poziciaEOL:=at(EOL,cSourcestring3)
                pomriadok3:=substr(cSourcestring3,1,poziciaEOL-1)
        ** ak už ďalšie načítavané riadky
        else
                poziciaEOL:=at(EOL,cSourcestring3,lastpoziciaEOL+2)
                pomriadok3:=substr(cSourcestring3,lastpoziciaEOL+2,poziciaEOL-(lastpoziciaEOL+2))
        endif

*        * ak typ X a riadiaci znak
*        if pomtypx==1
*                // ak riadiaci riadok, tak zapis riadku do protokolu
*                if at("#*",pomriadok3)!=0
*                        outriadok3+=(pomriadok3+EOL)
*                endif
*        endif

	* ak riadiaci riadok #*
	************************
        if at("#*",pomriadok3)!=0
                if pomtypx==1
                        outriadok3+=(pomriadok3+EOL)	// zápis riadiacich riadkov do výstupu

			*qqq1 doplnenie zápisu aj názvu k.ú. aj do dávkových ptk
			for i3d :=1 to pkey3dpocet
				outriadok3d[i3d]+=(pomriadok3+EOL)	// zápis riadiacich riadkov do výstupu
			next

                endif
		*qqq 29.10.2016 - doplnenie nulovania pre istotu
		nt:=.F.

	* ak riadiaci riadok ENDIMPORT na poriešenie posledného riadku vo VZ
	*********************************************************************	
        elseif at("| ENDIMPORT",pomriadok3)!=0

                * ak v predchádzajúcej položke bolo evidované nájdenie textu
		*qqq 26.10.2016
		*if nt==.T.
                if nt==.T. .and. vrozsahu==.T.

*qqq 3.11.2016 tu by mohlo byť vyhodnotenie takto
*if (pomdavkaorand=.F. .and. nt==.T. .and. vrozsahu==.T.) .or. (pomdavkaorand=.T. .and. nt==.T. .and. nt2==.T. .and. vrozsahu==.T.)
* kde nt2 sa vyhodnotí extra nižšie tiež len ak pomdavkaorand=.T.
* overiť, či tu sa dostáva informácia o pomdavkaorand
* a pri hľadaní ak je jeden z kľúčov prázdny, tak ho netestovať, 
* napr. ak dám meno, alebo meno + ident, alebo len ident, 


			***********************************************	
                        * zápis obsahu predchádzajúcej PVZ do výstupu
			***********************************************

*qqq presun až za spracovanie dávkových ptk
*			* zápis do spoločného protokolu
*                        FOR pomrp = 1 to rp
*                                // zapis riadku do protokolu
*                                outriadok3+=(polozkavz[pomrp]+EOL)
*                        NEXT

			* ak klasické spracovanie z podmienkou dávky OR
			***********************************************	
			if pomdavkaand=.F.
				* triedenie podľa dávok
				for i3d = 1 to pkey3dpocet

					if ntd[i3d]=.T.
		                	        * zápis obsahu predchádzajúcej PVZ do výstupu
                		        	FOR pomrp = 1 to rp
	                                		// zapis riadku do protokolu
			                                outriadok3d[i3d]+=(polozkavz[pomrp]+EOL)
                			        NEXT
						ntd[i3d]:=.F.
					endif
				next
				* zápis do spoločného protokolu
        	                FOR pomrp = 1 to rp
                	                // zapis riadku do protokolu
                        	        outriadok3+=(polozkavz[pomrp]+EOL)
	                        NEXT

			* spracovanie dávky z podmienkou AND
			*************************************
			elseif pomdavkaand=.T.

				ntdand:=0
				* triedenie podľa dávok
				for i3d = 1 to pkey3dpocet

					if ntd[i3d]=.T.
		                	        * zápis obsahu predchádzajúcej PVZ do výstupu
                		        	FOR pomrp = 1 to rp
		                               		// zapis riadku do protokolu
			                                outriadok3d[i3d]+=(polozkavz[pomrp]+EOL)
                			        NEXT
						ntd[i3d]:=.F.
					else
						ntdand++
					endif
				next

				if ntdand=0 .or. pprechody!=1	// tu špeci podmienka, lebo pri prvom prechode 
								// filtruje iba VLASTNICI
					* zápis do spoločného protokolu
        		                FOR pomrp = 1 to rp
                		                // zapis riadku do protokolu
                        		        outriadok3+=(polozkavz[pomrp]+EOL)
		                        NEXT
				endif
			endif
			*****

                        * nulovanie príznaku nájdenia textu
                        nt:=.F.

		*qqq 29.10.2016 tu doplnenie možnosti ak je nt ale nieje v rozsahu
		else	
			nt:=.F.
                endif
                rp:=1

		*qqq dopĺňam 6.5.2016  či tu netreba np vynulovať	???
		np:=.F.

	* ostatné možnosti - údajové riadky
	************************************
        else

        * ak riadok začína položka VZ , začínam ukladať 
	************************************************
        if at("| POLOZKA",pomriadok3)!=0

                np:=.T.                        // našiel som polozku

                * ak v predchádzajúcej položke bolo evidované nájdenie textu
		*qqq 26.10.2016
		*if nt==.T.
                if nt==.T. .and. vrozsahu==.T.

			***********************************************
                        * zápis obsahu predchádzajúcej PVZ do výstupu
			***********************************************

*qqq presun až za spracovanie dávkových ptk
*                        FOR pomrp = 1 to rp
*                                // zapis riadku do protokolu
*                                outriadok3+=(polozkavz[pomrp]+EOL)
*                        NEXT

			* ak klasické spracovanie z podmienkou dávky OR
			***********************************************
			if pomdavkaand=.F.

				* triedenie podľa dávok
				for i3d =1 to pkey3dpocet
					if ntd[i3d]=.T.
		        	                * zápis obsahu predchádzajúcej PVZ do výstupu
                			        FOR pomrp = 1 to rp
                                			// zapis riadku do protokolu
			                                outriadok3d[i3d]+=(polozkavz[pomrp]+EOL)
        	        		        NEXT
						ntd[i3d]:=.F.
					endif
				next
				* zápis do spoločného protokolu
        	                FOR pomrp = 1 to rp
                	                // zapis riadku do protokolu
                        	        outriadok3+=(polozkavz[pomrp]+EOL)
	                        NEXT

			* spracovanie dávky z podmienkou AND
			************************************
			elseif pomdavkaand=.T.

				ntdand:=0
				* triedenie podľa dávok
				for i3d =1 to pkey3dpocet

					if ntd[i3d]=.T.
		                	        * zápis obsahu predchádzajúcej PVZ do výstupu
                		        	FOR pomrp = 1 to rp
		                               		// zapis riadku do protokolu
			                                outriadok3d[i3d]+=(polozkavz[pomrp]+EOL)
                			        NEXT
						ntd[i3d]:=.F.
					else
						ntdand++
					endif
				next

				if ntdand=0 .or. pprechody!=1	// tu špeci podmienka, lebo pri prvom prechode 
								// filtruje iba VLASTNICI
					* zápis do spoločného protokolu
        		                FOR pomrp = 1 to rp
                		                // zapis riadku do protokolu
                        		        outriadok3+=(polozkavz[pomrp]+EOL)
		                        NEXT
				endif
			endif

                        * nulovanie príznaku nájdenia textu
                        nt:=.F.

		*qqq 29.10.2016 tu doplnenie možnosti ak je nt ale nieje v rozsahu
		else	
			nt:=.F.
                endif
                rp:=1                        // nastavujem prvý riadok položky

		*qqq 26.10.2016 doplnenie automat.úpravy zápisu položky VZ rok PVZ na RRRR formát
		*polozkavz[rp]:=pomriadok3        // ukladám prvý riadok položky
                polozkavz[rp]:=uprrpvz(pomriadok3)        // ukladám prvý riadok položky

		*qqq 26.10.2016 zistenie dátumu nasledujúcej položky
		datpvz:=ctod(alltrim(substr(pomriadok3,at("|",pomriadok3,2)+1,at(" o ",pomriadok3)-at("|",pomriadok3,2))))
		if h_hu=1 .or. ((h_hu=2 .or. h_hu=3) .and. datpvz>=(h_hod) .and. datpvz<=(h_hdo))	// začiatok vyhodnotenia dátumu
			vrozsahu:=.T.
		else
			vrozsahu:=.F.	
		endif

*        * ak riadok riadiaci koniec bloku importu
*        elseif at("| ENDIMPORT",pomriadok3)!=0
*                * ak v predchádzajúcej položke bolo evidované nájdenie textu
*                if nt:=.T.
*                        * zápis obsahu predchádzajúcej PVZ do výstupu
*                        FOR pomrp := 1 to rp
*                                // zapis riadku do protokolu
*                                outriadok3+=(polozkavz[pomrp]+EOL)
*                        NEXT
*
*                        * nulovanie príznaku nájdenia textu
*                        nt:=.F.
*                endif
*                rp:=1

        * ak riadok nezačína polozka VZ
	********************************
        else
                if np=.T.                                // ak bola registrovaná začínajúca položka
                        rp++                        // pridávam riadok položky
                        polozkavz[rp]:=pomriadok3        // ukladám ďalší riadok položky
                endif
        endif

        * ak našiel vyhovujúci text, značím si príznak našiel
        *qqq tu skúšam vyradiť doplnenie medzery
        * toto bolo povodne
        *ctext:=substr(pomriadok3,1,len(pomriadok3)-1)+" "
        * a toto upravene

	*!!!toto nemusí byť asi tu  už
	*ctext:=substr(pomriadok3,1,len(pomriadok3))
	* skúšam

*qqq 15.8.2017 vyradzujem, zbytočná medzipremenná ctext
*        ctext:=pomriadok3

        * ak typ 2 , odstrániť diakritiku
        if pomtyp==2

                // prevod LATIN-2 -> ASCII pre DOS 852 aj Win1250 EE

                *ctext:=lat_asc(ctext)
                *ctext:=lat_ibm(ctext)

		*optim3 - úprava pre optimalizovanú verziu lat_ibm
		*ctext1:=lat_ibm_u(ctext)
		*ctext2:=lat_ibm(ctext)

*qqq 15.8.2017 upravujem bez použitia medzipremennej ctext
*                ctext1:=lat_ibm_u_o(ctext)
*                ctext2:=lat_ibm_o(ctext)

                ctext1:=lat_ibm_u_o(pomriadok3)
                ctext2:=lat_ibm_o(pomriadok3)

        * bez odstránenia diakritiky
        else

*qqq 15.8.2017 upravujem bez použitia medzipremennej ctext
*                ctext1:=ctext
*                ctext2:=ctext

                ctext1:=pomriadok3
                ctext2:=pomriadok3

        endif

	*********************************************
        * samotné hľadanie textu v reťazci - riadku
	*********************************************
        * spôsob hľadania či povolené wildcards
        if povolwild==.F.

                *qqq 3.3.2016 skúška úpravy pre doplenie medzery
                * povodne
                *if at(hladtext,upper(ctext1))!=0 .or. at(hladtext,upper(ctext2))!=0
                * uprava 1
                *if at(hladtext+" ",upper(ctext1))!=0 .or. at(hladtext+" ",upper(ctext2))!=0
                * uprava 2

*qqq dávka
		* pprechody!=1
                if pprechody!=1

                        * toto je aktualne ku 25.3.2016
                        if (at(hladtext+" ",upper(ctext1)+" ")!=0) .or. (at(hladtext+" ",upper(ctext2)+" ")!=0)

				* test ak chronológia, tak vylúčenie falošných nálezov, ak predch. riadok nebol Cislo LV
*optim1				if (chronolv=1) .and. (substr(ltrim(hladtext),1,4)=="NOVE") 
				if (chronolv=1) .and. (substr((hladtext),1,4)=="NOVE") 
					if substr(lastrow,1,45)=="Cislo LV                                Stare"
						nt:=.T.
					else
						*nt:=.T.
					endif
				else
	                                nt:=.T.
				endif
                        endif

		* pprechody=1
                else

*qqq 13.10.2016 presúvam tu, aby optimalizovalo cyklus

*qqqx 15.6.2018 optimalizácia, vyradenie úprav upper, latibm, ak sa nespracovávajú texty s diakritikou
* pôvodné
*
			upper_ctext1:=upper(ctext1)+" "
			upper_ctext2:=upper(ctext2)+" "
*
* úprava 
/*
if chronolv!=1
			upper_ctext1:=upper(ctext1)+" "
			upper_ctext2:=upper(ctext2)+" "
else
			upper_ctext1:=ctext1+" "
			upper_ctext2:=ctext2+" "
endif
*/
* koniec úpravy
                        for i3d :=1 to pkey3dpocet
*optim4
*                       if (at(hladtext[i3d]+" ",upper(ctext1)+" ")!=0) .or. (at(hladtext[i3d]+" ",upper(ctext2)+" ")!=0)

*			upper_ctext1:=upper(ctext1)+" "
*			upper_ctext2:=upper(ctext2)+" "

*qqqx 15.6.2018 optimalizácia, vyradenie úprav upper, latibm, ak sa nespracovávajú texty s diakritikou
* pôvodné
/*
                        if (at(hladtext[i3d]+" ",upper_ctext1)!=0) .or. (at(hladtext[i3d]+" ",upper_ctext2)!=0)

				* test ak chronológia, tak vylúčenie falošných nálezov, ak predch. riadok nebol Cislo LV
*optim1				if (chronolv=1) .and. (substr(ltrim(hladtext[i3d]),1,4)=="NOVE") 
				if (chronolv=1) .and. (substr((hladtext[i3d]),1,4)=="NOVE") 
					if substr(lastrow,1,45)=="Cislo LV                                Stare"
                                		nt:=.T.
	       	                        	ntd[i3d]:=.T.
					else
                                		*nt:=.T.
	       	                        	*ntd[i3d]:=.T.
					endif
				else
	                                nt:=.T.
        	                        ntd[i3d]:=.T.
				endif
                        endif
*/
* úprava 
if chronolv!=1
                        if (at(hladtext[i3d]+" ",upper_ctext1)!=0) .or. (at(hladtext[i3d]+" ",upper_ctext2)!=0)

				* test ak chronológia, tak vylúčenie falošných nálezov, ak predch. riadok nebol Cislo LV
*optim1				if (chronolv=1) .and. (substr(ltrim(hladtext[i3d]),1,4)=="NOVE") 
				if (chronolv=1) .and. (substr((hladtext[i3d]),1,4)=="NOVE") 
					if substr(lastrow,1,45)=="Cislo LV                                Stare"
                                		nt:=.T.
	       	                        	ntd[i3d]:=.T.
					else
                                		*nt:=.T.
	       	                        	*ntd[i3d]:=.T.
					endif
				else
	                                nt:=.T.
        	                        ntd[i3d]:=.T.
				endif
                        endif
else
                        if (at(hladtext[i3d]+" ",upper_ctext1)!=0) 

				* test ak chronológia, tak vylúčenie falošných nálezov, ak predch. riadok nebol Cislo LV
*optim1				if (chronolv=1) .and. (substr(ltrim(hladtext[i3d]),1,4)=="NOVE") 
				if (chronolv=1) .and. (substr((hladtext[i3d]),1,4)=="NOVE") 
					if substr(lastrow,1,45)=="Cislo LV                                Stare"
                                		nt:=.T.
	       	                        	ntd[i3d]:=.T.
					else
                                		*nt:=.T.
	       	                        	*ntd[i3d]:=.T.
					endif
				else
	                                nt:=.T.
        	                        ntd[i3d]:=.T.
				endif
                        endif
endif
* koniec úpravy
                        next
                endif

	* pri dávke vlastníci idem tu 
        elseif povolwild==.T.

                if pprechody!=1
                        if (like(hladtext,upper(ctext1))=.T.) .or. (like(hladtext,upper(ctext2))=.T.)

				* test ak chronológia, tak vylúčenie falošných nálezov
*optim1				if (chronolv=1) .and. (substr(ltrim(hladtext),1,4)=="NOVE") 
				if (chronolv=1) .and. (substr((hladtext),1,4)=="NOVE") 
					if substr(lastrow,1,45)=="Cislo LV                                Stare"
                                		nt:=.T.
					else
                                		*nt:=.T.
					endif	
				else
	                                nt:=.T.
				endif
                        endif
                        * toto neberie neviem prečo
                        *nt:=like(hladtext,upper(ctext))
		* ak chrono LV tak iba toto sa využije
                else

*qqq 13.10.2016 presúvam tu, aby optimalizovalo cyklus
			upper_ctext1:=upper(ctext1)+" "
			upper_ctext2:=upper(ctext2)+" "

                        for i3d :=1 to pkey3dpocet
*optim4
*                       if (like(hladtext[i3d],upper(ctext1))=.T.) .or. (like(hladtext[i3d],upper(ctext2))=.T.)

*			upper_ctext1:=upper(ctext1)+" "
*			upper_ctext2:=upper(ctext2)+" "
                        if (like(hladtext[i3d],upper_ctext1)=.T.) .or. (like(hladtext[i3d],upper_ctext2)=.T.)

				* test ak chronológia, tak vylúčenie falošných nálezov
*optim1				if (chronolv=1) .and. (substr(ltrim(hladtext[i3d]),1,4)=="NOVE") 
				if (chronolv=1) .and. (substr((hladtext[i3d]),1,4)=="NOVE") 
					if substr(lastrow,1,45)=="Cislo LV                                Stare"
	                                	nt:=.T.
		       	                        ntd[i3d]:=.T.
					else
	                                	*nt:=.T.
		       	                        *ntd[i3d]:=.T.
					endif
				else
	                                nt:=.T.
        	                        ntd[i3d]:=.T.
				endif	
                        endif
                        * toto neberie neviem prečo
                        *nt:=like(hladtext,upper(ctext))
                        next
                endif
        endif

	* zmena algoritmu, toto dopĺňam
        endif                // toto kontrola podmienky či nieje riadiaci znak

        zostatok3:=zostatok3-len(pomriadok3)-2                // toto pôvodne bolo ku 25.3.2016

        lastpoziciaEOL:=poziciaEOL

	*lastrow:=pomriadok3	// zapamätanie posledne načítaného riadku
	lastrow:=ctext1

ENDDO


* kontrola či nieje viacprechodové hľadanie
* odpočítanie počtu prechodov
pprechody:=pprechody-1

* dočasne zablokované na preverenie čo je v 1.prechode
if prechody=1
        * konečný zapis do vystupu
        FWrite( nTarget3, outriadok3)

* pre dávkové hľadanie iba toto je teraz použité !!!
elseif prechody=2
        if pprechody=1
                prvyprechod:=.F.
                cSourcestring3:=outriadok3        // nahratie obsahu medzisúboru do cSourcestring na opakované spracovanie
                *zostatok3:=len(cSourcestring3)    // zistenie veľkosti premennej, súboru

                * úprava pre pole kľúčov, ostáva tak, dúfam že tu nezhavaruje, do hladtext sa uloží pole
                hladtext:=hladtext2                  // nastavenie hľadacieho kľúča

                pomtypx:=1

        elseif pprechody=0
                * konečný zapis do vystupu
                FWrite( nTarget3, outriadok3)

		*qqq 30.9.2016 - ak chronológia, tak čiastkové dávkové súbory nevytvárať , to isté aj keď všetky zmeny LV		
		***************
		if chronolv!=1	
		***************
	                for i3d:=1 to pkey3dpocet
        	               FWrite( nTarget3d[i3d], outriadok3d[i3d])
	                next
		*****
		endif
		*****
        endif

elseif prechody=3
        if pprechody=2
                prvyprechod:=.F.

                cSourcestring3:=outriadok3        // nahratie obsahu medzisúboru do cSourcestring na opakované spracovanie
                *zostatok3:=len(cSourcestring3)    // zistenie veľkosti premennej, súboru
                hladtext:=hladtext2
                pomtypx:=1

        elseif pprechody=1
                prvyprechod:=.F.

                cSourcestring3:=outriadok3        // nahratie obsahu medzisúboru do cSourcestring na opakované spracovanie
                *zostatok3:=len(cSourcestring3)        // zistenie veľkosti premennej, súboru
                hladtext:=hladtext3
                pomtypx:=1

        elseif pprechody=0
                * konečný zapis do vystupu
                FWrite( nTarget3, outriadok3)
        endif
endif

*****
ENDDO                // koniec cyklu prechodov
*****

* konečný zapis do vystupu
*FWrite( nTarget3, outriadok3)

*KONIEC SPRACOVANIA CYKLU PRE HĽADANIE

********	
NEXT	// koniec cyklu blokov
********

* vypnutie exact,
SET EXACT OFF

* zatvorenie vstupného a výstupného súboru
FClose( nSource3 )

FClose( nTarget3 )

* zatvorenie dávkových protokolov

*qqq 30.9.2016 - ak chronológia, tak čiastkové dávkové súbory nevytvárať , to isté aj keď všetky zmeny LV
***************
if chronolv!=1
***************
	for i3d=1 to pkey3dpocet
		FClose( nTarget3d[i3d] )
	next
*****
endif
*****

*********************
*RETURN FError()
RETURN(.T.)
*********************


Victorio
Posts: 620
Joined: Sun Jan 18, 2015 11:43 am
Location: Slovakia

Re: array size

#9 Post by Victorio »

Hi all,

I mean, found problem.

When using aadd() to add element to array, used like here : aadd(polozkavz,text,rp), where rp is counter for rows.
but I forget initialize array after every block,then in array stay old content with many rows, and third parameter causes "insert" element to position. I mean this slowing process because all elements move by position.
When not use third parameter, works all fine.

Post Reply