Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1

Правильная конкатенация

18.04.2023, 02:34. Показов 5699. Ответов 117
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На другом форуме видел такой вариант конкатенации большого массива и он мне очень понравился, поскольку скорость близкая к join. На сколько я знаю тип String это структура содержащая в себе массив символов и еслиб у нас был доступ к этому массиву и возможность делать что-то вроде redim preserve.. В общем, можно ли как-то улучшить алгоритм, чтоб закасматить окончательно етот join? )
25.02.2012 08:28:33
Если правильно делать конкатенацию в цикле, то Join отдыхает:

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
' Правильная конкатенация в цикле  
Sub FastConcat()  
 Dim x, t!, i&, j&, s$, v$  
 With Range("A1:Z65536")  'For i = 1 To 1703936: arr(i) = 1: Next
   .Value = 1  
   t = Timer  
   s = " "  
   For Each x In .Value  
     v = x & ";"  
     j = i + Len(v)  
     If j > Len(s) Then s = s & Space$(Len(s))  
     Mid$(s, i + 1) = v  
     i = j  
   Next  
   s = Left$(s, j - 1)  
   Debug.Print Timer - t  
 End With  
End Sub  
 
' Вариант с Join  
Sub io()  
 Dim t As Single  
 Dim x, z(), i As Long, line As String  
 With [A1:Z65536]
   .Value = 1  
   t = Timer  
   ReDim z(1 To .Cells.Count)  
   For Each x In .Value  
     i = i + 1  
     z(i) = x  
   Next  
   line = Join(z, ";")  
   Debug.Print Timer - t  
 End With  
End Sub
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2023, 02:34
Ответы с готовыми решениями:

Из символов одного текста строковых функций о операций конкатенация получить другой текст
Из символов одного текста с помощью строковых функций о операций конкатенация получить другой текст. Из «информатика» получить «форма»...

Правильная обработка ошибок
Здравствуйте. У меня такой вопрос. Программа сама записывает файл по сети. Если сеть выключенна то на том компьюторре на котором работает,...

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

117
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
01.05.2023, 18:07  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я если честно понятия не имею как в своих APi передавать и принимать массивы.
Тут в примерах есть, кстати. Передается указатель и размер (судя по другим примерам). Но в данном сучае я все равно не понял, второй аргумент фактически пустой..
SafeArrayRedim Not Not ResultSplit, SafeArrayBound(0)

Добавлено через 5 минут
Трик здесь вместо Not Not рекомендует использовать другую функцию
Visual Basic
1
2
3
4
' Получить адрес SafeArray
Public Function GetSA(ByVal addr As Long) As Long
    GetMem4 ByVal addr, GetSA
End Function
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
01.05.2023, 18:11
Любой массив в VB6/VBA это SAFEARRAY массив. Можно работать из любого ЯП с ним.
2
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
01.05.2023, 18:57  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Работает с космической скоростью с сайта VBspeed
Действительно какая-то просто низкоуровенная вещь(!)..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.05.2023, 19:11
testuser2, да пожалуйста, я сам это нашёл на сайте VbSpeeds, там очень много скоростных фишек для VB. Ихний девиз VB может работать очень быстро. А то у многих заблуждение что программы созданные на VB медленные. Это смотря как программировать. На VB6 можно написать коды которые будут работать быстрее чем на С++

