purebasic.info

PureBasic forum
Текущее время: Сб сен 22, 2018 10:39 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: CompareMemory
СообщениеДобавлено: Ср фев 21, 2018 12:00 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
len.i = 1024*1024*700
*mem1 = AllocateMemory(len)
*mem2 = AllocateMemory(10)
 
PokeS(*mem2, "1234567890", -1, #PB_Ascii)
 
For i = 0 To len -1
  CompareMemory(*mem1+i, *mem2, 10)
Next i
 
FreeMemory(*mem2)
FreeMemory(*mem1)


В итоге более 700Мбайт памяти. Что это? :shock:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Ср фев 21, 2018 12:48 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 410
Благодарил (а): 5 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
len.i = 1024*1024*700 и за этого.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Ср фев 21, 2018 1:08 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
@ZOLO@ писал(а):
len.i = 1024*1024*700 и за этого.
Ну, не знаю :? Читается кусок памяти - сравнивается - освобождается. Зачем его кэшировать, для скорости? Но какой ценой.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Ср фев 21, 2018 2:07 pm 
В сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
repeat писал(а):
В итоге более 700Мбайт памяти. Что это? :shock:

Ты ведь выделил 734 метра в *mem1.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Ср фев 21, 2018 2:20 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
Ты ведь выделил 734 метра в *mem1.
Скорее зарезервировал,то есть запретил другим трогать эту область. Но могу и не заполнять. CompareMemory явно что-то химичит.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Ср фев 21, 2018 4:04 pm 
В сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
repeat писал(а):
qpAHToMAS писал(а):
Ты ведь выделил 734 метра в *mem1.
Скорее зарезервировал,то есть запретил другим трогать эту область. Но могу и не заполнять. CompareMemory явно что-то химичит.

Не понимаю. Ты ведь allocate сделал, какой это резерв?
И если CompareMemory() из кода убрать, то памяти будет жраться столько же...

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Чт фев 22, 2018 12:12 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
Ты ведь allocate сделал, какой это резерв?

Это начальный адрес в виртуальном адресном пространстве процесса. Не физический.

qpAHToMAS писал(а):
И если CompareMemory() из кода убрать, то памяти будет жраться столько же...

Давайте проверим :)
Код:
1
2
3
4
5
6
7
8
len.i = 1024*1024*1024+1024*1024*999
 
For i = 0 To 100
  *mem = AllocateMemory(len)
  *mem + i
Next i
 
Delay(6000)



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Чт фев 22, 2018 12:26 am 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 410
Благодарил (а): 5 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
repeat, проверил AllocateMemory возвращает ноль.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Чт фев 22, 2018 12:50 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
@ZOLO@ писал(а):
repeat, проверил AllocateMemory возвращает ноль.

@ZOLO@, просто у вас мало оперативной памяти :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Чт фев 22, 2018 1:59 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Меня WinHex сбивает с толку, как-то он хитро устроен. То что MapViewOfFile и отрисовка только видимой области это понятно, но как-то уж очень шустро и памяти практически не занимает.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Чт фев 22, 2018 5:25 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
Здесь обсуждали работу HEX редакторов viewtopic.php?f=7&t=3176

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Сб июл 28, 2018 10:30 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
я вроде эту тему уже затрагивал... но в какой теме я это писал - черт знает. так вот как лучше поступить? у меня есть память, где лежит файл. в нем кубики по 32 байта. нужно их сравнить между собой и выкинуть повторяющиеся. там вроде все просто и CompareMemory справляется хорошо. но это графика и некоторые кубики могут быть отзеркалены. вот тут я написал порнографию по перевороту оригинального кубика в зеркало по х либо по у либо по обоим. получается так:
по циклу гоняем все кубики
новый кубик в цикле гоняем от начала до текущего -1 и сравниваем как есть
если нет - переворачиваем по Х и сравниванием
если нет - переворачиваем оригинал по У и сравниваем
если нет - переворачиваем по Х и У и сравниванием
если нет - ух ты! кубик уникальный.

и что-то это дело как-то долго. 30 килобайт будет проверятся секунд 20-30.


быть может мне надо использовать не систему: скопировал, перевернул, CompareMemory
а с помощью циклов, только что в правильном порядке их гонять? хотя там еще сложность что сравнивать надо не число, а по 4 бита в числе. то есть дополнительные танцы с бубном со значением.

