Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/27: Рейтинг темы: голосов - 27, средняя оценка - 4.63
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

Как грамотно соединить структуру с массивом?

14.05.2020, 22:07. Показов 5877. Ответов 75
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте!

Дано:
1. структура UDT
2. массив

Требуется соединить их вместе в одном массиве (типа Byte) так, чтобы новый массив начинался с членов данной структуры и продолжался/завершался членами данного массива. Для примера выбраны очень простенькие/маленькие структура и массив, но на самом деле они могут быть очень большими. И ещё условие задачи такое - циклами пользоваться нельзя, а то эдак я и сам могу тренькать, как сказал бы классик

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
Option Explicit
 
Private Type MyUDT
  A As Integer
  B As Long
End Type
 
 
Private Sub Command1_Click()
  Dim udt_MyUDT As MyUDT
  Dim arr_Byte_array(1 To 3)  As Byte
  Dim arr_Total_array()  As Byte
 
 udt_MyUDT.A = 1
 udt_MyUDT.B = 2
 
  arr_Byte_array(1) = 3
  arr_Byte_array(2) = 4
  arr_Byte_array(3) = 5
 
 arr_Total_array() = ' ??????????????????????????????????????????????????????????
 
End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2020, 22:07
Ответы с готовыми решениями:

как грамотно соединить в локальную сеть 5 ПК и 3 пятиэтажных дома
День добрый, подскажите как грамотно соединить в локальную сеть 5 ПК и 3 пятиэтажных дома , меня интересует оборудование, где поставить...

Как грамотно электрически и безопасно соединить ПК и ТВ кабелем HDMI-HDMI?
Здравствуйте! Компьютер питается из незаземлённой двухпроводной линии (розетки), видеокарта имеет выход HDMI. TV SMART питается из...

Стек соединить с массивом
Доброе время суток. Добрался я да коллекций. И ту мне попалась задачка из книжки "JAVA Методы программирование": создать в стеке...

75
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
17.05.2020, 17:39  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от locm Посмотреть сообщение
Где Power_Basic писал что задачу нужно решить соблюдая безопасную концепцию программирования? Он спросил как можно решить не уточняя что должно быть безопасно.
Ну если меня упомянули, то ещё раз повторюсь, что мне на данный момент совершенно не важно опасно это или безопасно, но задачу требовалось решить с помощью встроенных средств Визуального Бейсика и без использования циклов. Ну вот, например, оригинальное решение с помощью копирования на диск и последующего считывания вполне удовлетворяет условиям поставленной задачи.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
17.05.2020, 17:53
Цитата Сообщение от locm Посмотреть сообщение
Как часто вам приходилось пользоваться ActiveX EXE? Что мне пока что они не попадались.
Ты думаешь что функциональность ActiveX EXE чем-то отличается от Standard EXE? Ты никогда не пользовался офисом? Офис - это ActiveX EXE сервера, к примеру Word/Excel с которыми просто работать из VB.

Цитата Сообщение от locm Посмотреть сообщение
Они скрыты и используются всегда даже когда не нужно.
Они не используются когда не нужно.

Цитата Сообщение от locm Посмотреть сообщение
Лишние вызовы функций синхронизации потоков не самым лучшим образом скажутся на производительности.
Функция потока - забрать данные, обработать их, вернуть результат - это в концепции VB6 (некоторые шаги опциональны), это 99,9% случаев использования потоков. Данные всегда разделены и никакой синхронизации вообще не требуется. Только для обслуживания вызовов между потоками.

Добавлено через 1 минуту
Цитата Сообщение от Power_Basic Посмотреть сообщение
задачу требовалось решить с помощью встроенных средств Визуального Бейсика
Это и есть "безопасно".
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
17.05.2020, 18:10  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Цитата Сообщение от locm
Где Power_Basic писал что задачу нужно решить соблюдая безопасную концепцию программирования? Он спросил как можно решить не уточняя что должно быть безопасно.
Он написал "встроенными в язык" средствами. Пример с небезопасным WINAPI ему не подошел. Небезопасный WINAPI в общем неприменим к этой задаче вообще - только встроенными средствами.
Да не потому что WINAPI это опасно или безопасно, а потому что я с ним пока ещё мало знаком, ну вот и хочется по возможности обходиться без него. Ну а если в самом языке имеются средства для решения одних и тех же задач, не прибегая к помощи WINAPI, тогда и надо решать такие задачи именно этими средствами, я так думаю. А иначе тогда языки вообще никакие не нужны, если там на каждом шагу будут сплошные обращения к WINAPI. Точнее говоря, это будет уже какой-то универсальный язык.

Добавлено через 14 минут
Цитата Сообщение от The trick Посмотреть сообщение
Потому что это частный случай более общей задачи, в оригинале у него просто пример, который он хочет расширить под WAVEFORMATEX для использования в ACM. Его интересует теория, о чем он и писал:
Цитата Сообщение от Power_Basic
Но в любом случае, ветка создана не для выяснения этого вопроса. Это пратика, а меня сейчас больше интересует теория, а именно работа с памятью, с адресами памяти, со структурами, с массивами и всё такое.
На самом деле, да, подразумевался вовсе не частный пример, а теоретические способы (в рамках Визуального Бейсика) соединения любых структур с любыми массивами. А простенький пример в топике это исключительно для упрощения моего понимая предложенных решений.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
17.05.2020, 18:13
Цитата Сообщение от Power_Basic Посмотреть сообщение
Да не потому что WINAPI это опасно или безопасно, а потому что я с ним пока ещё мало знаком, ну вот и хочется по возможности обходиться без него.
А я и не говорю что ты из-за этого не хочешь его использовать. Просто API для копирования памяти (по типу RtlMoveMemory/GetMem) небезопасны и неуниверсальны, хотя в некоторых случаях предпочтительней в силу разных причин.

Цитата Сообщение от Power_Basic Посмотреть сообщение
А иначе тогда языки вообще никакие не нужны, если там на каждом шагу будут сплошные обращения к WINAPI. Точнее говоря, это будет уже какой-то универсальный язык.
Ну тот-же SAPI или ACM - это тоже WinAPI.
0
Эксперт по электронике
6561 / 3188 / 335
Регистрация: 28.10.2011
Сообщений: 12,467
Записей в блоге: 7
17.05.2020, 18:20
Цитата Сообщение от The trick Посмотреть сообщение
Ты никогда не пользовался офисом?
Я про приложения созданные одним программистом и работающие без установки в систему.

Цитата Сообщение от The trick Посмотреть сообщение
Функция потока - забрать данные, обработать их, вернуть результат
Обычно потоки совсем по другому используются.
0
17.05.2020, 18:22  [ТС]

Не по теме:

Цитата Сообщение от locm Посмотреть сообщение
А с ACM что не так?
....Производится инициализация путем заполнения структур WAVEFORMATEX и MPEGLAYER3WAVEFORMAT которые передаются функции acmStreamOpen а после сырые данные заданного размера передаются acmStreamConvert и из нее получаем данные конвертированные в MP3.
А вот за это спасибо. Будем считать, что это дорожная карта для моей дальнейшей практики.
А то там (в семействе этих функций) всего много, хрен знает с чего начать и чем закончить.
А вы здесь объяснили оченьпросто и понятно.
На самом деле, это как раз последний этап в разработке моего Audio_book_maker'а.
И даже уже с проблемой перегрузки процессора и, как следствие, зависаний удалось справиться.

0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
17.05.2020, 18:38
Лучший ответ Сообщение было отмечено Power_Basic как решение

Решение

Цитата Сообщение от locm Посмотреть сообщение
Я про приложения созданные одним программистом и работающие без установки в систему.
Ты меня спросил - я тебе ответил. Или "ваши программы не программы"? ActiveX EXE устанавливается автоматом при первом запуске (это даже не установка, а регистрация, что другое), пользователю ничего не нужно делать для этого. Если тебя смущает регистрация, то используй ActiveX DLL, и никакой установки не нужно.

Цитата Сообщение от locm Посмотреть сообщение
Обычно потоки совсем по другому используются.
Для чего нужны потоки кроме как для обработки и обслуживания данных, расскажи пожалуйста.

Добавлено через 9 минут
Power_Basic, https://www.cyberforum.ru/post9353575.html
Это пример конверсии из MP3 в WAV, наоборот это делается немного сложнее, но ты уже видел линк на другом форуме. Нужно сначала получить поддерживаемые выходные форматы, прежде чем сжимать:
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
Option Explicit
 
Private Const ACM_METRIC_MAX_SIZE_FORMAT As Long = &H32
Private Const ACMFORMATDETAILS_FORMAT_CHARS As Long = &H80
Private Const ACM_FORMATENUMF_CONVERT As Long = &H100000
Private Const WAVE_FORMAT_MPEGLAYER3        As Long = &H55
 
Public Type WAVEFORMATEX
   wFormatTag As Integer
   nChannels As Integer
   nSamplesPerSec As Long
   nAvgBytesPerSec As Long
   nBlockAlign As Integer
   wBitsPerSample As Integer
   cbSize As Integer
End Type
 
Private Type ACMFORMATDETAILS
    cbStruct      As Long
    dwFormatIndex As Long
    dwFormatTag   As Long
    fdwSupport    As Long
    pwfx          As Long
    cbwfx         As Long
    szFormat(ACMFORMATDETAILS_FORMAT_CHARS - 1) As Integer
End Type
 
Private Type MPEGLAYER3WAVEFORMAT
    wFormatTag          As Integer
    nChannels           As Integer
    nSamplesPerSec      As Long
    nAvgBytesPerSec     As Long
    nBlockAlign         As Integer
    wBitsPerSample      As Integer
    cbSize              As Integer
    wID                 As Integer
    fdwFlags            As Long
    nBlockSize          As Integer
    nFramesPerBlock     As Integer
    nCodecDelay         As Integer
End Type
 
Public Type MP3FormatDescription
    sDisplayName    As String
    tFormat         As MPEGLAYER3WAVEFORMAT
End Type
 
Private Type FormatBuffer
    lPointer    As Long
    lBufferSize As Long
    tData()     As MP3FormatDescription
End Type
 
Private Declare Function acmMetrics Lib "msacm32" (ByVal hao As Long, ByVal uMetric As Long, ByRef pMetric As Long) As Long
Private Declare Function acmFormatEnum Lib "msacm32.dll" Alias "acmFormatEnumW" (ByVal had As Long, ByRef pafd As ACMFORMATDETAILS, _
                                                                                 ByVal fnCallback As Long, ByVal dwInstance As Long, ByVal fdwEnum As Long) As Long
 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetMem2 Lib "msvbvm60.dll" (ByRef pSrc As Any, ByRef pDst As Any) As Long
 
Public Sub Main()
    Dim tSrc    As WAVEFORMATEX
    Dim tDst()  As MP3FormatDescription
    
    tSrc.wFormatTag = 1
    tSrc.nChannels = 2
    tSrc.nSamplesPerSec = 44100
    tSrc.wBitsPerSample = 16
    tSrc.nBlockAlign = tSrc.wBitsPerSample \ 8 * tSrc.nChannels
    tSrc.nAvgBytesPerSec = tSrc.nBlockAlign * tSrc.nSamplesPerSec
    
    GetListOfAvailableFormats tSrc, tDst
    
End Sub
 
Public Function GetListOfAvailableFormats( _
                ByRef tSrcFormat As WAVEFORMATEX, _
                ByRef tFormats() As MP3FormatDescription) As Long
    Dim Fd          As ACMFORMATDETAILS
    Dim lMaxSize    As Long
    Dim bFormat()   As Byte
    Dim tBuffer     As FormatBuffer
    
    ReDim tFormats(100)
    
    If acmMetrics(0, ACM_METRIC_MAX_SIZE_FORMAT, lMaxSize) Then
        Exit Function
    End If
    
    ReDim bFormat(lMaxSize - 1)
    
    CopyMemory bFormat(0), tSrcFormat, Len(tSrcFormat)
    
    Fd.cbStruct = Len(Fd)
    Fd.cbwfx = lMaxSize
    Fd.pwfx = VarPtr(bFormat(0))
    
    If acmFormatEnum(0, Fd, AddressOf acmFormatEnumCallback, VarPtr(tBuffer), ACM_FORMATENUMF_CONVERT) Then
        Exit Function
    End If
    
    If tBuffer.lPointer Then
    
        ReDim Preserve tBuffer.tData(tBuffer.lPointer - 1)
        tFormats() = tBuffer.tData()
        
        GetListOfAvailableFormats = tBuffer.lPointer
        
    Else
        Erase tFormats()
    End If
    
End Function
 
Private Function acmFormatEnumCallback( _
                 ByVal hadid As Long, _
                 ByRef pafd As ACMFORMATDETAILS, _
                 ByRef tBuffer As FormatBuffer, _
                 ByVal fdwSupport As Long) As Long
    Dim lTag    As Long
    Dim lIndex  As Long
    
    ' // Check format tag
    GetMem2 ByVal pafd.pwfx, lTag
    
    If lTag = WAVE_FORMAT_MPEGLAYER3 Then
        
        If tBuffer.lBufferSize = 0 Then
            ReDim tBuffer.tData(100)
            tBuffer.lBufferSize = UBound(tBuffer.tData) - 1
        Else
            If tBuffer.lPointer >= tBuffer.lBufferSize Then
                ReDim Preserve tBuffer.tData(tBuffer.lPointer + 100)
                tBuffer.lBufferSize = UBound(tBuffer.tData) - 1
            End If
        End If
        
        With tBuffer.tData(tBuffer.lPointer)
        
            CopyMemory .tFormat, ByVal pafd.pwfx, Len(.tFormat)
        
            .sDisplayName = Space$(ACMFORMATDETAILS_FORMAT_CHARS)
        
            CopyMemory ByVal StrPtr(.sDisplayName), pafd.szFormat(0), ACMFORMATDETAILS_FORMAT_CHARS * 2
            
            lIndex = InStr(1, .sDisplayName, vbNullChar)
            
            If lIndex Then
                .sDisplayName = Left$(.sDisplayName, lIndex - 1)
            End If
            
        End With
        
        tBuffer.lPointer = tBuffer.lPointer + 1
        
    End If
    
    acmFormatEnumCallback = 1
    
End Function
1
Эксперт по электронике
6561 / 3188 / 335
Регистрация: 28.10.2011
Сообщений: 12,467
Записей в блоге: 7
17.05.2020, 19:10

Не по теме:

Цитата Сообщение от Power_Basic Посмотреть сообщение
А то там (в семействе этих функций) всего много, хрен знает с чего начать и чем закончить.
Последовательность такова. Заполняем структуры WAVEFORMATEX и MPEGLAYER3WAVEFORMAT, передаем их функции acmFormatSuggest (не обязательно) а после функции acmStreamOpen. Следим за тем чтобы функции возвращали MMSYSERR_NOERROR.
После вызываем acmStreamSize чтобы получить размеры буферов. Создаем буферы и помещаем указатели на них в структуру ACMSTREAMHEADER и вызываем acmStreamPrepareHeader.
А дальше вызываем acmStreamConvert передавая WAV данные и получаем MP3 данные.



Цитата Сообщение от The trick Посмотреть сообщение
Для чего нужны потоки кроме как для обработки и обслуживания данных, расскажи пожалуйста.
Не в этом контексте
Цитата Сообщение от The trick Посмотреть сообщение
Функция потока - забрать данные, обработать их, вернуть результат - это в концепции VB6 (некоторые шаги опциональны), это 99,9% случаев использования потоков. Данные всегда разделены и никакой синхронизации вообще не требуется.
Данные не всегда разделены. Допустим один поток принимает данные, а второй их обрабатывает. Нужна общая память через которую один поток передает данные во второй. Чтобы не получилось ситуации когда один поток пишет, а второй читает из памяти в итоге будет прочитаны искаженные данные, нужно гарантировано исключить в один и тот же момент доступ к памяти нескольких потоков. Используется мьютекс. А вы пишите что данные всегда разделены. Как это если обмен через общую память?

Цитата Сообщение от The trick Посмотреть сообщение
Нужно сначала получить поддерживаемые выходные форматы, прежде чем сжимать
Можно воспользоваться функцией acmFormatSuggest которая подберет формат.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
17.05.2020, 19:26
Цитата Сообщение от locm Посмотреть сообщение
Допустим один поток принимает данные, а второй их обрабатывает. Нужна общая память через которую один поток передает данные во второй. Чтобы не получилось ситуации когда один поток пишет, а второй читает из памяти в итоге будет прочитаны искаженные данные, нужно гарантировано исключить в один и тот же момент доступ к памяти нескольких потоков. Используется мьютекс. А вы пишите что данные всегда разделены. Как это если обмен через общую память?
В концепции VB6 это так не работает. Тут во-первых все происходит прозрачно, для этого используется маршалинг, т.е. программист одинаково работает с объектом, неважно где находится объект (в этом же потоке, в другом, в чужом процессе, на другом компьютере). Если нужны общие данные, то создается объект который предоставляет доступ к общим данным (олицетворяет данные), и все потоки, обращающиеся к этому объекту получат монопольный доступ.
Если общие данные не нужны, мы просто передаем данные объекту и он с ними работает, пока основной поток выполняет другие действия. Как только обработка заканчивается, поток генерирует событие, которое основной поток обрабатывает. Дочерний поток может результат своей работы передать через это событие.
Возьмем тот же пример у Power_Basic'а. Мы создаем определенное количество объектов-потоков, которые будут обрабатывать данные по-частям, каждый объект получает их как либо смещение в файле, либо как строковую переменную (это уже зависит от архитектуры), каждый объект у себя через SAPI движок преобразует текст в звуковые данные и по окончании генерирует событие (либо периодически генерирует события) которые ловит основной поток и получает сырой поток звуковых данных от дочерних объектов. Он может их как писать в файл, либо передавать другим объектам которые будут преобразовывать данные в MP3 и генерировать события точно также. Общие данные не нужны нигде.
Отмечу что это просто пример, поскольку SAPI и так умеет в асинхронном режиме работать и для преобразования данных не нужно создавать объекты потоков.

Цитата Сообщение от locm Посмотреть сообщение
Можно воспользоваться функцией acmFormatSuggest которая подберет формат.
Ну обычно программы предоставляют список форматов, чтобы пользователь смог выбрать нужный.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
17.05.2020, 23:43  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Цитата Сообщение от Power_Basic
Да понял я, понял, вы намекаете на "соседний" диалект
Нет, намекаю что не следует отказываться от решения задачи на VB если она не вписывается в концепцию безопасного программирования. Небезопасный подход требует больше ответственности, но зачастую он лучше в плане производительности и использования ресурсов компа.
Когда я открывал эту ветку, я меньше всего думал про опасное и безопасное программирование
Мне просто хотелось узнать, существует ли какой-нибудь простой способ решения этой задачи и причём настолько простой, что он даже по плечу встроенным ("из коробки") средствам визуального бейсика.

Добавлено через 26 минут
Цитата Сообщение от The trick Посмотреть сообщение
Цитата Сообщение от Power_Basic
задачу требовалось решить с помощью встроенных средств Визуального Бейсика
Это и есть "безопасно".
Честное слово, мне будет сложно привыкнуть к такой терминологии
В конечном счёте, насколько я знаю, внутренние средства любого ЯП это "обёртки" тех же самых "опасных" WINAPI-функций.

Добавлено через 10 минут
Цитата Сообщение от The trick Посмотреть сообщение
Цитата Сообщение от Power_Basic
Да не потому что WINAPI это опасно или безопасно, а потому что я с ним пока ещё мало знаком, ну вот и хочется по возможности обходиться без него.
Цитата Сообщение от Power_Basic
А иначе тогда языки вообще никакие не нужны, если там на каждом шагу будут сплошные обращения к WINAPI. Точнее говоря, это будет уже какой-то универсальный язык.
Ну тот-же SAPI или ACM - это тоже WinAPI.
Не, ну в тех случаях, когда без WinAPI уже никак не обойтись, тогда это уже совсем другой разговор. Тогда уже без вариантов.

Добавлено через 6 минут
Цитата Сообщение от The trick Посмотреть сообщение
Power_Basic, https://www.cyberforum.ru/post9353575.html
Это пример конверсии из MP3 в WAV, наоборот это делается немного сложнее, но ты уже видел линк на другом форуме. Нужно сначала получить поддерживаемые выходные форматы, прежде чем сжимать:
Спасибо! Попробую разобраться.
А то я чё-та в MSDN полез-было читать на эту тему, показалось очень сложным, ну вот и потянуло на заполнение своих "теоретических пробелов", пока практика пробуксовывает

Добавлено через 3 минуты
Цитата Сообщение от locm Посмотреть сообщение
Последовательность такова. Заполняем структуры WAVEFORMATEX и MPEGLAYER3WAVEFORMAT, передаем их функции acmFormatSuggest (не обязательно) а после функции acmStreamOpen. Следим за тем чтобы функции возвращали MMSYSERR_NOERROR.
После вызываем acmStreamSize чтобы получить размеры буферов. Создаем буферы и помещаем указатели на них в структуру ACMSTREAMHEADER и вызываем acmStreamPrepareHeader.
А дальше вызываем acmStreamConvert передавая WAV данные и получаем MP3 данные.
Спасибо!
Ну теперь-то с такими подробными дорожными картами я уже наверняка должен справиться с этой задачей!
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
19.05.2020, 17:15  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Несложный стандартный безопасный способ - это запись в файл,
Метод работает замечательно!
Теперь, как выяснилось, вообще отпала необходимость оьбъединять структуру с массивом в памяти в новом массиве

Visual Basic
1
2
3
4
5
      'Сбрасываем на диск для проверки
      OPEN "проверка.wav" FOR binary AS # int_file_number
        PuT # int_file_number, 1, udt_WAV_file_header
        PuT # int_file_number, 45, arr_Byte_array()      
      CLOSE # int_file_number
0
20.05.2020, 15:30

Не по теме:

Цитата Сообщение от The trick Посмотреть сообщение
LSet
Где расположена функция, что она делает?

0
20.05.2020, 16:15  [ТС]

Не по теме:

Цитата Сообщение от IDK Посмотреть сообщение
Где расположена функция, что она делает?
А кстати, хороший вопрос "Что делает".
Как выясняется, расположена она в библиотеке VBA. И этих функций там целое семейство: LSET, RSET, CSET.
Как я понял их "основная" работа это центрировать одну строку по другой строке (по левому краю, по центру, по правому краю). А вот зачем и когда это нужно? Для построения таблиц что ли? По правде сказать, я и сам хотел этот вопрос на форуме задать, но только не знал, где именно его можно разместить. Ну не создавать же ради этого отдельную ветку :)

Миниатюры
Как грамотно соединить структуру с массивом?   Как грамотно соединить структуру с массивом?  
0
20.05.2020, 16:18  [ТС]

Не по теме:

Вложения снова не прикрепились почему-то.

Миниатюры
Как грамотно соединить структуру с массивом?   Как грамотно соединить структуру с массивом?  
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
20.05.2020, 16:24  [ТС]
Не прикрепляются вложения, уже несколько раз пытаюсь
Миниатюры
Как грамотно соединить структуру с массивом?   Как грамотно соединить структуру с массивом?  
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.05.2020, 17:44
Цитата Сообщение от IDK Посмотреть сообщение
Где расположена функция, что она делает?
Это не функция, это оператор
1
20.05.2020, 18:14

Не по теме:

LSet - msvbvm60.dll.__vbaLsetFixstr

0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.05.2020, 18:32
IDK, она также работает как RtlMoveMemory. __vbaCopyBytes
1
22.05.2020, 02:05  [ТС]

Не по теме:

Цитата Сообщение от locm Посмотреть сообщение
Последовательность такова. Заполняем структуры WAVEFORMATEX и MPEGLAYER3WAVEFORMAT, передаем их функции acmFormatSuggest (не обязательно) а после функции acmStreamOpen. Следим за тем чтобы функции возвращали MMSYSERR_NOERROR.
После вызываем acmStreamSize чтобы получить размеры буферов. Создаем буферы и помещаем указатели на них в структуру ACMSTREAMHEADER и вызываем acmStreamPrepareHeader.
А дальше вызываем acmStreamConvert передавая WAV данные и получаем MP3 данные.
Следуя этой дорожной карте, добрался до функции acmFormatSuggest. Причём до этого заполнил обе стрктуры, исходя из рекомендаций, которые "нарыл" в интернете. В результате, мне эта функция вернула точно то, что я загружал в структуру MPEGLAYER3WAVEFORMAT:

UDT_MPEGLAYER3WAVEFORMAT.WFX.WFORMATTAG = 1 - (Hex: 00000001)
UDT_MPEGLAYER3WAVEFORMAT.WFX.NCHANNELS = 1 - (Hex: 00000001)
UDT_MPEGLAYER3WAVEFORMAT.WFX.NSAMPLESPER SEC = 22050 - (Hex: 00005622)
UDT_MPEGLAYER3WAVEFORMAT.WFX.WBITSPERSAM PLE = 8 - (Hex: 00000008)
UDT_MPEGLAYER3WAVEFORMAT.WFX.NBLOCKALIGN = 1 - (Hex: 00000001)
UDT_MPEGLAYER3WAVEFORMAT.WFX.NAVGBYTESPE RSEC = 22050 - (Hex: 00005622)
UDT_MPEGLAYER3WAVEFORMAT.WFX.CBSIZE = 12 - (Hex: 0000000C)
UDT_MPEGLAYER3WAVEFORMAT.WID = 1 - (Hex: 00000001)
UDT_MPEGLAYER3WAVEFORMAT.FDWFLAGS = 2 - (Hex: 00000002)
UDT_MPEGLAYER3WAVEFORMAT.NBLOCKSIZE = 209 - (Hex: 000000D1)
UDT_MPEGLAYER3WAVEFORMAT.NFRAMESPERBLOCK = 1 - (Hex: 00000001)
UDT_MPEGLAYER3WAVEFORMAT.NCODECDELAY = 0 - (Hex: 00000000)
Для проверки "полезности" этой функции ввёл заведомо ошибочное значение:

UDT_MPEGLAYER3WAVEFORMAT.WFX.WBITSPERSAM PLE = 1
и она мне вернула процитированные выше значения. Ну то есть функция как бы исправила мою ошибку.
Похоже, что я на правильном пути, хоть и иду очень медленно :)

Из кода The trick'а на VB совершенно не понял, как заполнять структуру MPEGLAYER3WAVEFORMAT. Там это делается как-то хитро с помощью копирования блока памяти из одного места в другое. На будущее, просьба от продвинутых домохозяек (вроде меня) писать демонстрационный код без чрезмерной виртуозности :)

0
Эксперт по электронике
6561 / 3188 / 335
Регистрация: 28.10.2011
Сообщений: 12,467
Записей в блоге: 7
22.05.2020, 12:56
Цитата Сообщение от Power_Basic Посмотреть сообщение
В результате, мне эта функция вернула точно то, что я загружал в структуру MPEGLAYER3WAVEFORMAT
Результат выполнения какой?

Цитата Сообщение от Power_Basic Посмотреть сообщение
Из кода The trick'а на VB совершенно не понял, как заполнять структуру MPEGLAYER3WAVEFORMAT.
Код на PB. Может поймете.
PureBasic
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
  wfxSrc.WAVEFORMATEX
  MP3wfxDst.MPEGLAYER3WAVEFORMAT
 
  SampleRate = 44100  ; Частота семплирования.
  BitRate    = 128000 ; Битрейт MP3.
 
  With wfxSrc
    \wFormatTag = #WAVE_FORMAT_PCM
    \nSamplesPerSec = SampleRate
    \nChannels = 2 ; Стерео.
    \wBitsPerSample = 16 ; 16-ти битный звук.
    \nBlockAlign = (\wBitsPerSample * \nChannels) / 8
    \nAvgBytesPerSec = \nSamplesPerSec * \nBlockAlign
    \cbSize = 0
  EndWith
 
  With MP3wfxDst
    \wID = #MPEGLAYER3_ID_MPEG
    \wfx\wFormatTag = #WAVE_FORMAT_MPEGLAYER3
    \wfx\nChannels = 2 ; Стерео.
    \wfx\nSamplesPerSec = SampleRate
    \wfx\wBitsPerSample = 0
    \wfx\nAvgBytesPerSec = BitRate / 8
    \wfx\cbSize = #MPEGLAYER3_WFX_EXTRA_BYTES
    \wfx\nBlockAlign = 1
  EndWith
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.05.2020, 12:56
Помогаю со студенческими работами здесь

Создать структуру для работы с массивом
пробую написать программу с использованием структуры.. Создать структуру для работы с массивом. Данные структуры: массив N(10)....

Как создать структуру-список, поля которой — ссылка на такую же структуру
Суть вопроса в том, как создать структуру-список, поля которой - ссылка на сл. элемент(такую же структуру) и ссылка на объект, относящийся...

Как создать структуру, где будут поля с указателями на эту же структуру?
#include <stdio.h> #include <stdlib.h> typedef struct DoubleQueue { queue* ar; queue* al; int data; }...

Как правильно написать функцию, которая редактирует структуру по полю Name и возвращает новую, исправленную структуру?..
Нужно отредактировать структуру по выбору пользователя. Проблема заключается в создании функции. Подскажите, а лучше покажите, как...

как грамотно форматировать?
подскажите как грамотно форматировать данный код? <div class="penci_post_content"><h3 class="penci__post-title...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru