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

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

18.04.2023, 02:34. Показов 7246. Ответов 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
16.09.2023, 16:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
Первый раз слышу, я думал бывает только 64 бит)))
Ну в пользовательском режиме доступны адреса от 0 до 0x7fffffffffffffff. Верхний диапазон - это ядро.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
16.09.2023, 17:06  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Сделать Long массив размером от 0 до 536870912 и адресовать всю память.
Ну вот адресовал я всю память, доступную программе (2 гб. что-то там вроде), а что дальше с этим делть, как я пойму что где и зачем. Т.е. я правильно понимаю, что это вся память и строки, которые пишутся фиг пойми куда будут где-то там? Где-то в начале наверное будет блок с переменными?

Добавлено через 5 минут
Цитата Сообщение от The trick Посмотреть сообщение
В SAFEARRAYBOUND количество элементов тип ULONG, т.е. больше 4 байт туда нельзя записать.
SAFEARRAYBOUND это же вроде массив, и если задать многомерный массив, я правильно понимаю, что можно бОльшее количество адресов покрыть?
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
16.09.2023, 17:16
Цитата Сообщение от testuser2 Посмотреть сообщение
Ну вот адресовал я всю память, доступную программе (2 гб. что-то там вроде), а что дальше с этим делть, как я пойму что где и зачем.
Я не знаю что именно требуется. Я показал что этим способом можно адресовать всю память. По сути сделав массив типа Byte мы получаем доступ к элементам по адресам, т.е. получаем прямые указатели. К примеру если есть переменная Q As Byte и наш массив W() As Byte, то можно будет прочитать Q через W как W(VarPtr(Q)). С Long это просто будет быстрее, но адрес нужно делить на 4, в остальном все тоже самое.

Цитата Сообщение от testuser2 Посмотреть сообщение
SAFEARRAYBOUND это же вроде массив, и если задать многомерный массив, я правильно понимаю, что можно бОльшее количество адресов покрыть?
Это зависит от того как в 64 битном вба организована адресация. Если там не будет переполнения при вычислении - результат кастуется к 64 битному то все норм, а если нет то не получится.
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
16.09.2023, 17:47  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
К примеру если есть переменная Q As Byte и наш массив W() As Byte, то можно будет прочитать Q через W как W(VarPtr(Q)). С Long это просто будет быстрее, но адрес нужно делить на 4, в остальном все тоже самое.
Понял, Тема! Еще вопросик на засыпку, нубский, правильно я понимаю, что где бы не писались данные их адрес будет всегда кратен 4, т.е. адрессное пространств как бы ровно поделено на участки 4 байт?
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
16.09.2023, 18:18
Цитата Сообщение от testuser2 Посмотреть сообщение
Еще вопросик на засыпку, нубский, правильно я понимаю, что где бы не писались данные их адрес будет всегда кратен 4
Это зависит от переменной и от разрядности. Байтовые переменные хранятся без выравнивания, Integer по 2 и т.д.
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
16.09.2023, 18:44  [ТС]
Странное дело...
Visual Basic
1
2
3
4
5
6
7
8
Sub sfsf()
    Dim i&
    Dim s As String * 5
    s = "abcdi"
    For i = 1 To 10
        Debug.Print StrPtr(s)
    Next
End Sub
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
16.09.2023, 18:49
Цитата Сообщение от testuser2 Посмотреть сообщение
Странное дело...
Полностью согласен, сам в шоке)

Добавлено через 37 секунд
Почему постоянно меняется адрес этой строки, прям через раз
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
16.09.2023, 18:57
Цитата Сообщение от testuser2 Посмотреть сообщение
Странное дело...
Потому что фиксированные строки - это особые сущности (не BSTR). При передаче куда-нибудь подобной строки создается временная BSTR строка. Если строка была передана по ссылке, то при выходе из функции из временной BSTR строки копируется содержимое в фиксированную строку.
2
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
16.09.2023, 19:02
Цитата Сообщение от The trick Посмотреть сообщение
фиксированные строки - это особые сущности
кстати уже давно заметил, что это строки со странностями и не всегда подходят для работы с API бывали случаи у меня что приходилось отказываться от фиксированных этих строк в пользу обычной инициализации обычной строки через str = Space$(256)
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
17.09.2023, 16:08  [ТС]
Еще одно интересное наблюденице случилось. При выполнении незамысловатого пошагово, после 5 строки в переменную s3 снчала попадает имя модуля и после 6й имя процедуры. Вообще если остановиться на 6й строке и в immediate допустим вывести strptr(s3) или вообще что-то выполнить, строка s3 меняется при любом действии, и в нее циклически может попасть то название модуля, то надпис "VBAProject".. Понятно дело, что это сбой, но интересно, главным образом, что высвечивается имя модуля и процедуры, и в связи с этим вопрос, можно ли как-то "законным" методом получить указатели на эти строки. К слову бывали даже вопросы на данную тему.
Visual Basic
1
2
3
4
5
6
7
Sub sffffff2()
    Dim s2$, s3$, l2&, i%, addr&
    s3 = "oipiop"
    CopyMemory ByVal VarPtr(s2), ByVal VarPtr(s3), 4
    s2 = vbNullString
    CopyMemory ByVal VarPtr(s2), 0&, 4
End Sub
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
17.09.2023, 18:35
HackerVlad, фиксированные строки лучше вообще не использовать.
Цитата Сообщение от testuser2 Посмотреть сообщение
Понятно дело, что это сбой, но интересно, главным образом, что высвечивается имя модуля и процедуры, и в связи с этим вопрос, можно ли как-то "законным" методом получить указатели на эти строки.
Это мусор. Выполняя s2 = vbNullString ты освобождаешь строку s3, но сам указатель s3 не обнуляется и ссылается на старую память, а там может быть что угодно.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
17.09.2023, 18:46
Цитата Сообщение от The trick Посмотреть сообщение
Это мусор.
Да я тоже так и думал что это мусор, часто с ним сталкиваюсь)))

Добавлено через 26 секунд
The trick, да я фиксированные строки тоже не люблю

Добавлено через 9 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
Понятно дело, что это сбой
Это не сбой никакой
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
18.09.2023, 02:46  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Это не сбой никакой
Это сбой, Экселька валится после таких манипуляций.
Вот более законная смена указателя. Ни чего не слетает, не вылетает, и ни чего не надо возвращать на место.
Visual Basic
1
2
3
4
5
6
Sub sffffff2(Optional s1$, Optional ByVal stumb&)
    Dim s2$
    s2 = "oipiop"
    CopyMemory ByVal VarPtr(stumb) - 4, VarPtr(s3), 4
    s1 = vbNullString
End Sub
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 07:32  [ТС]
Глянул, в общем ,работа HeapAlloc/HeapReAlloc, похожа на Redim Preserve, каждый раз нулевой указатель меняется при расширении и при сжатии места. Возможно redim на ней и соновывается, а vb-шный redim preserve в частности на этой прекрасной функции
Цитата Сообщение от HackerVlad Посмотреть сообщение
Private Declare Function SafeArrayRedim Lib "oleaut32" (ByVal saPtr As Long, saBound As Long) As Long
В общем Redim Preserve не плохой вариант для регулировки размера буфера, если не заморачиваться с Api, темболее у меня HeapFree вообще вызывает вылет.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
22.09.2023, 10:34
Цитата Сообщение от testuser2 Посмотреть сообщение
В общем Redim Preserve не плохой вариант для регулировки размера буфера
ты читал мою жаркую дискуссию с The Trick в моей теме? Оказалось, что Redim Preserve это медленный вариант который заполняет массив нулями.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 11:41  [ТС]
HackerVlad, только сейчас заметил, а почему не использовал простой Redim?

Добавлено через 6 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
Redim Preserve это медленный вариант который заполняет массив нулями.
Созданная строка также заполняется нулями. Я конечно ноль в этом, интерено просто, при самой записи разве не происходит зануление, затирание старых данных то беж, или затирание и зануление не одно и то же?
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
22.09.2023, 12:40
Цитата Сообщение от HackerVlad Посмотреть сообщение
ты читал мою жаркую дискуссию с The Trick в моей теме? Оказалось, что Redim Preserve это медленный вариант который заполняет массив нулями.
Нет. ReDim Preserve может быть даже быстрее обычного ReDim.

Цитата Сообщение от testuser2 Посмотреть сообщение
каждый раз нулевой указатель меняется при расширении и при сжатии места.
Нет. Все зависит от свободных блоков. Блок может просто расширится как при HeapReAlloc так и при Redim/Redim Preserve. Смотри ссылку что я кинул.
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 13:36  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
темболее у меня HeapFree вообще вызывает вылет.
Без HeapFree вылет не происходит. Понял, это так, что vba/vb, сам освобождает, все что выделено (также как со SysAllocStringLen), а HeapFree делает не нужную (лишнюю) работу./наверное/
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
22.09.2023, 13:38
Цитата Сообщение от testuser2 Посмотреть сообщение
HeapFree
Не пойму каким боком тут HeapFree?
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
22.09.2023, 13:46  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Не пойму каким боком тут HeapFree?
У Dragocas-а в StringBuilder-е перед терминацией класса выполняется HeapFree. Я использовал этот класс для проверки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2023, 13:46

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
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