просто я чо думаю - при перевороте кубика переворачиваются все 32 байта. при проверки правильным циклом при первом разночтении брейкуем и не нужно проверять до конца 32 байта. по идее это прибавит скорости.

и еще наверное надо одновременно сравнивать все 4 возможных положения. тогда по идее будет еще быстрее. надо подумать :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Вс июл 29, 2018 4:38 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
итак... проснулся, поел... и засел. для беззеркального сравнения оставил CompareMemory, а вот свою порнографию по созданию зеркал и последующему сравнению выкинул. теперь сравниваю в цикле 4 раза по 8 байт значение в случае с вертикальным зеркалом:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
; зеркалирование самого значения А
Procedure.a MHHValueMirror(inp.a)
 
  ret.a
  tmp.a
 
  tmp = inp << 4
  ret = inp >> 4 + tmp
 
  ProcedureReturn ret
 
EndProcedure
 
*TileSetMem = AllocateMemory(96)
PokeQ(*TileSetMem,    $12345678)
PokeQ(*TileSetMem+ 8, $23456789)
PokeQ(*TileSetMem+16, $34567890)
PokeQ(*TileSetMem+24, $45678901)
; зеркало y
PokeQ(*TileSetMem+32, $45678901)
PokeQ(*TileSetMem+40, $34567890)
PokeQ(*TileSetMem+48, $23456789)
PokeQ(*TileSetMem+56, $12345678)
; зеркало х
PokeQ(*TileSetMem+64, $21436587)
PokeQ(*TileSetMem+72, $32547698)
PokeQ(*TileSetMem+80, $43658709)
PokeQ(*TileSetMem+88, $54769810)
 
; i новый, l старый
l = 0 ; нумерация потом будет в циклах
i = 2
 
 
iadd = *TileSetMem+(i*32) ; дабы не повторять эти операции в циклах
ladd = *TileSetMem+(l*32) ; дабы не повторять эти операции в циклах
 
same = 1 ; флаг заранее выставляем, что типа это тот-же самый тайл
 
 
; проще всего вертикальное зеркалирование
 
tmpiadd = iadd + 24 ; дабы не повторять 4 раза
 
For tb = 0 To 31 Step 8
  ; переворачиваем новый кусочек
  ; сравниванием со старым
 
  If PeekQ(tmpiadd - tb) <> PeekQ(ladd + tb)    
    same = 0
    Break
  EndIf
 
Next
 
 
Debug same
 
 
If same = 0
  ; значит это не вертикальное зеркало
  ; значит надо проверить на горизонтальное зеркало
  For tb = 0 To 31 Step 8
    ; новый кусочек
    ;newi = PeekQ(iadd+tb)
    ; порнография...
    ;tmpi =
   
    ; читать видимо по байтно и переворачивать
    ; после сложить в 8 байтное и сравнить.
    ; или сравнивать побайтно?
   
   
   
   
  Next
 
EndIf
 



и вот еще... а как вставлять таймер в программу? я помница где-то видел обсуждения, где в дебаге потом выбивало сколько миллисекунд это заняло для выполнения. хочу такой-же поставить, чтоб увидеть будет ли толк от всей этой писанины.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Вс июл 29, 2018 4:49 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
https://www.purebasic.com/documentation ... conds.html

Проверять лучше с выключенным отладчиком.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Вс июл 29, 2018 4:50 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
спасибо.

а я тем временем видимо чото затупил как обычно... 4 битная графика, то есть получается 8 пикселей в 4 байтах, а не в 8. и надо не 4 раза по 8, а 8 раз по 4.

***

хм... а как бы правильно прикрутить сразу вторую проверку? когда и х и у зеркала одновременно? просто ежели Х зеркало значение уже подготовлено, то грех его-же сразу неотходя от кассы и не проверить с двойным зеркалом.

***

в одном цикле все варианты зеркал проверяются. но как теперь его брейковать то? :) вешать большое условие на 3 значения? или менять for на while? но опять таки там будут 3... или даже точнее 4 значения в проверке until.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
; зеркалирование самого значения А
Procedure.a MHHValueMirror(inp.a)
 
  ret.a
  tmp.a
 
  tmp = inp << 4
  ret = inp >> 4 + tmp
 
  ProcedureReturn ret
 
EndProcedure
 
;{ ввод инфы в память
*TileSetMem = AllocateMemory(160)
PokeL(*TileSetMem,    $12345678)
PokeL(*TileSetMem+ 4, $23456789)
PokeL(*TileSetMem+ 8, $34567890)
PokeL(*TileSetMem+12, $45678901)
PokeL(*TileSetMem+16, $56789012)
PokeL(*TileSetMem+20, $67890123)
PokeL(*TileSetMem+24, $78901234)
PokeL(*TileSetMem+28, $89012345)
; зеркало y
PokeL(*TileSetMem+32, $89012345)
PokeL(*TileSetMem+36, $78901234)
PokeL(*TileSetMem+40, $67890123)
PokeL(*TileSetMem+44, $56789012)
PokeL(*TileSetMem+48, $45678901)
PokeL(*TileSetMem+52, $34567890)
PokeL(*TileSetMem+56, $23456789)
PokeL(*TileSetMem+60, $12345678)
; зеркало х
PokeL(*TileSetMem+64, $87654321)
PokeL(*TileSetMem+68, $98765432)
PokeL(*TileSetMem+72, $09876543)
PokeL(*TileSetMem+76, $10987654)
PokeL(*TileSetMem+80, $21098765)
PokeL(*TileSetMem+84, $32109876)
PokeL(*TileSetMem+88, $43210987)
PokeL(*TileSetMem+92, $54321098)
; зеркало хy
PokeL(*TileSetMem+ 96, $54321098)
PokeL(*TileSetMem+100, $43210987)
PokeL(*TileSetMem+104, $32109876)
PokeL(*TileSetMem+108, $21098765)
PokeL(*TileSetMem+112, $10987654)
PokeL(*TileSetMem+116, $09876543)
PokeL(*TileSetMem+120, $98765432)
PokeL(*TileSetMem+124, $87654321)
; новый
PokeL(*TileSetMem+128, $12345678)
PokeL(*TileSetMem+132, $12345678)
PokeL(*TileSetMem+136, $12345678)
PokeL(*TileSetMem+140, $12345678)
PokeL(*TileSetMem+144, $12345678)
PokeL(*TileSetMem+148, $12345678)
PokeL(*TileSetMem+152, $12345678)
PokeL(*TileSetMem+156, $12345678)
;}
 
; i новый, l старый
l = 0 ; нумерация потом будет в циклах
i = 4 ; 1 x зеркало, 2 у, 3 xy
 
 
iadd = *TileSetMem+(i*32) ; дабы не повторять эти операции в циклах
ladd = *TileSetMem+(l*32) ; дабы не повторять эти операции в циклах
 
same = 1 ; флаг заранее выставляем, что типа это тот-же самый тайл
 
 
; проще всего вертикальное зеркалирование
 
tmpiadd = iadd + 28 ; дабы не повторять 8 раз
tmpladd = ladd + 28
 
notsamex  = 0
notsamey  = 0
notsamexy = 0
 
;For tb = 0 To 31 Step 4
tb = 0
Repeat
 
  If notsamey = 0
    ; проверка зеркала У
    If PeekL(tmpiadd - tb) <> PeekL(ladd + tb)
      ; если не совпадение, то больше У не проверять
      notsamey = 1      
    EndIf
  EndIf
 
  If notsamex = 0 Or notsamexy = 0
    ; перевернуть значение
    iQ = MHHValueMirror(PeekA(iadd+tb+3)) +
         MHHValueMirror(PeekA(iadd+tb+2)) << 8  +
         MHHValueMirror(PeekA(iadd+tb+1)) << 16 +
         MHHValueMirror(PeekA(iadd+tb)) << 24
   
    If notsamex = 0
      If iQ <> PeekL(ladd + tb)
        notsamex = 1
      EndIf
    EndIf
   
    If notsamexy = 0
      If iQ <> PeekL(tmpladd - tb)
        notsamexy = 1
      EndIf
    EndIf
   
  EndIf
 
  tb + 4
Until tb = 32 Or (notsamey And notsamex And notsamexy)  ; тут был косяк :) 24 сначала, потом 28 и только потом 32 правильное значение
;Next
 
 
 
If notsamey And notsamex And notsamexy
  Debug "уникальный " + Str(tb)
Else
  Debug "есть совпадение " + Str(tb)  
EndIf



Последний раз редактировалось SereZa Вс июл 29, 2018 11:29 pm, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB