Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24

Совмещение переменных разного типа

02.11.2020, 21:49. Показов 3843. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Бинарный файл board.tjb содержит данные (блоки) разного типа (int long sring …)
Всё содержимое бинарного файла я считываю в массив типа Byte
Для поиска строк в блоке текста я использую ф-ю InStr, но для этого приходится сначала «перегнать» блок в строковую переменную.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim i As Integer, l As Long, str As String * 100
 
l = FileLen(«board.tjb»)
ReDim b(l) As Byte
 
get #1,,b
 
str = ""
For i = 101 To 200
     str = str & Chr(b(i))
Next i
 
i= InStr(str, "Component")
А нельзя ли как-то совместить некую строковую переменную с элементами с 101 по 200 массива b , чтобы избежать копирования блока в переменную (некий аналог ссылок из С++) ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2020, 21:49
Ответы с готовыми решениями:

Нарисовать несколько окон разного цвета и разного размера в разных местах
Нарисовать несколько окон разного цвета и разного размера в разных местах.

Сравнение переменных разного типа
Не задача, просто любопытно, почему именно так? static void Main(string args) { int i = 1; decimal j = 1; var...

Присвоение переменных разного типа
Использую я значит вот такую строку, пытаясь получить возвращаемые данные char и ulong. ULONG ModuleAddress, char ModuleName =...

22
dive
 Аватар для I can
4961 / 4661 / 845
Регистрация: 13.04.2015
Сообщений: 9,865
02.11.2020, 22:10
Цитата Сообщение от dima-pol Посмотреть сообщение
Бинарный файл
Есть пример файла?

Добавлено через 13 минут
Можно сделать, и очень просто, но нужен файл.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
02.11.2020, 22:17
dima-pol, лучше и намного оптимальнее сделать через API функцию StrStrA.
0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
02.11.2020, 22:19  [ТС]
ок, завтра принесу файл
0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
03.11.2020, 20:25  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Можно сделать, и очень просто, но нужен файл.
файл G327.TJB создан утилитой CLink (ПО установки внутрисхемного контроля). Формат закрыт, но эмпирически я вычислил где и как представлена нужная мне информация. В файле описаны все цепи и пины (контактные площадки) тестируемой платы. Для каждого пина цепи есть некий блок данных где может появится строка «Component» за которой указано имя компонента (он то мне и нужен), которй мешает щупам установки опуститься на этот пин. Например:
- описание цепи «$1N309» с адреса (hex) 175D по 1986
- описание последнего пина «STP3» в этой цепи с 18BE по 1982
- блок поиска «Component» с 193D по 197D, в котором мы обнаруживаем «FU1», причем дважды, т.е. компонент FU1 мешает 2м щупам (из 4х) опуститься на STP3.

- а вот в описании всех предыдущих цепей, начиная с «$1N1939» ( с адреса 723) не встречается «Component» - т.е. ничего не мешает щупам опуститься на все их пины
Вложения
Тип файла: zip G327.ZIP (3.1 Кб, 19 просмотров)
0
dive
 Аватар для I can
4961 / 4661 / 845
Регистрация: 13.04.2015
Сообщений: 9,865
03.11.2020, 20:49
dima-pol, а это уже другой вопрос. Есть спецификация структуры данных формата tjb ?
0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
03.11.2020, 22:02  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Есть спецификация структуры данных формата tjb ?
Нет, это внутренний формат фирмы Digitaltest, она его не раскрывает

Добавлено через 3 минуты
Цитата Сообщение от The trick Посмотреть сообщение
лучше и намного оптимальнее сделать через API функцию StrStrA.
Не могу сообразить, как использовать эту функцию в Visual Basic 6.0. Не дадите примерчик?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
03.11.2020, 23:28
Лучший ответ Сообщение было отмечено dima-pol как решение

Решение

Цитата Сообщение от dima-pol Посмотреть сообщение
Не могу сообразить, как использовать эту функцию в Visual Basic 6.0. Не дадите примерчик?
Ну как-то так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Declare Function StrStrA Lib "shlwapi" ( _
                         ByRef pszFirst As Any, _
                         ByRef pszSrch As Any) As Long
 
Private Sub Form_Load()
    Dim b()     As Byte
    Dim lPos    As Long
    
    ' // Исходная строка в ANSI как в файле
    b = StrConv("test string 1234 hello", vbFromUnicode)
    
    ' // Если поиск многократный то искомые строки также стоит предварительно преобразовать в ANSI
    lPos = StrStrA(b(0), ByVal "ring")
    
    Debug.Print "Позиция: "; IIf(lPos, lPos - VarPtr(b(0)), "не найдено")
    
End Sub
Только учти что функция подразумевает NULL-terminated строку, поэтому чтобы ограничить область нужно временно записать 0 в массив.
Visual Basic
1
2
3
4
5
    ' // Ограничиваем поиск до 13
    b(13) = 0
    
    ' // Поиск с 4 по 12
    lPos = StrStrA(b(4), ByVal "12")
1
 Аватар для Argus19
1433 / 450 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
04.11.2020, 07:18
Цитата Сообщение от dima-pol Посмотреть сообщение
есть некий блок данных где может появится строка «Component»
Простым просмотровщиком слово Component находится 13 раз.
0
dive
 Аватар для I can
4961 / 4661 / 845
Регистрация: 13.04.2015
Сообщений: 9,865
04.11.2020, 08:07
Цитата Сообщение от Argus19 Посмотреть сообщение
Простым просмотровщиком слово Component находится 13 раз.
Да это так. Ну а дальше что? Нельзя же просто убрать Component из файла, неизвестно к чему это приведёт.

Не по теме:

Цитата Сообщение от dima-pol Посмотреть сообщение
компонент FU1
Предохранитель?

0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
04.11.2020, 10:11
PureBasic хорошо работает с таким файлом. Читает построчно, как будто это не бинарник, а текст
Вложения
Тип файла: zip Misc.zip (27.9 Кб, 2 просмотров)
2
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
04.11.2020, 10:36  [ТС]
The trick, Спасибо, это работает!

Цитата Сообщение от The trick Посмотреть сообщение
только учти что функция подразумевает NULL-terminated
Но дело в том что в массиве b в блоке поиска (от 101 до 200) строки перемежаются с данными типа integer, byte и long, т.е. перед искомой строкой там наверняка будут нули.

Может есть похожая функция, которая не "застревает" на нулях?
0
 Аватар для Argus19
1433 / 450 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
04.11.2020, 11:22
Цитата Сообщение от I can Посмотреть сообщение
Нельзя же просто убрать Component из файла
А зачем убирать? Такой задачи не ставилось.
После любого текста идут последовательности или 01 00, или 02 00, или 03 00. Т.е. текст не нультерминирован. Как я понимаю, надо найти часть двоичного файла, в котором содержится слово Component, после которого идёт двоичная информация, которую и хочет получить ТС.
0
04.11.2020, 11:33

Не по теме:

Argus19, зануда.

0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
04.11.2020, 11:48  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Нельзя же просто убрать Component из файла, неизвестно к чему это приведёт.
И не надо. tjb это test job т.е. тестовая задача для установки, где в том числе указаны какие пины недоступны для щупов и по какой причине.
Моя задача - получить из него отчет с тестом в виде "FU1 ограничивает доступ к STP3", который я отправляю трассировщикам, чтобы они подвинули STP3 (вывели из "тени" FU1).
0
dive
 Аватар для I can
4961 / 4661 / 845
Регистрация: 13.04.2015
Сообщений: 9,865
04.11.2020, 16:00
Цитата Сообщение от dima-pol Посмотреть сообщение
"FU1 ограничивает доступ к STP3"
Тогда может работать как со строкой? Например
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
Option Explicit
Private Type myType
    st As String
End Type
Private Sub Command1_Click()
    Dim i As Integer, j As Integer, st  As String
    Dim s, s1, comp As String, stp As String
    Dim mt As myType
    stp = "STP"
    comp = "Component"
    Open App.Path & "\G327.TJB" For Binary As #1
       Get #1, , mt
    Close #1
    s = Split(mt.st, stp)
    For i = 1 To UBound(s)
       If InStr(1, s(i), comp) Then
          st = st & stp & Val(s(i)) & " экранирован компонентом "
          s1 = Split(s(i), comp)
          For j = 1 To UBound(s1)
             st = st & Split(Trim$(s1(j)), Chr(2))(0) & "; "
          Next j
          st = st & vbCrLf
       End If
    Next
    MsgBox st
End Sub
Миниатюры
Совмещение переменных разного типа  
0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
04.11.2020, 19:41  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Тогда может работать как со строкой?
Нет!!!

в TJB файле много данных типа Byte Integer и Long и я их выдаю в отчет.

К тому же Вы можете убедиться что ВСЕ строки там не заканчиваются нулем, а предваряются байтом (кол-во байт в строке) который я считывю чтобы корректно считать строку.
0
 Аватар для Argus19
1433 / 450 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
04.11.2020, 19:52
Цитата Сообщение от dima-pol Посмотреть сообщение
ВСЕ строки там не заканчиваются нулем, а предваряются байтом
Вы как-то дозировано даёте информацию. Подозреваю, вы хотите самостоятельно разобраться с форматом.
Это ваше право. Однако, "при таком раскладе" количество вариантов реальной помощи "стремится к нулю".
1
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
05.11.2020, 09:21
Лучший ответ Сообщение было отмечено dima-pol как решение

Решение

Цитата Сообщение от dima-pol Посмотреть сообщение
Может есть похожая функция, которая не "застревает" на нулях?
Проще написать такую, это вообще пару пустяков:
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
Option Explicit
 
Private Sub Form_Load()
    Dim b() As Byte
    Dim s() As Byte
    Dim l As Long
    
    Open "C:\temp\G327.TJB" For Binary As #1
    ReDim b(LOF(1) - 1)
    Get #1, , b
    Close #1
    
    s = StrConv("Component", vbFromUnicode)
    l = &H193D
    
    Do
        
        l = FindSignature(b, l, &H197D - l, s)
        
        If l >= 0 Then
            
            Debug.Print l
            
            l = l + UBound(s) + 1
            
        End If
        
    Loop While l <> -1
    
    
End Sub
 
Private Function FindSignature( _
                 ByRef bData() As Byte, _
                 ByVal lStart As Long, _
                 ByVal lCount As Long, _
                 ByRef bSearch() As Byte) As Long
    Dim lN As Long, lZ As Long
    
    lN = lStart: lZ = 0
    
    If lStart + lCount > UBound(bData) Then
        lCount = UBound(bData) + 1 - lStart
    End If
    
    If lCount > UBound(bSearch) Then
 
        Do While lN < lStart + lCount
            If bData(lN) = bSearch(lZ) Then
                lZ = lZ + 1
                If lZ > UBound(bSearch) Then
                    FindSignature = lN - UBound(bSearch)
                    Exit Function
                End If
            Else
                If lZ Then
                    lN = lN - lZ + 1
                    lZ = 0
                End If
            End If
            lN = lN + 1
        Loop
    
    End If
    
    FindSignature = -1
    
End Function
0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
05.11.2020, 18:05  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Проще написать такую,
На FindSignature VB6 выдает Compile error: Sub или Function нe oпpeдeлeны
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.11.2020, 18:05
Помогаю со студенческими работами здесь

Определения знака переменных разного типа
Используя перегрузку функций, написать программу определения знака переменных разного типа.

Ввод и вывод переменных разного типа
Вот что у меня получилось: Program blabla; var lambda,pi,fi:real; y:integer; f,x:char; begin writeln('vvedite lambda, pi, fi,...

Создание массива массивов разного типа переменных
Здравствуйте! Я новичок в скриптинге (C#), по этому возможно спрошу глупость, так как гугл не дал мне ответа. Задача: создать массив...

Вычисление произведения двух переменных разного типа
Используя перегрузку функций, написать программу вычисления произведения двух переменных разного типа (int, long, float, double).

Возвращение в одном методе переменных разного типа
Доброго времени суток! Можно ли каким-либо образом вернуть из одного метода значения переменных с разными типами данных? Если нет,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru