Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840

Подскажите пожалуйста аналог функции RtlMoveMemory только быстрее

29.03.2023, 12:32. Показов 3474. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Мне часто приходится копировать память, в основном это строковые данные переменной длинны.
Всем известно, что функции GeMem 1-8 работают гораздо быстрее, чем CopyMemory. Но нет такой функции для переменной длины. Вы конечно, может будете смеяться, но я при копировании небольших строк переменной длины использую даже код такой:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Select Case LenBytesSearchString
                Case 1
                    GetMem1 ByVal pData2, ByVal StrPtrstrs
                    
                Case 2
                    GetMem2 ByVal pData2, ByVal StrPtrstrs
                    
                Case 4
                    GetMem4 ByVal pData2, ByVal StrPtrstrs
                    
                Case 8
                    GetMem8 ByVal pData2, ByVal StrPtrstrs
                    
                Case Else
                    RtlMoveMemory ByVal StrPtrstrs, ByVal pData2, LenBytesSearchString
            End Select
В зависимости от количества байтов копируемой строки вызывается та или инная функция)))) Не смейтесь только надо мной, через GetMem копируется на 30-40 миллисекунд быстрее. Так вот, а случайно нет функции для переменной длины, чтобы была такая же быстрая как и GetMem?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2023, 12:32
Ответы с готовыми решениями:

алгоритм функции RtlMoveMemory Win32API n
DECLARE Integer RtlMoveMemory IN Win32API Double @Dst, String Src, Long n это функция распаковки данных кто знает алгоритм этой функции ...

Подскажите аналог функции SetConsoleCursorPosition
Подскажите аналог функции SetConsoleCursorPosition

Подскажите аналог функции StrCmpICA
Здравствуйте! Подскажите, пожалуйста, аналог функции StrCmpICA, мне нужно обязательно для ANSI строки. Просто эта функция не сравнивает...

49
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 12:04  [ТС]
Студворк — интернет-сервис помощи студентам
Посмотри сам, я не обманываю
Вложения
Тип файла: zip GetMemOptimizeNew.zip (12.5 Кб, 4 просмотров)
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 12:08  [ТС]
Мои тесты:
RtlMoveMemory (Direct): 2.94
GetMem (Direct): 2.91
CopyBytes (Direct): 3.39

RtlMoveMemory (Pointer): 1.60
GetMem (Pointer): 0.97
CopyBytes (Pointer): 2.10

Итого: Функция CopyBytes, которую вы мне тут рекламировали, оказалась в два раза медленнее чем GetMem.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 12:08
HackerVlad, так ты по 4 байта копируешь. Сейчас сделаю тест на большие блоки - там и будет видно разницу (может быть)
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 12:11  [ТС]
Я забыл сказать я копирую реально маленькое количество байтов от одного до десяти где-то в среднем по несколько миллионов раз. То есть ваш совет использовать CopyBytes заставил бы ещё больше тормозить мою программу поиска. Только хуже бы сделал.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 12:30  [ТС]
Так же не хочется обижать уважаемого Mikle Quits но его функция ещё медленнее. При копировании 4 байт.
Мои тесты:
RtlMoveMemory (Direct): 2.94
GetMem (Direct): 2.91
CopyBytes (Direct): 3.39
CopyMemorySR2D (Direct): 4.19

RtlMoveMemory (Pointer): 1.60
GetMem (Pointer): 0.97
CopyBytes (Pointer): 2.10
CopyMemorySR2D (Pointer): 2.23
Вложения
Тип файла: zip GetMemOptimizeNew.zip (19.7 Кб, 4 просмотров)
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 12:31  [ТС]
На больших блоках может и правда результат будет другой.
А на маленьких блоках, значит лучше всего GetMem, а потом уже на втором месте идёт RtlMoveMemory.
Это я ещё не тестировал memcpy настоящее.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 12:41
Вот тест.
Вложения
Тип файла: zip GetMemOptimizeNew.zip (15.5 Кб, 4 просмотров)
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 12:42
HackerVlad, есть еще GetMem8/PutMem8
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 12:52  [ТС]
Я только что проверил memcpy быстрее всего будет. Удивило, что в майкрософте написали что это "запрещённая" функция. Пхахаххаха.

Мои тесты:
RtlMoveMemory (Direct): 2.94
GetMem (Direct): 2.91
CopyBytes (Direct): 3.39
CopyMemorySR2D (Direct): 4.19
memcpy (Direct): 2.48 (быстрее всего)

RtlMoveMemory (Pointer): 1.60
GetMem (Pointer): 0.97 (быстрее всего)
CopyBytes (Pointer): 2.10
CopyMemorySR2D (Pointer): 2.23
memcpy (Pointer): 1.25
Вложения
Тип файла: zip GetMemOptimizeNew.zip (20.1 Кб, 6 просмотров)
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 13:50
HackerVlad, а смысл по 4 байта копировать. Тогда уж копируй от 1 до 10 как тебе нужно.
0
 Аватар для Mikle Quits
1024 / 313 / 18
Регистрация: 21.01.2023
Сообщений: 552
30.03.2023, 14:08
HackerVlad, HackerVlad, при копировании блоков фиксированного размера должны выигрывать функции, на это рассчитанные, типа PutMem4 и т. п. Но городить из них с помощью Ifов конструкцию - это уже будет заметно медленнее, чем использование функции, заранее рассчитанной на переменный размер.
The trick, что-то в твоём варианте теста GutMem и PutMem отстают в 30-100 раз. Проверяю на XP. Пока сильно не вникал.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 14:13
Вот корректный тест который показывает различие в скорости при копировании от MIN_SIZE до MAX_SIZE (от 1 до 10 байт в примере) с непоследовательным доступом:
Visual Basic
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
Option Explicit
 
Private Const NUM_OF_ITERATIONS As Long = 10000
Private Const NUM_OF_OFFSETS    As Long = 10000
Private Const MIN_SIZE          As Long = 1
Private Const MAX_SIZE          As Long = 10
Private Const NUM_OF_ELEMENTS   As Long = 10000
 
Private Declare Function GetMem4 Lib "msvbvm60" ( _
                         ByRef pSrc As Any, _
                         ByRef pDst As Any) As Long
Private Declare Function PutMem4 Lib "msvbvm60" ( _
                         ByRef pDst As Any, _
                         ByVal lValue As Long) As Long
Private Declare Function CopyBytes Lib "msvbvm60.dll" _
                         Alias "__vbaCopyBytes" ( _
                         ByVal lByteLen As Long, _
                         ByRef pDestination As Any, _
                         ByRef pSource As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
                    Alias "RtlMoveMemory" ( _
                    ByRef pDestination As Any, _
                    ByRef pSource As Any, _
                    ByVal lLength As Long)
Private Declare Function QueryPerformanceCounter Lib "kernel32" ( _
                         ByRef lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" ( _
                         ByRef lpFrequency As Currency) As Long
Private Declare Sub memcpy CDecl Lib "ntdll" (dest As Any, src As Any, ByVal count As Long)
 
Private Sub cmdMemcpy1_Click()
    Dim bSrc()  As Byte
    Dim bDst()  As Byte
    Dim lOfst() As Long
    Dim lSize() As Long
    Dim lI      As Long
    Dim lJ      As Long
    Dim cTime1  As Currency
    Dim cTime2  As Currency
    Dim cFreq   As Currency
 
    QueryPerformanceFrequency cFreq
    BuildArrays bSrc, bDst, lOfst, lSize
    QueryPerformanceCounter cTime1
    
    For lI = 0 To NUM_OF_ITERATIONS - 1
        For lJ = 0 To NUM_OF_OFFSETS - 1
            memcpy bDst(lOfst(lJ)), bSrc(lOfst(lJ)), lSize(lJ)
        Next
    Next lI
    
    QueryPerformanceCounter cTime2
    MsgBox Format$((cTime2 - cTime1) / cFreq * 1000, "0.00000") & "ms."
    
End Sub
 
Private Sub cmdMemcpy2_Click()
    Dim bSrc()  As Byte
    Dim bDst()  As Byte
    Dim lOfst() As Long
    Dim lSize() As Long
    Dim lI      As Long
    Dim lJ      As Long
    Dim p1      As Long
    Dim p2      As Long
    Dim cTime1  As Currency
    Dim cTime2  As Currency
    Dim cFreq   As Currency
 
    QueryPerformanceFrequency cFreq
    BuildArrays bSrc, bDst, lOfst, lSize
    QueryPerformanceCounter cTime1
    
    p1 = VarPtr(bDst(0))
    p2 = VarPtr(bSrc(0))
    
    For lI = 0 To NUM_OF_ITERATIONS - 1
        For lJ = 0 To NUM_OF_OFFSETS - 1
            memcpy ByVal p1 + lOfst(lJ), ByVal p2 + lOfst(lJ), lSize(lJ)
        Next
    Next lI
    
    QueryPerformanceCounter cTime2
    MsgBox Format$((cTime2 - cTime1) / cFreq * 1000, "0.00000") & "ms."
    
End Sub
 
' // Èñïîëüçîâàíèå RtlMoveMemory äëÿ êîïèðîâàíèÿ ñ ïðÿìîé ïåðåäà÷åé ìàññèâà
Private Sub cmdRtlMoveMemory1_Click()
    Dim bSrc()  As Byte
    Dim bDst()  As Byte
    Dim lOfst() As Long
    Dim lSize() As Long
    Dim lI      As Long
    Dim lJ      As Long
    Dim cTime1  As Currency
    Dim cTime2  As Currency
    Dim cFreq   As Currency
 
    QueryPerformanceFrequency cFreq
    BuildArrays bSrc, bDst, lOfst, lSize
    QueryPerformanceCounter cTime1
    
    For lI = 0 To NUM_OF_ITERATIONS - 1
        For lJ = 0 To NUM_OF_OFFSETS - 1
            CopyMemory bDst(lOfst(lJ)), bSrc(lOfst(lJ)), lSize(lJ)
        Next
    Next lI
    
    QueryPerformanceCounter cTime2
    MsgBox Format$((cTime2 - cTime1) / cFreq * 1000, "0.00000") & "ms."
    
End Sub
 
' // Èñïîëüçîâàíèå RtlMoveMemory äëÿ êîïèðîâàíèÿ ñ ïîìîùüþ óêàçàòåëÿ
Private Sub cmdRtlMoveMemory2_Click()
    Dim bSrc()  As Byte
    Dim bDst()  As Byte
    Dim lOfst() As Long
    Dim lSize() As Long
    Dim lI      As Long
    Dim lJ      As Long
    Dim p1      As Long
    Dim p2      As Long
    Dim cTime1  As Currency
    Dim cTime2  As Currency
    Dim cFreq   As Currency
 
    QueryPerformanceFrequency cFreq
    BuildArrays bSrc, bDst, lOfst, lSize
    QueryPerformanceCounter cTime1
    
    p1 = VarPtr(bDst(0))
    p2 = VarPtr(bSrc(0))
    
    For lI = 0 To NUM_OF_ITERATIONS - 1
        For lJ = 0 To NUM_OF_OFFSETS - 1
            CopyMemory ByVal p1 + lOfst(lJ), ByVal p2 + lOfst(lJ), lSize(lJ)
        Next
    Next lI
    
    QueryPerformanceCounter cTime2
    MsgBox Format$((cTime2 - cTime1) / cFreq * 1000, "0.00000") & "ms."
    
End Sub
 
' // Èñïîëüçîâàíèå CopyBytes äëÿ êîïèðîâàíèÿ ñ ïðÿìîé ïåðåäà÷åé ìàññèâà
Private Sub cmdCopyBytes1_Click()
    Dim bSrc()  As Byte
    Dim bDst()  As Byte
    Dim lOfst() As Long
    Dim lSize() As Long
    Dim lI      As Long
    Dim lJ      As Long
    Dim cTime1  As Currency
    Dim cTime2  As Currency
    Dim cFreq   As Currency
 
    QueryPerformanceFrequency cFreq
    BuildArrays bSrc, bDst, lOfst, lSize
    QueryPerformanceCounter cTime1
    
    For lI = 0 To NUM_OF_ITERATIONS - 1
        For lJ = 0 To NUM_OF_OFFSETS - 1
            CopyBytes lSize(lJ), bDst(lOfst(lJ)), bSrc(lOfst(lJ))
        Next
    Next lI
    
    QueryPerformanceCounter cTime2
    MsgBox Format$((cTime2 - cTime1) / cFreq * 1000, "0.00000") & "ms."
    
End Sub
 
' // Èñïîëüçîâàíèå CopyBytes äëÿ êîïèðîâàíèÿ ñ ïîìîùüþ óêàçàòåëÿ
Private Sub cmdCopyBytes2_Click()
    Dim bSrc()  As Byte
    Dim bDst()  As Byte
    Dim lOfst() As Long
    Dim lSize() As Long
    Dim lI      As Long
    Dim lJ      As Long
    Dim p1      As Long
    Dim p2      As Long
    Dim cTime1  As Currency
    Dim cTime2  As Currency
    Dim cFreq   As Currency
 
    QueryPerformanceFrequency cFreq
    BuildArrays bSrc, bDst, lOfst, lSize
    QueryPerformanceCounter cTime1
    
    p1 = VarPtr(bDst(0))
    p2 = VarPtr(bSrc(0))
    
    For lI = 0 To NUM_OF_ITERATIONS - 1
        For lJ = 0 To NUM_OF_OFFSETS - 1
            CopyBytes lSize(lJ), ByVal p1 + lOfst(lJ), ByVal p2 + lOfst(lJ)
        Next
    Next lI
    
    QueryPerformanceCounter cTime2
    MsgBox Format$((cTime2 - cTime1) / cFreq * 1000, "0.00000") & "ms."
    
End Sub
 
Private Sub BuildArrays( _
            ByRef bSrc() As Byte, _
            ByRef bDst() As Byte, _
            ByRef lOffsets() As Long, _
            ByRef lSizes() As Long)
    Dim lIndex  As Long
    
    ReDim bSrc(NUM_OF_ELEMENTS - 1)
    ReDim bDst(NUM_OF_ELEMENTS - 1)
    ReDim lOffsets(NUM_OF_OFFSETS - 1)
    ReDim lSizes(NUM_OF_OFFSETS - 1)
    
    For lIndex = 0 To NUM_OF_ELEMENTS - 1
        bSrc(lIndex) = Int(Rnd * 256)
    Next
    
    For lIndex = 0 To NUM_OF_OFFSETS - 1
    
        lOffsets(lIndex) = Int(Rnd * NUM_OF_ELEMENTS)
        lSizes(lIndex) = Int(Rnd * (MAX_SIZE - MIN_SIZE + 1)) + MIN_SIZE
        
        If lSizes(lIndex) + lOffsets(lIndex) > NUM_OF_ELEMENTS Then
            lSizes(lIndex) = NUM_OF_ELEMENTS - lOffsets(lIndex)
        End If
        
    Next
    
End Sub
Вложения
Тип файла: zip GetMemOptimizeNew.zip (15.6 Кб, 8 просмотров)
1
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 14:14
Цитата Сообщение от Mikle Quits Посмотреть сообщение
The trick, что-то в твоём варианте теста GutMem и PutMem отстают в 30-100 раз. Проверяю на XP. Пока сильно не вникал.
Так и должно быть. Это каждый раз вызывается функция для копирования 4 байт против хардварной REP MOVS. В оригинале наоборот показывалось преимущество GetMem/PutMem для копирования 4 байт вместо RtlMoveMemory.
0
 Аватар для Mikle Quits
1024 / 313 / 18
Регистрация: 21.01.2023
Сообщений: 552
30.03.2023, 14:40
Добавил SR2D в последний вариант от The Trick:

Visual Basic
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
' // Использование SR2D для копирования с прямой передачей массива
Private Sub cmdSR2D_D_Click()
    Dim bSrc()  As Byte
    Dim bDst()  As Byte
    Dim lOfst() As Long
    Dim lSize() As Long
    Dim lI      As Long
    Dim lJ      As Long
    Dim cTime1  As Currency
    Dim cTime2  As Currency
    Dim cFreq   As Currency
 
    QueryPerformanceFrequency cFreq
    BuildArrays bSrc, bDst, lOfst, lSize
    QueryPerformanceCounter cTime1
    
    For lI = 0 To NUM_OF_ITERATIONS - 1
        For lJ = 0 To NUM_OF_OFFSETS - 1
            CopyMemorySR2D bSrc(lOfst(lJ)), bDst(lOfst(lJ)), lSize(lJ)
        Next
    Next lI
    
    QueryPerformanceCounter cTime2
    MsgBox Format$((cTime2 - cTime1) / cFreq * 1000, "0.00000") & "ms."
End Sub
 
' // Использование SR2D для копирования с помощью указателя
Private Sub cmdSR2D_P_Click()
    Dim bSrc()  As Byte
    Dim bDst()  As Byte
    Dim lOfst() As Long
    Dim lSize() As Long
    Dim lI      As Long
    Dim lJ      As Long
    Dim p1      As Long
    Dim p2      As Long
    Dim cTime1  As Currency
    Dim cTime2  As Currency
    Dim cFreq   As Currency
 
    QueryPerformanceFrequency cFreq
    BuildArrays bSrc, bDst, lOfst, lSize
    QueryPerformanceCounter cTime1
    
    p1 = VarPtr(bDst(0))
    p2 = VarPtr(bSrc(0))
    
    For lI = 0 To NUM_OF_ITERATIONS - 1
        For lJ = 0 To NUM_OF_OFFSETS - 1
            CopyMemorySR2D ByVal p2 + lOfst(lJ), ByVal p1 + lOfst(lJ), lSize(lJ)
        Next
    Next lI
    
    QueryPerformanceCounter cTime2
    MsgBox Format$((cTime2 - cTime1) / cFreq * 1000, "0.00000") & "ms."
End Sub
SR2D у меня стабильно выигрывает, только memcpy не подключилась, что там нужно сделать?
1
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 14:44
Цитата Сообщение от Mikle Quits Посмотреть сообщение
SR2D у меня стабильно выигрывает, только memcpy не подключилась, что там нужно сделать?
https://www.cyberforum.ru/post15229371.html вот это нужно поставить.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 15:10  [ТС]
The trick, чего не пользуешься моей программой ClipboradPath специально же писал для копирования VB текстов в браузер)))))))) а то ты поторопился и кракозяблики скопировал))))))

Добавлено через 19 минут
Почему же так вышло что memcpy теперь стало медленее. Не понял юмора.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 15:26
Цитата Сообщение от HackerVlad Посмотреть сообщение
Почему же так вышло что memcpy теперь стало медленее. Не понял юмора.
Потому что memcpy рассчитана на большие размеры, если ты увеличишь число элементов то она будет быстрее.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 15:31  [ТС]
CopyMemorySR2D в вашем примере ТОЛЬКО на 5 млск быстрее, а не значительно как вы хвастались или у меня процессор слишком мощный или я чего-то не понимаю

Добавлено через 2 минуты
Я делаю для себя выводы что и RtlMoveMemory оптимальная достаточно функция.
Но GetMem1-8 лучше для единоразовых маленьких кусочков.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 15:35  [ТС]
Не хочу спросить наверное на слабых процессорах будет сильно отличаться скорость. Вот скомпоновал вместе с CopyMemorySR2D.
Вложения
Тип файла: zip GetMemOptimizeNew1.zip (23.7 Кб, 4 просмотров)
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 15:37  [ТС]
vbaCopyBytes по оптимальности похожа на CopyMemorySR2D только чуть-чуть медленнее. В итоге чтобы не тягать библиотеку SR2D с собой лучше использовать vbaCopyBytes там разница миллисекунд 30 всего по моим тестам
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.03.2023, 15:37

Подскажите пожалуйста только начал изучать WinApi
Написать приложение которое угадывает задуманное пользователем число от 1 до ста.для запроса к пользователю использовать окна...

GPSS задача не запускается. Только новенький в этом, подскажите c реализацией, пожалуйста
Задания проходят последовательно операции ввода, обработки и вывода. Скорость ввода и вывода заданий 120 Мб/мин. Для обработки используются...

Подскажите пожалуйста как из текста Edit выделить только последний символ ?
Здравствуйте. Подскажите пожалуйста как из текста Edit выделить только последний символ ? независимо сколько там символов - 5 символов или...

Подскажите плз аналог php функции print_r, или как преобразовать массив в string?
Может кто сталкивался...

Подскажите пожалуйста можна ли убрать то что в середине, оставить только контур окружности
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru