purebasic.info

PureBasic forum
Текущее время: Пн июн 18, 2018 10:23 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Использование таблиц
СообщениеДобавлено: Сб янв 21, 2017 3:47 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 570
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
Пример создаём таблицу перевода Sinusa с шагом от 0 до 360
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Debug "DataSection"
Debug "table1:"
Debug "!table:"
For i=0 To 354 Step 6
 
      For s=i To i
 
        Debug "data.f"+"  "+Sin(s)+","+Sin((s+1))+","+Sin((s+2))+","+Sin((s+3))+","+Sin((s+4))+","+Sin((s+5))
        ;Debug s
      Next
    Next
   
    Debug "Data.f"+" "+Sin(360)
    Debug "EndDataSection"
 


Используем её и тестем :D
Код:
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
 
 
Procedure.f tableSin(rad.i,Angle.f=0)
  !mov dword eax,[esp+4]
  !mov dword eax,[table+eax*4]
  !mov dword [esp+8],eax
  ProcedureReturn Angle
EndProcedure
 
    MessageRequester("",StrF(PeekF(?table1+8)))
    MessageRequester("",StrF(tableSin(2)))
   
   MessageRequester("", "Начало теста обычного вычисления синуса"  )
   time = GetTickCount_()
   For q=0 To 100000000
     Sin(2)
   Next
   t.d = (GetTickCount_() - time)/1000
   MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
   ;
   MessageRequester("", "Начало теста перевода синуса по таблице"  )
   time = GetTickCount_()
   For q=0 To 100000000
     tableSin(2)
   Next
   t.d = (GetTickCount_() - time)/1000
   MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
 
DataSection
 table1:  
!table:
Data.f  0,0.8414709848,0.9092974268,0.1411200081,-0.7568024953,-0.9589242747
Data.f  -0.2794154982,0.6569865987,0.9893582466,0.4121184852,-0.5440211109,-0.9999902066
Data.f  -0.536572918,0.4201670368,0.9906073557,0.6502878402,-0.2879033167,-0.9613974919
Data.f  -0.7509872468,0.1498772097,0.9129452507,0.8366556385,-0.0088513093,-0.8462204042
Data.f  -0.905578362,-0.1323517501,0.7625584505,0.9563759284,0.2709057883,-0.6636338842
Data.f  -0.9880316241,-0.4040376453,0.5514266812,0.9999118601,0.5290826861,-0.4281826695
Data.f  -0.9917788534,-0.6435381334,0.2963685787,0.9637953863,0.7451131605,-0.1586226688
Data.f  -0.9165215479,-0.8317747426,0.0177019251,0.8509035245,0.9017883476,0.1235731227
Data.f  -0.7682546613,-0.9537526528,-0.2623748537,0.6702291758,0.986627592,0.3959251502
Data.f  -0.5587890489,-0.9997551734,-0.5215510021,0.4361647552,0.9928726481,0.6367380071
Data.f  -0.3048106211,-0.96611777,-0.7391806966,0.1673557003,0.9200260382,0.8268286795
Data.f  -0.026551154,-0.855519979,-0.8979276807,-0.1147848138,0.7738906816,0.9510546533
Data.f  0.2538233628,-0.6767719569,-0.9851462605,-0.3877816354,0.5661076369,0.9995201586
Data.f  0.513978456,-0.4441126687,-0.9938886539,-0.6298879943,0.3132287824,0.9683644611
Data.f  0.7331903201,-0.1760756199,-0.923458447,-0.8218178366,0.0353983027,0.8600694058
Data.f  0.8939966636,0.1059875118,-0.7794660696,-0.9482821413,-0.2452519855,0.6832617147
Data.f  0.9835877454,0.379607739,-0.573381872,-0.9992068342,-0.5063656411,0.4520257872
Data.f  0.9948267914,0.6229886314,-0.3216224032,-0.9705352835,-0.7271425001,0.1847817446
Data.f  0.9268185054,0.8167426066,-0.0442426781,-0.8645514486,-0.8899956044,-0.0971819059
Data.f  0.7849803887,0.945435334,0.2366613934,-0.6896979409,-0.981952169,-0.3714041014
Data.f  0.5806111842,0.9988152247,0.4987131539,-0.4599034907,-0.9956869869,-0.6160404592
Data.f  0.3299908257,0.9726300672,0.7210377105,-0.193473392,-0.9301059502,-0.8116033871
Data.f  0.0530835871,0.8689657562,0.8859248165,0.0883686861,-0.7904332067,-0.9425144546
Data.f  -0.2280522595,0.6960801312,0.9802396594,0.3631713654,-0.5877950072,-0.9983453609
Data.f  -0.4910215939,0.467745162,0.9964691731,0.6090440219,-0.3383333943,-0.9746486481
Data.f  -0.7148764296,0.2021498814,0.9333205237,0.8064005808,-0.0619203373,-0.8733119828
Data.f  -0.8817846188,-0.0795485429,0.7958240965,0.9395197317,0.2194252584,-0.7024077856
Data.f  -0.9784503508,-0.3549101758,0.594932778,0.9977972794,0.4832915637,-0.4755501869
Data.f  -0.9971732888,-0.6019998677,0.3466494555,0.9765908679,0.7086591402,-0.2108105329
Data.f  -0.9364619743,-0.8011345952,0.0707522361,0.8775897878,0.8775753358,0.0707221672
Data.f  -0.8011526357,-0.9364514001,-0.2107810659,0.7086804082,0.9765843833,0.3466211801
Data.f  -0.6020239376,-0.9971710234,-0.475523669,0.4833179537,0.9977992787,0.5949085485
Data.f  -0.3549383577,-0.9784565746,-0.7023863293,0.219454668,0.9395300556,0.7958058429
Data.f  -0.0795785917,-0.8817988361,-0.8732972972,-0.0618902507,0.8064184069,0.9333097002
Data.f  0.2021203593,-0.7148975078,-0.9746419031,-0.3383050275,0.6090679302,0.9964666418
Data.f  0.4677185183,-0.4910478539,-0.9983470938,-0.5877706198,0.3631994514,0.980245622
Data.f  0.6960584883,-0.2280816094,-0.9425245273,-0.7904147415,0.0883987125,0.8859387979
Data.f  0.8689508382,0.0530534853,-0.8116209974,-0.930094878,-0.1934438172,0.7210585971
Data.f  0.9726230625,0.3299623697,-0.6160642041,-0.9956841898,-0.4598767232,0.4987392818
Data.f  0.9988166912,0.580586641,-0.3714320894,-0.9819578698,-0.6896761132,0.2366906813
Data.f  0.9454451549,0.7849617133,-0.0972119075,-0.8900093489,-0.8645362993,-0.0442125632
Data.f  0.8167599996,0.9268071855,0.1847521192,-0.7271631934,-0.9705280195,-0.3215938603
Data.f  0.623012211,0.9948237287,0.4519988981,-0.5063916349,-0.9992080341,-0.5733571748
Data.f  0.3796356268,0.9835931839,0.6832397038,-0.2452812091,-0.9482917095,-0.7794471855
Data.f  0.1060174863,0.8940101701,0.8600540265,0.0353681773,-0.821835011,-0.9234468802
Data.f  -0.1760459465,0.7332108186,0.9683569384,0.3132001549,-0.6299114067,-0.9938853259
Data.f  -0.44408566,0.5140043137,0.9995210918,0.5660827877,-0.3878094208,-0.9851514363
Data.f  -0.6767497645,0.2538525198,0.9510639681,0.7738715902,-0.1148147588,-0.8979409481
Data.f  -0.8555043708,-0.0265210203,0.8268456339,0.9200142255,0.167325981,-0.7392009988
Data.f  -0.9661099893,-0.3047819111,0.6367612506,0.992869055,0.4361376291,-0.5215767216
Data.f  -0.9997558399,-0.5587640496,0.395952831,0.9866325048,0.6702068038,-0.2624039419
Data.f  -0.9537617135,-0.7682353642,0.123603036,0.901801375,0.8508876887,0.0176717855
Data.f  -0.8317914758,-0.9165094902,-0.158592906,0.7451332646,0.9637873481,0.2963397885
Data.f  -0.643561206,-0.9917749956,-0.4281554281,0.5291082655,0.9999122599,0.5514015339
Data.f  -0.4040652195,-0.9880362735,-0.6636113342,0.2709348053,0.9563847343,0.7625389492
Data.f  -0.1323816292,-0.9055911482,-0.8462043419,-0.0088211661,0.8366721491,0.9129329489
Data.f  0.1498474057,-0.7510071513,-0.9613891968,-0.2878744485,0.6503107402,0.9906032334
Data.f  0.4201396822,-0.5365983552,-0.9999903395,-0.5439958174,0.4121459505,0.9893626322
Data.f  0.6569638725,-0.2794444418,-0.958932825,-0.7567827913,0.1411498507,0.9093099709
Data.f  0.8414546974,-0.0000301444,-0.8414872715,-0.9092848819,-0.1410901653,0.7568221986
Data.f 0.9589157234
EndDataSection
 


Нужны ли такие процедуры в языке программирования?
Думаю нужны где много вычислений,например в графической программе.... :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Сб янв 21, 2017 7:40 pm 
Не в сети
профессор

Зарегистрирован: Чт авг 05, 2010 2:36 pm
Сообщений: 466
Откуда: Донецк
Благодарил (а): 45 раз.
Поблагодарили: 11 раз.
Сергейчик
спасибо за код, в dsp такое на 100% пригодится)))

_________________
PureBasic 5.60 X86, RfoBasic 90, Tinycc 0.97, Asus K54C Intel i7 2.7 ghz, 8 gb ddr3, Intel HD 3000, Windows XP SP3, Windows 10 x64, Nexus 4 and v5.1.1.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Сб янв 21, 2017 8:56 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Сергейчик,
(Offtop):
просьба написать на FASM процедуру считывания готовых результатов из массива (который предварительно заполняется), с произвольной выборкой (насчёт Select всё ясно) по нужному параметру. Я имею в виду ассоциативный массив (вроде карты), но там ключ всего один. Нужен поиск с другим - соответственно приходится делать новую карту.
Вот такая таблица (не через Read) затмит собой все способы работы с памятью, ведь такого никто ещё не делал. А перспективы скорости!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Сб янв 21, 2017 11:15 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 570
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
6519And писал(а):
Сергейчик,
(Offtop):
просьба написать на FASM процедуру считывания готовых результатов из массива (который предварительно заполняется), с произвольной выборкой (насчёт Select всё ясно) по нужному параметру. Я имею в виду ассоциативный массив (вроде карты), но там ключ всего один. Нужен поиск с другим - соответственно приходится делать новую карту.
Вот такая таблица (не через Read) затмит собой все способы работы с памятью, ведь такого никто ещё не делал. А перспективы скорости!

Код нужно в пример для начала. :roll:
Ведь массивы по типам(переменной)разные,и что в этом поле данных по грядкам искать тоже не ясно(свеколка,морковка или боклажаны или может быть древисина сосна,язь кедр,дуб.нет возможно сталь пс,пкп,сп,а может быть костяника ,голубика или клубника(в смысле та что на,опуше растёт)):D
К стати насчет первого примера после дизасма
сделал так
Код:
1
2
3
4
5
6
7
8
 
Procedure.f tableSin1(rad.i,Angle.f=0)
  !mov dword eax,[esp+4]
  !FLD dword ptr table+eax*4
  !FSTP dword ptr esp+8
  ProcedureReturn Angle
EndProcedure
 


вроде бысттрее стало.... :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Вс янв 22, 2017 1:49 am 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Сергейчик писал(а):
Код нужно в пример для начала. :roll:
Ведь массивы по типам(переменной)разные,и что в этом поле данных по грядкам искать тоже не ясно(свеколка,морковка или боклажаны или может быть древисина сосна,язь кедр,дуб.нет возможно сталь пс,пкп,сп,а может быть костяника ,голубика или клубника(в смысле та что на,опуше растёт))

Offtop:
Я в FASM ни бум-бум (пока), да и откуда ж код, если никто так не делал (а может, делал, да я не знаю - упс :oops: )
Но поясню: что Read/Data, что Select... и т.п. В ЭТИХ ПРИМЕРАХ - тот самый "банальный перебор": крутит, пока не придёт. Товарищ в теме "Оператор Select" именно об этом сокрушался. Конечно, произвольную выборку сделать можно, но надо адресоваться по значению хеш-суммы содержимого. Так работают карты. Вот только ключ там - символьная строка. Довольно неудобно переводить цифры в символы. Предполагаю также, что карта ведёт сравнение с ключом посимвольно, и на это тратится время.
Вот и возникла мысль по ходу использовать чисто цифровые ключи. Введённый ключ, по аналогии с "таблицей синусов" - это аргумент в градусах (поиск прямой), или наоборот - сам синус (поиск обратный). Ну то есть вводим 1/2 - получаем 30° по указателю. Попробую набросать пример на PB, если заинтересовало. Вот только получится у меня 2 массива, а в принципе должен быть один. А вообще идеи есть? Может, это уж давно сделано в каком-нибудь XML?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Вс янв 22, 2017 6:42 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 620
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
6519And писал(а):
Довольно неудобно переводить цифры в символы.

Код:
1
2
3
4
 
key.u=123
karta(""+key)
 


в чём тут неудобство?
если добавить в пустую строку символ, скорость поиска возрастёт, сам проверял, реально скорость возрастает
только так ни кто и не объяснил почему это происходит


была такая тема, про цифровые ключи в карте, не знаю как её найти


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Пн янв 23, 2017 4:08 am 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Offtop:
Ну вот:
Код:
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
Structure StructArray 
  Index.l
  Value.l
  *PointToIndex
EndStructure
 
Global Dim MyArray.StructArray(120)
 
 
Procedure FillArrayForward(); Процедура заполнения массива Результат=функция(i*j)
  For j=0 To 10
    For i=0 To 10
      MyArray(n)\Index=n
      MyArray(n)\Value=i*j
      n+1
    Next
  Next
EndProcedure
Procedure FillArrayReverse(); Процедура заполнения массива i*j=функция(Результат)
  For n=0 To 120
    Val=MyArray(n)\Value
    While MyArray(k)\Value=Val And k<120
      MyArray(k)\PointToIndex=@MyArray(n)\Value
      k+1
    Wend
  Next
EndProcedure
 
FillArrayForward(); Заполним массив как, например, таблицу умножения
 
i=7:j=8 ; Проверим:
Debug Str(i)+"x"+Str(j)+"="+MyArray(i*11+j)\Value
 
; For i=0 To 10
;   For j=0 To 10
;     Debug "n="+Str(n)+"   i="+Str(i)+"   j="+Str(j)+"   Value="+MyArray(n)\Value
;     n+1
;   Next
; Next
 
SortStructuredArray(MyArray(), 0, OffsetOf(StructArray\Value), #PB_Long); После сортировки ячейки упорядочены по Результату
 
FillArrayReverse(); Теперь заполним указатели на Результат. Одному значению может соответствовать несколько (потому что 3*7=7*3 и т.п.)
 
Value = 56 ; Получим все возможные аргументы, соответствующие Результату. Разумеется, аргумент здесь лишь № в череде входных чисел
 
Debug "Например, при Value="+Str(Value)+":"
For n=0 To 120
  If MyArray(n)\PointToIndex And PeekL(MyArray(n)\PointToIndex)=Value
    Debug "n="+Str(MyArray(n)\Index)
  EndIf
Next


Создание, заполнение и сортировка массива ведётся средствами PureBasic`а. Тогда что же я прошу? Ничего :lol: Так бывает: хотел, как лучше...
Надеюсь, принцип понятен: можно получать результат по аргументу или наоборот (получится арксинус). Обратное преобразование тоже можно было бы упорядочить, но это кому как нравится

newJS писал(а):
6519And писал(а):
Довольно неудобно переводить цифры в символы.

Код:
1
2
3
4
 
key.u=123
karta(""+key)
 


в чём тут неудобство?
если добавить в пустую строку символ, скорость поиска возрастёт, сам проверял, реально скорость возрастает
только так ни кто и не объяснил почему это происходит

Похоже на недолеченный глюк PureBasic`а - совмещать переменные разных типов.
А значит, когда-то его исправят. Так что как кому, а я пользуюсь Str().
Да и не неудобство это. Просто в данной теме цель всего этого - экономить доли микросекунд. А преобразование в символы, думаю, дело не быстрое.
Карты для поиска вещь чудесная, вот только вышеописанные странности...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Пн янв 23, 2017 7:04 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 620
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
6519And писал(а):
Похоже на недолеченный глюк PureBasic`а - совмещать переменные разных типов.
А значит, когда-то его исправят. Так что как кому, а я пользуюсь Str().

это ни когда не исправят, этот фокус присутствует во всех языках, это встроенная функция, и она быстрее чем Str()


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Чт янв 26, 2017 8:52 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
newJS писал(а):
6519And писал(а):
Похоже на недолеченный глюк PureBasic`а - совмещать переменные разных типов.
А значит, когда-то его исправят. Так что как кому, а я пользуюсь Str().

newJS писал(а):
это ни когда не исправят, этот фокус присутствует во всех языках, это встроенная функция, и она быстрее чем Str()

А вот этот "фокус" я только сейчас обнаружил:
Код:
1
2
3
X=10
Debug "Результат="+X+1
Debug "Результат="+Str(X+1)


Всё правильно, так интерпретируются переменные. Но в PB до 5 версии хотя бы дебаггер предупреждал об ошибке, сейчас очень легко проглядеть и долго мучиться.
Думайте сами, решайте сами...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Пт янв 27, 2017 5:26 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 620
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
6519And, претензия в чём?
это заведомое сложение строк с понятным результатом
Код:
1
Debug "Результат="+X+1


это заведомое математическое действие, и тоже с понятным результатом
Код:
1
Debug "Результат="+Str(X+1)


что не так? заявленный фокус в чём?
ошибок тут нет, предупреждать не о чем, в обоих случаях ты получаешь что просил, а просил ты разное


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Сб янв 28, 2017 5:35 am 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Уважаемый newJS, offtop:
newJS писал(а):
что не так? заявленный фокус в чём?
ошибок тут нет, предупреждать не о чем, в обоих случаях ты получаешь что просил, а просил ты разное

Я далёк от каких-то претензий, а пост мой про то, чтобы люди осторожнее пользовались тем способом. Оказывается, кавычки с плюсом за ними компилятор воспринимает как набор строковых переменных, и производит слияние. В отличие от арифметического сложения, и пример мой это различие показывает.
Вообще-то я давно ничего здесь не прошу, ни на кого не нападаю. Пойду и за твоё здоровье стакан подниму :wink:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Использование таблиц
СообщениеДобавлено: Сб янв 28, 2017 12:55 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 570
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
На многие таблицы можно использовать встроенные функции,производя смещение в них. :roll:
Код:
1
2
3
 
PeekF(?table1+(2*4))
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

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


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

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


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

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