Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / не могу сравнить две переменные / 15 сообщений из 15, страница 1 из 1
01.11.2010, 00:41
    #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
01.11.2010, 00:48
    #36930266
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не могу сравнить две переменные
немножко поспешил. там есть ошибка (два раза 'as'). Цель такова: хочу сохранять в файл (открытым как Random) настройки которые пользователь может по своему желанию менять в процесе. Если изменения были значит записать иначе пропустить
...
Рейтинг: 0 / 0
01.11.2010, 00:56
    #36930277
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не могу сравнить две переменные
сверять почленно
по другому вряд ли возможно в VB
...
Рейтинг: 0 / 0
01.11.2010, 00:59
    #36930280
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не могу сравнить две переменные
Андрей159, первый раз такое вижу в коде: Stop
Это в ВБА???
...
Рейтинг: 0 / 0
01.11.2010, 15:36
    #36931426
Эникейщик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не могу сравнить две переменные
Если идея была перекинуть данные из одной переменной в другую, при их изменении, то не проще сразу перекинуть не спрашивая ничего, одной строкой?
Код: plaintext
LSet PB_Frm2Nstr = PB_Frm2NstrTmp
...
Рейтинг: 0 / 0
01.11.2010, 15:47
    #36931472
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не могу сравнить две переменные
Типы простые, можно преобразовать значения в строку и сравнивать строки.
...
Рейтинг: 0 / 0
01.11.2010, 16:51
    #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
01.11.2010, 17:30
    #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
02.11.2010, 02:13
    #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
02.11.2010, 02:26
    #36932592
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не могу сравнить две переменные
Ципихович ЭндрюАндрей159, первый раз такое вижу в коде: Stop
Это в ВБА???
Обычно я пользуюсь "финиш точками", но stop мне также нравится. Именно с той причины я потянулся за Бейсиком чем за Паскалем (Делфи), не знаю как в Си. Не представляю на сколько б больше времья пошло если б не было остановки и не было возможности опросить переменные. Это большой "+".
...
Рейтинг: 0 / 0
02.11.2010, 07:24
    #36932666
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не могу сравнить две переменные
Андрей159Гугл меня не спас, когда я загорелся желанием узнать побольше об этой функции, а F1 в бейсике даже не понмает функцию VarPtr, так что это второе открытие. CompareMemory это псевдоним RtlCompareMemory, а уж о ней-то гугл знает. А VarPtr не документирована. Она возвращает адрес ячейки памяти, с которой начинается занимаемая переменной область.

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

Код: plaintext
n = Len(PB_Frm2Nstr)

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

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

То есть добавить количество завершающих нулей в 4-х строковых переменных...
...
Рейтинг: 0 / 0
02.11.2010, 08:54
    #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
02.11.2010, 09:11
    #36932751
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не могу сравнить две переменные
Вообще - я выше немного наврал. В общем, сейчас сам совсем запутался - такое впечатление что размер переменной user-типа надо определять пользуясь тем примером что я прикладывал и уже потом вписывать в код ручками...
...
Рейтинг: 0 / 0
02.11.2010, 10:38
    #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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / не могу сравнить две переменные / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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