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

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

02.11.2020, 21:49. Показов 3809. Ответов 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
sleep
 Аватар для I can
4924 / 4573 / 840
Регистрация: 13.04.2015
Сообщений: 9,722
02.11.2020, 22:10
Цитата Сообщение от dima-pol Посмотреть сообщение
Бинарный файл
Есть пример файла?

Добавлено через 13 минут
Можно сделать, и очень просто, но нужен файл.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
sleep
 Аватар для I can
4924 / 4573 / 840
Регистрация: 13.04.2015
Сообщений: 9,722
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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
04.11.2020, 07:18
Цитата Сообщение от dima-pol Посмотреть сообщение
есть некий блок данных где может появится строка «Component»
Простым просмотровщиком слово Component находится 13 раз.
0
sleep
 Аватар для I can
4924 / 4573 / 840
Регистрация: 13.04.2015
Сообщений: 9,722
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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
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
sleep
 Аватар для I can
4924 / 4573 / 840
Регистрация: 13.04.2015
Сообщений: 9,722
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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
04.11.2020, 19:52
Цитата Сообщение от dima-pol Посмотреть сообщение
ВСЕ строки там не заканчиваются нулем, а предваряются байтом
Вы как-то дозировано даёте информацию. Подозреваю, вы хотите самостоятельно разобраться с форматом.
Это ваше право. Однако, "при таком раскладе" количество вариантов реальной помощи "стремится к нулю".
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
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
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты 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 из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru