Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2

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

18.04.2023, 02:34. Показов 7252. Ответов 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
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
22.09.2023, 13:48
Студворк — интернет-сервис помощи студентам
testuser2, у BSTR свой менеджер памяти, там и кэш есть для более быстрого выделения памяти. HeapFree не будет работать.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 13:56  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
у BSTR свой менеджер памяти
Мысль такая, что кучу-то все используют как бы одну vb-шную, а vb/vba знает, что было выделено для этой кучи и освобождает, когда нужно..
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 14:44  [ТС]
Получается вообще так. Делаю HeapAlloc на размер 1048576000 и происходит такая штучка, с файлом подкачки. После завершения процедуры ФП не "отъезжает" на прежнее место, а при повторном выполнении "штучка" только удваивается. ФП освобождается только после завершени Экселя.
Миниатюры
Правильная конкатенация  
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
22.09.2023, 14:48
testuser2, так HeapFree нужно вызывать.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 14:58  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
так HeapFree нужно вызывать.
он вылет вызывает, но есть решение выполнить HeapReAlloc с размером 0

Добавлено через 1 минуту
Немного смущает отжирание ФП при "стоячей" памяти конечно, как то это не по-спортивному )
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
22.09.2023, 15:03
Цитата Сообщение от testuser2 Посмотреть сообщение
он вылет вызывает, но есть решение выполнить HeapReAlloc с размером 0
Значит что-то неправильно делаешь - показывай код.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 15:14  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Значит что-то неправильно делаешь
Еще надо учитывать, что это vba, а он более щепетильный к памяти чем vb, как я понял, допустим надо всегда указатели возвращать на место (кроме тех, которые в стеке аргументов)
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
Private Declare Function HeapAlloc Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapReAlloc Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Private Declare Function GetProcessHeap Lib "kernel32.dll" () As Long
 
Private Const HEAP_ZERO_MEMORY As Long = &H8
 
Private m_pMemoryPtr As Long
 
Sub Allocate() '(ByVal size As Long)
    Dim tmp As Long
    Dim newSize As Long
    
    ' If no memory is allocated yet, allocate some from the heap - otherwise
    ' reallocate (resize) the block that has already been allocated
    If m_pMemoryPtr = 0 Then
        size = 262144000 '524288000 '1048576000 '2097152000
        m_pMemoryPtr = HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, size)
    Else
        m_pMemoryPtr = HeapReAlloc(GetProcessHeap, 0&, ByVal m_pMemoryPtr, size)
    End If
    
End Sub
 
Private Sub Class_Terminate()
    ' If we have memory allocated, free it
    If m_pMemoryPtr <> 0 Then
        HeapFree GetProcessHeap, 0&, m_pMemoryPtr
    End If
End Sub
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
22.09.2023, 15:41
testuser2, либо декларация неверная:
Visual Basic
1
Private Declare Function HeapFree Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal lpMem As Long/LongPtr) As Long
Либо вызывать так:
Visual Basic
1
HeapFree GetProcessHeap, 0&, ByVal m_pMemoryPtr
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 16:20  [ТС]
The trick, действительно с byval работает, спасибо. Но движуха с ФП всеж как-то не очень забавная.

Добавлено через 10 минут
Что-то тупанул я, там же тип Any, указательно надо конечно передавать по значению. Интересно, что туда можно передать кроме указателя
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
22.09.2023, 17:16
testuser2, кстати форум сегодня стал выглядеть по другому, ты заметил? растянули, увеличили шрифт
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 17:23  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
кстати форум сегодня стал выглядеть по другому, ты заметил?
Пока не сделают нармальную загрузку последней страницы обсуждения, меня ни что не впечатлит
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
22.09.2023, 17:25
testuser2, а-ля двухтысячные, табличный интерфейс, плохая поддержка для мобильных
0
22.09.2023, 18:02  [ТС]

Не по теме:

HackerVlad, дело не не в этом, грузишь последнюю страницу, сначала грузится 1я, потом последняя, на телефоне особенно заметно, там пауза в секунду между 2мя загрузками

Добавлено через 32 минуты
Интерфес наоборот мне нравится, лучше бы ни чего не менял ) Тут много всяких опций на форуме, касаемо поиска и всего остального. Ну еще бы разделов насадил всяких, добавил бейсиков, freebasic допустим, пусть бы люди общались

Добавлено через 2 минуты
Форумы, на самом деле как праило ущербные, то того не хватает, то другого, этот на самом деле очень продвинутый форум, справедливости ради стоит сказать

0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
22.09.2023, 20:11
Цитата Сообщение от testuser2 Посмотреть сообщение
Что-то тупанул я, там же тип Any, указательно надо конечно передавать по значению. Интересно, что туда можно передать кроме указателя
Можно в колбеке передать и структуру.
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
23.09.2023, 13:21  [ТС]
Фактически redim preserve использует HeapRealloc, поскольку, можно с помощью HeapRealloc редимить массив (чтоб усложнить себе жизнь)), задав в параметрах указатель на данные массива, и также редимить выделеную память, залинкованным на нее массивом.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
23.09.2023, 13:33  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
После завершения процедуры ФП не "отъезжает" на прежнее место
Про ФП я ошибся, это видимо не он, просто показывает резервирование места, а ораньжевый график показывает уже задействованую память.
Миниатюры
Правильная конкатенация  
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
23.09.2023, 13:35  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Нет. Все зависит от свободных блоков. Блок может просто расширится как при HeapReAlloc так и при Redim/Redim Preserve. Смотри ссылку что я кинул.
все действительно так и есть
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
24.09.2023, 11:59
Цитата Сообщение от testuser2 Посмотреть сообщение
а мне это зачем? я не умею делать join и для простого массива даже))) ни разу небыло нужно вообще
Видишь, теперь пришлось научиться, теперь мне это понадобилось как раз)
0
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
09.04.2024, 10:30
The trick, testuser2, приветствую!
Дублирую свой вопрос: не могли бы вы продемонстрировать на примере, КАК получить массив AscW-кодов из строки или как-то иным образом работать с этими кодами, быстрее, чем aByte() = s$.
Главное — скорость получения массива или скорость получения кодов из строки, если вариант без массива.

Тесты с существующими вариантами беру на себя.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
09.04.2024, 11:17  [ТС]
Jack Famous, по ссылке, которую я тебе скидывал, Трик привел как раз такой пример. Ниже я сделал вариант под VBA. Там на строку sString мапится массив iText() типа Integer. В заголовочной структуре массива прописывается указатель строки, и в результате массив начинает "смотреть" на ту же память, что и строка и можно работать со строкой как с массивом чисел, предварительно не копируя буфер этой строки.
Цитата Сообщение от Jack Famous Посмотреть сообщение
быстрее, чем aByte() = s$.
На vba x64 не факт что будет значительно быстрее, или быстрее вообще учитывая нюансы работы API. На больших строках должно быть заметней. Но добавляется нюанс, если при в коде мапится массив на что-нибудь, нужно обязательно в конце всех действий его освобождать иначе будет сбой(падение) Excel/Word/etc.

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
Ниже я сделал вариант под VBA
В том примере ошбика, кстати, структура SAFEARRAY в x64 немного другая
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Type SAFEARRAYBOUND
    cCount              As Long
    lBound              As Long
End Type
Public Type SAFEARRAY1D
    cDims               As Integer
    fFeatures           As Integer
    cbElements          As Long
    cLocks              As Long
    #If Win64 Then
      dummyPadding      As Long
    #End If
    pvData              As LongPtr
    Bounds              As SAFEARRAYBOUND
End Type
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2024, 11:17

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
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, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru