сравнение переменных UDT

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

сравнение переменных UDT

Сообщение Space » 05.09.2008 (Пт) 1:58

А почему нельзя сравнивать элементы массива User Define Type целиком, а только по полям? :( Если значения всех полей равны - True, иначе False...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: сравнение переменных UDT

Сообщение alibek » 05.09.2008 (Пт) 8:58

Можно, вообще-то.
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: сравнение переменных UDT

Сообщение Space » 05.09.2008 (Пт) 12:05

почему тогда вылетает ошибка?
Код: Выделить всё
Dim My As struMy
Private Type struMy
    b1 As Long
    b2 As Long   
End Type

Private Sub Form_Load()
Dim a1 As struMy
If a1 = My Then
End If
End Sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: сравнение переменных UDT

Сообщение alibek » 05.09.2008 (Пт) 12:16

А ты сравнивай через RtlCompareMemory.
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: сравнение переменных UDT

Сообщение Space » 05.09.2008 (Пт) 12:46

а что ж на If не сделали, мелкософтовцы...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: сравнение переменных UDT

Сообщение ANDLL » 05.09.2008 (Пт) 12:49

alibek писал(а):А ты сравнивай через RtlCompareMemory.
Так, сравнение через RtlCompareMemory это вовсе не то же самое, что почленное сравнение
Для структур вроде struMy конечно реузльтат будет один, но для боле сложных структур(содержащих объекты там, строки, или просто невыровненную компибнацию integer'ов и long'ов) придется все равно сравнивать по одному
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: сравнение переменных UDT

Сообщение alibek » 05.09.2008 (Пт) 12:51

Для чисел вполне можно обойтись. Для строк/вариантов/объектов/массивов, понятно не подойдет.
Lasciate ogni speranza, voi ch'entrate.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: сравнение переменных UDT

Сообщение ANDLL » 05.09.2008 (Пт) 14:02

alibek писал(а):Для чисел вполне можно обойтись. Для строк/вариантов/объектов/массивов, понятно не подойдет.

Для структуры вроде
type x
a as integer
b as long
end type
уже нельзя обойтись
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: сравнение переменных UDT

Сообщение alibek » 05.09.2008 (Пт) 14:15

Разве?
Lasciate ogni speranza, voi ch'entrate.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: сравнение переменных UDT

Сообщение ANDLL » 05.09.2008 (Пт) 14:48

alibek писал(а):Разве?
Угу. Если UDT както обрабатывалась вне VB, то да(а так как в общем случае за этим легко не уследить, то лучше особо и не конкретезировать)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: сравнение переменных UDT

Сообщение alibek » 05.09.2008 (Пт) 14:52

ANDLL писал(а):Угу.

Если предполагать, что UDT может меняться где-то снаружи, то этот UDT и так будет выровненным.
Если же UDT изменяется только из VB, то RtlCompareMemory подойдет.
Lasciate ogni speranza, voi ch'entrate.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: сравнение переменных UDT

Сообщение ANDLL » 05.09.2008 (Пт) 16:42

Ты видимо меня не понял.
Я говорю о том, что в некоторых структурах(подобным той которую я привел) есть незначащие байтики, которые не учитываются при обычном сравнении и учитываются при сравнении через ComapreMemory
Более того, ничего в плане спецификации не гарантирует что неиспользуемые байты буду одинаковыми. Поэтому использовать для сравнения таких структур ComapreMemory нельзя.
А так как среднестатистический программист на VB ничего не знает про неиспользуемые байты, то совет использовать ComapreMemory можно назвать мягко говоря сомнительным для написания стабильных приложений.
Фразу
Если предполагать, что UDT может меняться где-то снаружи, то этот UDT и так будет выровненным.
я не понял. Проблемы возникают именно потому, что все UDT в VB выровнены
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: сравнение переменных UDT

Сообщение alibek » 05.09.2008 (Пт) 22:10

Да я понял, и я именно об этом.
Если UDT не выровнена, то в ней могут быть байты, содержимым которых из VB управлять невозможно. И действительно, нет спецификаций, в которых описывается, что с этими неиспользуемыми байтами происходит. Но есть здравый смысл:
1. При объявлении переменной она инициализируется нулями. Нет ни одной разумной причины, по которой инициализировались бы отдельные мемберы UDT, а не весь блок памяти, занимаемый UDT. Стало быть, неиспользуемые байты в UDT всегда будут одинаковы (нули).
2. При изменении значений мемберов UDT нет ни одной разумной причины, чтобы изменялись неиспользуемые байты. Стало быть, пока UDT используется внутри VB, неиспользуемые байты не будут изменять своих значений.
3. Неиспользуемые байты в UDT могут быть изменены снаружи. Однако когда UDT предполагается использовать снаружи, как правило следят за выравниванием. Во всяком случае в файле WIN32API.TXT большая часть UDT объявлена так, чтобы не было проблем с выравниванием.
Так что при условии, что в UDT нет строк, объектов, вариантов и т.п., RtlCompareMemory нормально будет работать.

Проблемы возникают именно потому, что все UDT в VB выровнены

Ну да. Имелось ввиду, что UDT будет объявлена таким образом, чтобы избежать проблем с выравниванием.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 70

    TopList  
cron