Добавлено через 1 минуту
The trick, вот сюда зайди посмотри http://www.xbeat.net/vbspeed/ я там это всё скачал там ещё очень много чего есть для супер-скоростей
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
12.09.2023, 10:26  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
На сколько я знаю тип String это структура содержащая в себе массив символов и еслиб у нас был доступ к этому массиву и возможность делать что-то вроде redim preserve..
Правильнее будет структура, содержащая указатель на буфер - массив символов. Пришла нужная идея по этой теме, кое что таки сообразил. Прирост строки аля redim preserve конено не сделать (если конено нет для этого соотетствующих апишек). Но вот, доступ к буферу, как массиву таки возможен, что уже конечно не мало. Осущестить сие и проверить, удалось с помощью функций уважаемого The trick-а в статье об указателях.
Издержки метода - дополнительное использвание памяти, получается если хотим сделать, указательный массив на всю строку (или ее часть), то для начала создать пустой массив нужного размера, который (изначальный буфер этого массива) в последующем будет висеть в памяти уже "мертвым грузом". Не знаю, может быть есть способ создания SafeArray с указанием уже готового буфера.. Для этого надо понимать его структуру и т.д.
Для большей униерсальности и адаптации под VBA заменил GetMem4 на CopyMemory и использовал ArrPtr(VarPtr) из библиотеки VBE7.dll
Кликните здесь для просмотра всего текста
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
Option Explicit
'Private Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
'Public Declare Function ArrPtr Lib "msvbvm60" Alias "VarPtr" (Src() As Any) As Long
Private Declare Function ArrPtr Lib "VBE7" Alias "VarPtr" (Src() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
 
Public Type PtDat
    Prv1 As Long
    Prv2 As Long
End Type
 
Private Sub Form_Load2()
    Dim pt() As Long, var() As Integer, prev As PtDat         ' Указатель, данные указателя, данные востановления
    Dim q As String, z As Integer, lpt As Long                ' Структуры, на которые мы будем ссылаться
    
    ReDim pt(0): ReDim var(3)
    var(1) = 3423
    
    q = "Привет Мир"
    
    lpt = GetSA(ArrPtr(var))
    Do
        prev = PtGet(pt, lpt)                                 ' Создаем "указатель"
     
        pt(0) = StrPtr(q) + 6                                 ' Устанавливаем указатель на q (pt = &q)
        
        Stop                                                  ' см. в Locals, там все видно
            
        PtRelease pt, prev                                    ' Возвращаем все на место
        
        If z = 0 Then z = 1 Else Exit Do                      ' цикл делает 2 итерации
        
        Mid(q, 7) = vbNullChar                                ' проеряем работу левосторонней функции Mid
        
        ReDim Preserve var(7)                                 ' проверяем работу ReDim Preserve
    Loop
End Sub
 
 
' Создать указатель. 1-й параметр указатель, 2-й значение указателя
Public Function PtGet(Pointer() As Long, ByVal VarAddr As Long) As PtDat
    Dim i As Long, c As Long
    i = GetSA(ArrPtr(Pointer)) + &HC
'    GetMem4 ByVal i, PtGet.Prv1
    CopyMemory PtGet.Prv1, ByVal i, 4    
'    GetMem4 VarAddr + &HC, ByVal i
    CopyMemory ByVal i, VarAddr + &HC, 4    
    PtGet.Prv2 = Pointer(0)
End Function
' Освободить указатель
Public Sub PtRelease(Pointer() As Long, prev As PtDat)
    Pointer(0) = prev.Prv2
'    GetMem4 prev.Prv1, ByVal GetSA(ArrPtr(Pointer)) + &HC
    CopyMemory ByVal GetSA(ArrPtr(Pointer)) + &HC, prev.Prv1, 4
End Sub
' Получить адрес SafeArray
Public Function GetSA(ByVal addr As Long) As Long
'    GetMem4 ByVal addr, GetSA
    CopyMemory GetSA, ByVal addr, 4
End Function

На отметке "Stop" в окне Locals можно видеть, что массив var указывает напрямую на часть строки переменной q. И ели поменять какое-то значение в массиве var, то изменения также будут видны в строке q. Также в тесте видна работа левостороней функции Mid, то, что она работает напрямую с буфером строки. Также видна работа команды redim preserve, то, что при увеличении массива можно по прежнему использовать тот же указатель.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
12.09.2023, 11:02
Цитата Сообщение от testuser2 Посмотреть сообщение
из библиотеки VBE7.dll
ты думаешь у всех людей есть эта библиотека или что

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
и использовал ArrPtr(VarPtr) из библиотеки VBE7.dll
сделал только хуже для людей, вот у меня например нет файла VBE7.dll прям на всём компьютере искал, а у меня на компьютере ажно 2 млн файлов, и этой библиотеки нет
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
12.09.2023, 11:11  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
ты думаешь у всех людей есть эта библиотека или что
Там же есть и другой вариант декларации. Просто что нужно надо раскомментировать, что не нужно закомментировать.
VBE7 это VBA-шная основная библиотека, если есть МСО, то она есть
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
12.09.2023, 11:15
Цитата Сообщение от testuser2 Посмотреть сообщение
МСО
ты думаешь все люди на свете знают что такое МСО?

Добавлено через 2 минуты
testuser2, кстати была же тема как использовать строку как байтовый массив, может не на этом форуме, но было же помню
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
12.09.2023, 11:17  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
ты думаешь все люди на свете знают что такое МСО?
А это пусть будет загадочка, интрига, т.ск., кто угадает, тот в дамках. )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
12.09.2023, 11:18
testuser2, в 2008 году же это ещё обсуждали: https://forum.sources.ru/index... ew=showall
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
12.09.2023, 11:20  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
кстати была же тема как использовать строку как байтовый массив, может не на этом форуме, но было же помню
Ну это и не удивительно, что у VB-зубров, уже все когда-то было и обсуждалось. А вот VBA-шном секторе может быть и в новинку, думал, в раздел VBA тему закинуть.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
12.09.2023, 11:36
Итак переписал скрипт для VB6:

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
Option Explicit
'Private Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function ArrPtr Lib "msvbvm60" Alias "VarPtr" (Src() As Any) As Long
'Private Declare Function ArrPtr Lib "VBE7" Alias "VarPtr" (Src() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
 
