Более правильно сделал.
Ps:Ну да перебор от начала массива,да на асме проц так негрузится почему то у меня.
Ну и делать счёт count от 0 или 1 чтобы в процедурах поиска учесть этот момент (но это думаю не критично так как поиск основной в сравнении)
Structure koordinaty X.i Y.i X1.i Y1.i EndStructure Global count.i Global Dim koordinaty.koordinaty(0) Global Dim Stroka.s(0) Procedure Set_object(count1) ReDim koordinaty.koordinaty(count1-1) ReDim Stroka.s(count1-1) Protected i.i count=count1 For i=0 To count-1 koordinaty(i)\X=i koordinaty(i)\X1=i+100 koordinaty(i)\Y=i koordinaty(i)\Y1=i+100 Stroka(i)=Str(i) Next EndProcedure Procedure poisk(x,y) If count>0 For i=0 To count-1 With koordinaty(i) If x>=\X And x<=\X1 And y>=\Y And y<=\Y1 ProcedureReturn i EndIf EndWith Next ProcedureReturn -1 EndIf EndProcedure Procedure.i poisk2(*massiv.koordinaty,x,y,size);для теста If size<1 ProcedureReturn -1 EndIf Protected r.i=*massiv size*16 size+*massiv cikl: If x>*massiv\X And x<*massiv\X1 And y>*massiv\Y And y<*massiv\Y1 *massiv-r If *massiv=0 ProcedureReturn *massiv Else *massiv/16 ProcedureReturn *massiv;index массива с 0 EndIf Else *massiv+16 If *massiv<>size Goto cikl EndIf ProcedureReturn -1 EndIf EndProcedure Procedure.i poisk3(*massiv,x,y,countt);для теста !cmp dword [p.v_countt],0 !jz vyhod5 ; !mov dword eax,[p.p_massiv] !sal dword [p.v_countt],4 !add dword [p.v_countt],eax !mov dword ebx,[p.v_x] !mov dword edx,[p.v_y] !jmp r4555 !ckl777: !add dword eax,16 !cmp dword eax,[p.v_countt] !jz vyhod5 !r4555: !cmp dword ebx,[eax] !jl ckl777 !cmp dword ebx,[eax+8] !jg ckl777 !cmp dword edx,[eax+4] !jl ckl777 !cmp dword edx,[eax+12] !jg ckl777 !sub dword eax,[p.p_massiv] !cmp dword eax,0 !jz f6544 !sar dword eax,4 !f6544: ProcedureReturn !vyhod5: ProcedureReturn -1 EndProcedure Procedure.i poisk4(*massiv,x,y,countt);для теста !mov dword ecx,[p.p_massiv] !xor eax,eax !mov dword ebx,[p.v_x] !mov dword edx,[p.v_y] !jmp g8677 !vyhod134: ProcedureReturn -1 !ckl655: ;!add dword eax,1 !inc eax !cmp dword eax,[p.v_countt] !jz vyhod134 !add dword ecx,16 !g8677: ; !cmp dword ebx,dword[ecx] !jl ckl655 !cmp dword ebx,[ecx+8] !jg ckl655 !cmp dword edx,[ecx+4] !jl ckl655 !cmp dword edx,[ecx+12] !jg ckl655 ; ProcedureReturn EndProcedure Set_object(10000000) ;Тест 1 TimeS.q = ElapsedMilliseconds() index.l= poisk(count+50,count+50) ArrTime.q = ElapsedMilliseconds() - TimeS MessageRequester("Тест","index "+Str(index)+" stroka "+Stroka.s(index)+" время теста "+Str(ArrTime)) ;Тест 2 TimeS.q = ElapsedMilliseconds() index= poisk2(@koordinaty(),count+50,count+50,count) ArrTime.q = ElapsedMilliseconds() - TimeS MessageRequester("Тест","index "+Str(index)+" stroka "+Stroka.s(index)+" время теста "+Str(ArrTime)) ;Тест 3 TimeS.q = ElapsedMilliseconds() index= poisk3(@koordinaty(),count+50,count+50,count) ArrTime.q = ElapsedMilliseconds() - TimeS MessageRequester("Тест","index "+Str(index)+" stroka "+Stroka.s(index)+" время теста "+Str(ArrTime)) ;Тест 4 TimeS.q = ElapsedMilliseconds() index= poisk4(@koordinaty(),count+50,count+50,count) ArrTime.q = ElapsedMilliseconds() - TimeS MessageRequester("Тест","index "+Str(index)+" stroka "+Stroka.s(index)+" время теста "+Str(ArrTime))
Отредактировано Sergeihik (11.11.2022 10:36:57)