powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / не могу сравнить две переменные
15 сообщений из 15, страница 1 из 1
не могу сравнить две переменные
    #36930264
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Type TP1
  Mem1 as As Integer
  Mem2 as As Integer
  Mem3 as As Integer
End Type

Public Type TP2
  El1 as As Boolean
  El2 as As Boolean
End Type

Public Type Nastroyka
  Korekciya As TP1
  Poshuk As TP2
End Type

Public PB_Frm2Nstr As Nastroyka
Public PB_Frm2NstrTmp As Nastroyka

В условии ошибка "несответствие типов"
Код: plaintext
If PB_Frm2Nstr = PB_Frm2NstrTmp Then Stop
А как тогда сравнить ?
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36930266
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немножко поспешил. там есть ошибка (два раза 'as'). Цель такова: хочу сохранять в файл (открытым как Random) настройки которые пользователь может по своему желанию менять в процесе. Если изменения были значит записать иначе пропустить
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36930277
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сверять почленно
по другому вряд ли возможно в VB
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36930280
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159, первый раз такое вижу в коде: Stop
Это в ВБА???
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36931426
Фотография Эникейщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если идея была перекинуть данные из одной переменной в другую, при их изменении, то не проще сразу перекинуть не спрашивая ничего, одной строкой?
Код: plaintext
LSet PB_Frm2Nstr = PB_Frm2NstrTmp
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36931472
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типы простые, можно преобразовать значения в строку и сравнивать строки.
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36931737
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А хотя есть способ попроще и гораздо быстрее.
Код: plaintext
1.
2.
Private Declare Function EqualMemory Lib "ntdll" Alias "RtlCompareMemory" (Destination As Any, Source As Any, ByVal Length As Long) As Long 

If EqualMemory(VarPtr(PB_Frm2Nstr), VarPtr(PB_Frm2NstrTmp), Len(PB_Frm2Nstr)) then
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36931890
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For Antonariy

В данном, конкретном случае автора топика так будет работать.

А вообще надо учитывать что все переменные в типе должны быть жестко определены, а не храниться ссылками.

То есть если, к примеру, будет объявление:

Код: plaintext
1.
2.
3.
4.
5.
Public Type TP1
  Mem1 As Integer
  Mem2 As Integer
  Mem3 As Integer
  mem4 As String *  5 
End Type

то все будет нормально.

А вот если

Код: plaintext
1.
2.
3.
4.
5.
Public Type TP1
  Mem1 As Integer
  Mem2 As Integer
  Mem3 As Integer
  mem4 As String
End Type

То вместо строки в переменной хранится ссылка на нее и сравнение по ее содержимому будет выдавать неверный результат.
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36932586
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот мой реальный код. Я сразу его не подал, поскольку я по украински там подписываю (паралельно веду документацию), мне кажется что не всегда удобно так подавать код на форум, да и + в коде мусора было много. Так наверное боле-менее понятно.
Функиця LoadNastroyki срабатывает при загрузке формы а SaveNastroyki при выгрузке.
Код: plaintext
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.
Public Type Korekciya
  Left As Long
  LeftBl As Boolean
  Poshuk1 As String *  20 
  Poshuk1Bl As Boolean
  Poshuk2 As String *  20 
  Poshuk2Bl As Boolean
  Zamina1 As String *  20 
  Zamina2 As String *  20 
  PershaLiteraVelika As Boolean
  AvtomKoreguvatiVse As Boolean
End Type

Public Type DlaPoshukuArt 
  MojlivoArtCePapka As Boolean 
  MinatiMiscamiPrizvImya As Boolean 
  DeleteLishniZnaki As Boolean 
  KilkaArtistiv As Boolean 
  YakshoArtistaNeZnaydeno As Boolean 
  PoshukSkorocheno As Boolean
  PoshukPoPrizv As Boolean 
  NavchitiYakshoNeznaydeno As Boolean
  BilsheOdnogoVariantuVibir As Boolean 
End Type

Public Type Nastroyka
  Korekciya As Korekciya
  Poshuk As DlaPoshukuArt
End Type

Public PB_Frm2Nstr As Nastroyka

Public Declare Function EqualMemory Lib "ntdll" Alias "RtlCompareMemory" (Destination As Any, Source As Any, ByVal Length As Long) As Long

'################################
'##     Загальні настройки     ##
'################################

'Сохранить настройки
Public Function SaveNastroyki() As Boolean
 Dim TmpBD As Nastroyka, n As Long
   n = Len(PB_Frm2Nstr)
   Open PapkiPathMax + "\Настройки.txt" For Random As # 5  Len = n
    Get # 5 ,  1 , TmpBD
      If EqualMemory(PB_Frm2Nstr, TmpBD, n) <> n Then
        Put # 5 ,  1 , PB_Frm2Nstr: SaveNastroyki = True
      End If
   Close # 5 
End Function

'Загрузить настройки
Public Function LoadNastroyki() As Boolean
   Open PapkiPathMax + "\Настройки.txt" For Random As # 5  Len = Len(PB_Frm2Nstr)
    Get # 5 ,  1 , PB_Frm2Nstr
   Close # 5 
End Function

Что случилось с функцией LSet я так и не понял. Сначало все работало потом выдавало ошибку о не совместимости переменных (хоть я ничего не делал, просто хотел проверить разницу между SET, LSET и RSET, вернул на LSET и заглючило), думал глюк, искал, придирался так и не получил результата даже после перезагрузки компа.

У меня почти назрел вариант копирования переменных с помощью ф-ции CopyMemory, но вариант который предложил Antonariy оказывается самый лучший. Гугл меня не спас, когда я загорелся желанием узнать побольше об этой функции, а F1 в бейсике даже не понмает функцию VarPtr, так что это второе открытие. И поскольку сам вариант был не робочим, я понял (по скольку ф-ция EqualMemory похожа к CopyMemory) что VarPtr можно убрать. И тогда все заработало.

Всем большое спасибо за совет.
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36932592
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович ЭндрюАндрей159, первый раз такое вижу в коде: Stop
Это в ВБА???
Обычно я пользуюсь "финиш точками", но stop мне также нравится. Именно с той причины я потянулся за Бейсиком чем за Паскалем (Делфи), не знаю как в Си. Не представляю на сколько б больше времья пошло если б не было остановки и не было возможности опросить переменные. Это большой "+".
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36932666
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159Гугл меня не спас, когда я загорелся желанием узнать побольше об этой функции, а F1 в бейсике даже не понмает функцию VarPtr, так что это второе открытие. CompareMemory это псевдоним RtlCompareMemory, а уж о ней-то гугл знает. А VarPtr не документирована. Она возвращает адрес ячейки памяти, с которой начинается занимаемая переменной область.

Андрей159И поскольку сам вариант был не робочим, я понял (по скольку ф-ция EqualMemory похожа к CopyMemory) что VarPtr можно убрать. И тогда все заработало.Перемудрил слегка, да. С другой стороны, благодаря этому приятно видеть, что автор не просто копипастит, но еще думает, что делает, и сравнивает с тем, что уже знает. ))
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36932722
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь вот есть ошибка:

Код: plaintext
n = Len(PB_Frm2Nstr)

Все дело в том что Len() или LenB() не выдадут правильно размер user-переменной если в них есть строки. В вашем случае надо написать:

Код: plaintext
n = Len(PB_Frm2Nstr) +  4 

То есть добавить количество завершающих нулей в 4-х строковых переменных...
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36932732
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут немножко кода, чтобы понять то что я написал чуть выше:

Код: plaintext
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.
Option Explicit

Public Type TP1
    Mem1 As Integer
    Mem2 As Integer
    Mem3 As Integer
    mem4 As String *  3 
End Type

Public Type TP2
    El1 As Boolean
    El2 As Boolean
End Type

Public Type Nastroyka
  Korekciya As TP1
  Poshuk As TP2
End Type

Public PB_Frm2Nstr As Nastroyka
Public PB_Frm2NstrTmp As Nastroyka

Private Declare Function memcmp Lib "ntdll" Alias "RtlCompareMemory" (a As Any, b As Any, ByVal Length As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Sub Main()
    Dim m1() As Byte, m( 2 ) As Byte

    Debug.Print VarPtr(PB_Frm2Nstr)
    Debug.Print VarPtr(PB_Frm2NstrTmp)

    PB_Frm2Nstr.Korekciya.Mem2 =  2 
    PB_Frm2NstrTmp.Korekciya.Mem2 =  2 
    PB_Frm2Nstr.Korekciya.Mem3 =  7 
    PB_Frm2NstrTmp.Korekciya.Mem3 =  7 

    PB_Frm2Nstr.Korekciya.mem4 = "АБВ"
'    PB_Frm2NstrTmp.Korekciya.mem4 = "124"

    PB_Frm2Nstr.Poshuk.El2 = True
    PB_Frm2NstrTmp.Poshuk.El1 = True

    Debug.Print CompNastroyka(PB_Frm2Nstr, PB_Frm2NstrTmp)
End Sub

Public Function CompNastroyka(a As Nastroyka, b As Nastroyka) As Boolean
    Dim ma() As Byte, mb() As Byte, i As Long, ka As Long, kb As Long

    Debug.Print Len(a), LenB(a)
    Debug.Print Len(b), LenB(b)

    ka = Len(a) +  1  ' Добавляется кол-во строк в user-переменной
    kb = Len(b) +  1  ' Добавляется кол-во строк в user-переменной
    
    If ka = kb Then
        ReDim ma(ka -  1 )
        CopyMemory ma( 0 ), a, ka
        ReDim mb(kb -  1 )
        CopyMemory mb( 0 ), b, kb
        
        Debug.Print "----------"
        For i =  0  To UBound(ma)
            Debug.Print i +  1 , ma(i), mb(i)
        Next i
        Debug.Print "----------"
        
        Debug.Print memcmp(a, b, ka)
        CompNastroyka = (memcmp(a, b, ka) = ka)
    End If
End Function
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36932751
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще - я выше немного наврал. В общем, сейчас сам совсем запутался - такое впечатление что размер переменной user-типа надо определять пользуясь тем примером что я прикладывал и уже потом вписывать в код ручками...
...
Рейтинг: 0 / 0
не могу сравнить две переменные
    #36932984
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приложенном файлике - распределение памяти для данной переменной:

Код: plaintext
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.
Public Type Korekciya
  Left As Long
  LeftBl As Boolean
  Poshuk1 As String *  20 
  Poshuk1Bl As Boolean
  Poshuk2 As String *  20 
  Poshuk2Bl As Boolean
  Zamina1 As String *  20 
  Zamina2 As String *  20 
  PershaLiteraVelika As Boolean
  AvtomKoreguvatiVse As Boolean
End Type

Public Type DlaPoshukuArt 
  MojlivoArtCePapka As Boolean 
  MinatiMiscamiPrizvImya As Boolean 
  DeleteLishniZnaki As Boolean 
  KilkaArtistiv As Boolean 
  YakshoArtistaNeZnaydeno As Boolean 
  PoshukSkorocheno As Boolean
  PoshukPoPrizv As Boolean 
  NavchitiYakshoNeznaydeno As Boolean
  BilsheOdnogoVariantuVibir As Boolean 
End Type

Public Type Nastroyka
  Korekciya As Korekciya
  Poshuk As DlaPoshukuArt
End Type

Public PB_Frm2Nstr As Nastroyka
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / не могу сравнить две переменные
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]