Private Type PtDat
    Prv1 As Long
    Prv2 As Long
End Type
 
Private Sub Form_Load()
    Dim pt() As Long, var() As Integer, prev As PtDat         ' Указатель, данные указателя, данные востановления
    Dim q As String, z As Integer, lpt As Long                ' Структуры, на которые мы будем ссылаться
    
    ReDim pt(0): ReDim var(3)
    var(1) = 3423
    
    q = "Привет Мир"
    
    lpt = GetSA(ArrPtr(var))
    Do
        prev = PtGet(pt, lpt)                                 ' Создаем "указатель"
     
        pt(0) = StrPtr(q) + 6                                 ' Устанавливаем указатель на q (pt = &q)
        
        Stop                                                  ' см. в Locals, там все видно
            
        PtRelease pt, prev                                    ' Возвращаем все на место
        
        If z = 0 Then z = 1 Else Exit Do                      ' цикл делает 2 итерации
        
        Mid(q, 7) = vbNullChar                                ' проеряем работу левосторонней функции Mid
        
        ReDim Preserve var(7)                                 ' проверяем работу ReDim Preserve
    Loop
End Sub
 
 
' Создать указатель. 1-й параметр указатель, 2-й значение указателя
Private Function PtGet(Pointer() As Long, ByVal VarAddr As Long) As PtDat
    Dim i As Long, c As Long
    i = GetSA(ArrPtr(Pointer)) + &HC
'    GetMem4 ByVal i, PtGet.Prv1
    CopyMemory PtGet.Prv1, ByVal i, 4
'    GetMem4 VarAddr + &HC, ByVal i
    CopyMemory ByVal i, VarAddr + &HC, 4
    PtGet.Prv2 = Pointer(0)
End Function
' Освободить указатель
Private Sub PtRelease(Pointer() As Long, prev As PtDat)
    Pointer(0) = prev.Prv2
'    GetMem4 prev.Prv1, ByVal GetSA(ArrPtr(Pointer)) + &HC
    CopyMemory ByVal GetSA(ArrPtr(Pointer)) + &HC, prev.Prv1, 4
End Sub
' Получить адрес SafeArray
Private Function GetSA(ByVal addr As Long) As Long
'    GetMem4 ByVal addr, GetSA
    CopyMemory GetSA, ByVal addr, 4
End Function
Добавлено через 46 секунд
Но по факту я так вообще и не понял, что делает этот скрипт????
Добавляет один пробел во фразе "Привет мир"?

Добавлено через 3 минуты
Вот кстати фокус "строка как байтовый массив" пусть и на нашем форуме будет:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
Private Declare Function ArrPtr Lib "msvbvm60" Alias "VarPtr" (ByRef pArr() As Any) As Long
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal pSrc As Long, ByVal pDst As Long)
 
Private Sub Form_Load()
    Dim bArr(0 To 23) As Byte
    Dim strFoo As String
    Dim pSA As Long
    strFoo = "some text"
    
    GetMem4 ArrPtr(bArr), VarPtr(pSA)
    
    Dim pStr As Long
    pStr = StrPtr(strFoo)
    
    GetMem4 VarPtr(pStr), (pSA + 12)
    
    bArr(2) = Asc("n")
    
    MsgBox strFoo
End Sub
1
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
12.09.2023, 11:48  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вот кстати фокус
Код выполняется, но прога вылетает по окончанию, нету возврата указателей на место как у Трика.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
12.09.2023, 11:53
Цитата Сообщение от testuser2 Посмотреть сообщение
но прога вылетает по окончанию
у меня ничего не вылетает в VB6

Добавлено через 15 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
нету возврата указателей на место как у Трика
А можно пример трика?

Добавлено через 1 минуту
testuser2, ты там почитай тему форума на исходниках кстати, я же ссылку тебе скинул, там есть и возвраты указателей
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
12.09.2023, 12:21  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
почитай тему форума на исходниках
Да там возможно как раз описан метод без создания дополнительного массива. Можно со строками работать, так как описано у Hacker-а. Но главная суть, в том, что создавая указатель на байтовый массив, можно работать непосредственно с ним, гораздо быстрее, без дополнительных копирований и выделений памяти. Допустим, возьмем функцию left, она возвращает нам нужное количество символов слева, но для этого она выделяет память, копирует в нее эти символы и уже потом отдает их нам, наверное же так это работает? А при прямом доступе к буферу мы можем напрямую взять нужные символы и сравнить их с чем-то или использовать RtlCompareMemory. Или, допустим, надо поменять регистр, UCase() вернет нам новую пересозданную строку, а используя байтовый массив мы можем поменять регист "на месте" изменив коды нужных символов
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
12.09.2023, 12:38
Работать с символами внутри строки можно через mid$, типа mid$(str, 2,5) = "abcde"
2
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
12.09.2023, 12:53
Цитата Сообщение от testuser2 Посмотреть сообщение
а используя байтовый массив мы можем поменять регист "на месте" изменив коды нужных символов
Для того чтобы поменять на месте, ничего не копируя, используется функция CharLowerBuff

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
она возвращает нам нужное количество символов слева, но для этого она выделяет память, копирует в нее эти символы и уже потом отдает их нам
На самом деле это очень быстрая операция так как символов слева обычно берётся немного

Добавлено через 2 минуты
The trick, помнишь у стандартной поставки VB6 был даже Microsoft'овский пример сравнения Mid$ и CopyMemory, в те времена раньше CopyMemory был быстрее на старых медленных компьютерах, теперь наоборот Mid$ быстрее стал

Добавлено через 4 минуты
The trick, о кстати спасибо за код, я не знал что Mid можно так использовать в обратную сторону я думал только для получения подстроки для сравнений и всё

в общем я затестил:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
 
Private Sub Form_Load()
    Dim str As String
    
    str = "1234567890"
    
    Mid$(str, 2, 5) = "abcde"
    
    MsgBox str
End Sub
Добавлено через 1 минуту
Кстати знак доллара играет важную роль, при очень больших объёмах, может выиграть пол секунды времени даже, я помню тестировал раньше
1
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
12.09.2023, 16:03  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
о кстати спасибо за код, я не знал что Mid можно так использовать в обратную сторону
Это спасибо ZVI у которого я увидел на форуме planetaexcel, самый первый пример в начале )

Добавлено через 8 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
Но по факту я так вообще и не понял, что делает этот скрипт????
Добавляет один пробел во фразе "Привет мир"?
Пробел не простой, там пробел (asc 32) заменяется на vbnullchar (asc 0). А дальше, там можно на отметке stop в ручную изменять значения элементов массива в панели immediate и наблюдать, что происходит со строкой (q)

Добавлено через 5 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
А можно пример трика?
В моем примере и используются его функции, там в структуру PtDat сохраняются старые указатели (почему-то их 2, х.з.) после эти указатели пишутся обратно откуда они взяты.

Добавлено через 1 час 34 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
Издержки метода - дополнительное использвание памяти, получается если хотим сделать, указательный массив на всю строку (или ее часть), то для начала создать пустой массив нужного размера, который (изначальный буфер этого массива) в последующем будет висеть в памяти уже "мертвым грузом".
Издержку можно легко избежать, как оказалось. Массива (var) в начале можно создать маленьким, а уже после установки указателя на буфер строки его размер можно увеличить, прописыванием в структуру SafeArray размера массива (помогла тема, скинутая Владом). Т.е. размер массива можно легко регулировать (в пределах размера строки конечно) простым прописыванием этого параметра. Ест-но перед возвратом указателей следует вернуть прежний размер массива, но этот момент можно прописать в непосредственно в процедуру PtRelease.
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
Private Sub Form_Load2()
    Dim pt() As Long, var() As Integer, prev As PtDat         ' Указатель, данные указателя, данные востановления
    Dim q As String, z As Integer, lpt As Long, l2 As Long    ' Структуры, на которые мы будем ссылаться
    
    ReDim pt(0): ReDim var(0)
    
    q = "Привет Мир"
    
    lpt = GetSA(ArrPtr(var))
    Do
        prev = PtGet(pt, lpt)                                 ' Создаем "указатель"
     
        pt(0) = StrPtr(q) + 6                                 ' Устанавливаем указатель на q (pt = &q)
        
        CopyMemory ByVal lpt + 16, 7&, 4                      ' Устанавливаем нужный размер массива (7)
        
        Stop                                                  ' см. в Locals, там все видно
            
        CopyMemory ByVal lpt + 16, 1&, 4                      ' Возвращаем начальный размер массива (1)
        
        PtRelease pt, prev                                    ' Возвращаем все на место
        
        If z = 0 Then z = 1 Else Exit Do
        
        Mid(q, 7) = vbNullChar                                ' проеряем работу левосторонней функции Mid     
 
    Loop
End Sub
Добавлено через 6 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
у меня ничего не вылетает в VB6
Эксель валится с тем вариантом

Добавлено через 19 минут
The trick, не подскажешь, можно ли также манипулировать строками (bstr), как safearray, т.е. менять указатель на данные и прописывать размер этих данных? Размер я вроде знаю, он указывается перед буфером. Можно ли строковой переменной подменить буфер на другой?

Добавлено через 53 минуты
А все понял. Строковая переменная фактически хранит указатель на буфер. И если этот указатель переписать, то наверное можно "подменить" буфер у строковой переменной. В переменной l оказывается то же, что в выдаче StrPtr(sarr(0))
Visual Basic
1
2
3
4
5
6
7
8
Sub sfasas()
    Dim sarr$(0), ls&, l&
    sarr(0) = "ddfdd"
    ls = VarPtr(sarr(0))
    
    CopyMemory l, ByVal ls, 4
    
End Sub
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
12.09.2023, 16:11
testuser2, ну я думаю, ты уже узнал всё, что хотел)))

Добавлено через 11 секунд
узнал много нового так точно)

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

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
Private Sub Form_Load2()
И почему у тебя "Form_Load2", а не "Form_Load" как надо!?
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
12.09.2023, 16:33  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
но наоборот у меня не получалось сделать
потому, что ты наверное делаешь простое присвоение строковой переменной, которое автоматически перезаписывается и меняет буфер, а надо изменять строку с помощью левого Mid, тогда будет работать в обратную сторону.

Добавлено через 2 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
И почему у тебя "Form_Load2"
Для меня это не критично, поскольку я не использовал форму, название перекочевало от Трика. В VB на сколько знаю, тоже можно запускать процедуры без формы в Immediate пишешь имя процедуры Enter

Добавлено через 12 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
узнал много нового так точно)
Да пожалуй)
Цитата Сообщение от testuser2 Посмотреть сообщение
И если этот указатель переписать, то наверное можно "подменить" буфер у строковой переменной.
Действительно это работает. См. Locals
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub sfasas()
    Dim sarr$(0), sarr2$(0), ls&, oldPtr&
    sarr(0) = "ddfdd"
    oldPtr = StrPtr(sarr(0))                 'запоминаем свой указатель строки
    sarr2(0) = "ggddUYH"
    ls = VarPtr(sarr(0))
    Stop
    CopyMemory ByVal ls, StrPtr(sarr2(0)), 4 'устанавливаем указатель на новый буфер
    Stop
    Mid(sarr(0), 4) = "150"                  'смотрим в Locals (строка автоматически меняется в обоих массивах)
    Stop
    CopyMemory ByVal ls, oldPtr, 4           'возвращаем свой указатель
    Stop
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2023, 16:33
Помогаю со студенческими работами здесь

конкатенация строк в excel через vba
Здравствуйте, столкнулся с проблемой. у меня есть 5 файлов excel с данными и один. куда надо вывести информацию, в одних и тех же ячейках...

Конкатенация и последующее копирование уникальных строк по условию
В файле есть 2 рабочих листа. Требуется с одного листа(List1), начиная с колонки С10, конкатенировать значения ячеек по строке до тех пор,...

Добавление записей массива из одной книги на лист другой + возможная конкатенация
Уважаемые форумчане! Возник вопрос касательно познания средств VBA в Excel'e. Идея такая: есть пользовательская форма, которую нужно...

Из символов одного текста с помощью стоковых функций о операция конкатенация получить другой текст
Из символов одного текста с помощью стоковых функций о операция конкатенация получить другой текст. Из "алгоритм " получить...

Конкатенация
Ребята как быть раньше было так : <img class="frame" src="<?php echo...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru