Enum, определяющий выбор параметра

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Enum, определяющий выбор параметра

Сообщение MIT » 13.02.2009 (Пт) 21:14

Если задачу упростить до самого минимума, то в качестве "дано" есть:
Код: Выделить всё
        Public Enum SomeCEnum
            first = 1
            second = 2
            third = 3
            fourth = 4
        End Enum
        Public Structure SomeStructure
            Dim param1 As Integer
            Dim param2 As Integer
            Dim param3 As Integer
            Dim param4 As Integer
            Dim UParan As Integer
        End Structure
        Public Function GetParam(ByVal ss As SomeStructure, ByVal sce As SomeCEnum) As Integer

        End Function

Задача функции GetParam в следующем: она должна посмотреть на пришедший параметр sce и по нему вернуть paramX (например - пришло third, вернули param3). Прибегать к использованию конструкции Select Case не хотелось бы. Также возможна вариация задачи - вместо SomeCEnum может использоваться цифра.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Enum, определяющий выбор параметра

Сообщение Debugger » 13.02.2009 (Пт) 21:32

А объявить параметры типа как массив? Если не хочешь терять имена - можно создать еще один тип (с массивом), а потом CopyMemory'кать в него из первого типа.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Enum, определяющий выбор параметра

Сообщение MIT » 13.02.2009 (Пт) 21:57

Debugger писал(а):А объявить параметры типа как массив?
Нет, массив тут не сделать. Как я сказал пример очень упрощенный, на самом деле структура довольно сложная, и имеет примерно такой вид (наверно так сильно упрощать не стоило... :cyclops: ):
Код: Выделить всё
    <StructLayout(LayoutKind.Explicit, Size:=8)> _
    Structure SomeStructure
        <FieldOffset(0)> Dim UParam As Integer
        <FieldOffset(0)> Dim param1 As Short
        <FieldOffset(2)> Dim param2 As Short
        <FieldOffset(4)> Dim HParam As Integer
        <FieldOffset(4)> Dim param3 As Short
        <FieldOffset(6)> Dim param4 As Short
    End Structure

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

Конечно, можно использовать какую-нибудь такую функцию: GetShortData(ByVal ss as SomeStructure,ByVal Offset as byte) as short, но я не знаю, есть ли что-то подобное в функционале дотнета.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Enum, определяющий выбор параметра

Сообщение MIT » 13.02.2009 (Пт) 22:06

Блин, Маршалинг рулит неимоверно!
Код: Выделить всё
System.Runtime.InteropServices.Marshal.ReadInt16

:cyclops:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Enum, определяющий выбор параметра

Сообщение Nord777 » 13.02.2009 (Пт) 22:40

Блин, Маршалинг рулит неимоверно!
Не думаю что это самый быстрый способ.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Enum, определяющий выбор параметра

Сообщение MIT » 13.02.2009 (Пт) 22:46

Nord777 писал(а):Не думаю что это самый быстрый способ.
А какой же самый быстрый?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Enum, определяющий выбор параметра

Сообщение Nord777 » 13.02.2009 (Пт) 23:21

Насчет самого быстрого не знаю, но только что сделал в 90 раз быстрее.
Я думаю это сильный аргумент, для того чтобы ты задумался о своем выборе.
А выглядит он примерно так:
Код: Выделить всё
   Dim i16 As ULong
   If sce <> 0 Then
      i16 = (ss.All >> (sce << 4))
   End If
   i16 = i16 And &HFFFF
   Return CType(i16, Integer)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Enum, определяющий выбор параметра

Сообщение MIT » 14.02.2009 (Сб) 0:07

Это типа как-то так:
Код: Выделить всё
    <StructLayout(LayoutKind.Explicit, Size:=8)> _
    Structure SomeStructure
        <FieldOffset(0)> Dim All As Long
        <FieldOffset(0)> Dim UParam As Integer
        <FieldOffset(0)> Dim param1 As Short
        <FieldOffset(2)> Dim param2 As Short
        <FieldOffset(4)> Dim HParam As Integer
        <FieldOffset(4)> Dim param3 As Short
        <FieldOffset(6)> Dim param4 As Short
    End Structure
    Public Enum SomeCEnum
        first = 1
        second = 2
        third = 3
        fourth = 4
    End Enum
    Public Function GetParam(ByVal ss As SomeStructure, ByVal sce As SomeCEnum) As Integer
        Dim i16 As ULong
        If sce <> 0 Then
            i16 = (ss.All >> (sce << 4))
        End If
        i16 = i16 And &HFFFF
        Return CType(i16, Integer)
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim s As SomeStructure
        s.UParam = 1345135656
        s.HParam = 607560474

        Dim str As String = "Norm" & vbCrLf & s.param1 & "; " & s.param2 & "; " & s.param3 & "; " & s.param4 & vbCrLf & "Result" & vbCrLf

        For i As Integer = 1 To 4
            str &= GetParam(s, i) & "; "
        Next
        MsgBox(str)
        End
    End Sub
:?:
Но то ли я просто хочу спать, то ли работает оно как-то неверно...

добавлено:
Наверно ты имел в виду что-то типа
Return CType((ss.All >> ((sce - 1) << 4)) And &HFFFF, Integer)
Хотя и тут какая-то ошипка есть

еще добавлено:
Return CType((ss.All >> ((sce - 1) << 4)) And &HFFFF, Short)

еще чуть-чуть добавлено: + Remove integer overflow checks
Последний раз редактировалось MIT 14.02.2009 (Сб) 0:14, всего редактировалось 1 раз.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Enum, определяющий выбор параметра

Сообщение Nord777 » 14.02.2009 (Сб) 0:13

Почти угадал:
Код: Выделить всё
   Public Enum SomeCEnum As Integer
      first = 0
      second = 1
      third = 2
      fourth = 3
   End Enum

Код: Выделить всё
<FieldOffset(0)> Dim All As ULong
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Enum, определяющий выбор параметра

Сообщение MIT » 14.02.2009 (Сб) 0:18

Nord777 писал(а):
Код: Выделить всё
<FieldOffset(0)> Dim All As ULong
А какая разница, если мы число-то и не используем?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Enum, определяющий выбор параметра

Сообщение Nord777 » 14.02.2009 (Сб) 0:25

Код: Выделить всё
   Public Enum SomeCEnum As Integer
      first = 0
      second = 1
      third = 2
      fourth = 3
   End Enum

   <StructLayout(LayoutKind.Explicit, Size:=8)> _
    Structure SomeStructure
      <FieldOffset(0)> Dim All As ULong
      <FieldOffset(0)> Dim UParam As UInteger
      <FieldOffset(0)> Dim param1 As UShort
      <FieldOffset(2)> Dim param2 As UShort
      <FieldOffset(4)> Dim HParam As UInteger
      <FieldOffset(4)> Dim param3 As UShort
      <FieldOffset(6)> Dim param4 As UShort
   End Structure

   Const Count As Integer = 1000000

   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      Dim out As UShort
      Dim Struct As New SomeStructure With {.param1 = &HAAAA, .param2 = &HBBBB, .param3 = &HCCCC, .param4 = &HDDDD}

      Dim Sw As Stopwatch = Stopwatch.StartNew
      For i As Integer = 0 To Count
         out = GetParam(Struct, SomeCEnum.third)
      Next
      Sw.Stop()
      MsgBox(Sw.ElapsedMilliseconds)
   End Sub

   Public Function GetParam(ByVal ss As SomeStructure, ByVal sce As Integer) As UShort
      Dim i16 As ULong
      If sce <> 0 Then
         i16 = (ss.All >> (sce << 4))
      End If
      Return CUShort(i16 And &HFFFF)
   End Function


Добавлено:
А какая разница, если мы число-то и не используем?
Ты наверно имел ввиду знак?
Если параметр ALL обьявить как Long, то на этой строке будет исключение:
i16 = (ss.All >> (sce << 4))
Впрочем, если тело функции будет содержать только одну строку
Return CUShort((ss.All >> (sce << 4)) And &HFFFF)
то можно оставить Long, исключения не будет.
Нет, вру, исключение всё же будет при SomeCEnum.first
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Enum, определяющий выбор параметра

Сообщение MIT » 16.02.2009 (Пн) 16:40

Nord777 писал(а):Ты наверно имел ввиду знак?
Ну, как бы, да :)

Nord777 писал(а):Нет, вру, исключение всё же будет при SomeCEnum.first
Хде?
Код: Выделить всё
  <StructLayout(LayoutKind.Explicit, Size:=8)> _
    Structure SomeStructure
        <FieldOffset(0)> Dim All As Long
        <FieldOffset(0)> Dim UParam As Integer
        <FieldOffset(0)> Dim param1 As Short
        <FieldOffset(2)> Dim param2 As Short
        <FieldOffset(4)> Dim HParam As Integer
        <FieldOffset(4)> Dim param3 As Short
        <FieldOffset(6)> Dim param4 As Short
    End Structure
    Public Enum SomeCEnum As Integer
        first = 1
        second = 2
        third = 3
        fourth = 4
    End Enum
    Public Function GetParam(ByVal ss As SomeStructure, ByVal sce As SomeCEnum) As Short
        Return CType((ss.All >> ((sce - 1) << 4)) And &HFFFF, Short)
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim s As New SomeStructure With {.param1 = &HAAAA, .param2 = &HBBBB, .param3 = &HCCCC, .param4 = &HDDDD}
       
        Dim str As String = s.param1 & "; " & s.param2 & "; " & s.param3 & "; " & s.param4 & vbCrLf & "Result" & vbCrLf
        For i As Integer = 1 To 4
            str &= GetParam(s, i) & "; "
        Next
        MsgBox(str)
        End
    End Sub
Ммм... Может дело в
Я там ^ писал(а):еще чуть-чуть добавлено: + Remove integer overflow checks
:?:

P.S.:
Про
Nord777 писал(а):As New SomeStructure With
не знал. Прикольно :cyclops:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Enum, определяющий выбор параметра

Сообщение Nord777 » 16.02.2009 (Пн) 18:07

Ммм... Может дело в
еще чуть-чуть добавлено: + Remove integer overflow checks
Ты отключил проверку? Надеюсь ты понимаешь, что отключил "доброго избавителя" от глюков? :D
Я не спорю, так оно конечно проще...
А не пробовал разобраться, почему происходит переполнение?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Enum, определяющий выбор параметра

Сообщение MIT » 16.02.2009 (Пн) 18:41

Nord777 писал(а):А не пробовал разобраться, почему происходит переполнение?
Ну, я впринципе понимаю почему так происходит (в 2х-байтовый Short "засовывается" 4х байтовый Integer, что может вызвать ошибку), но в чем тут разбираться?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Enum, определяющий выбор параметра

Сообщение Nord777 » 16.02.2009 (Пн) 18:59

Ну, я впринципе понимаю почему так происходит (в 2х-байтовый Short "засовывается" 4х байтовый Integer, что может вызвать ошибку),
Ты ошибаешься.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Enum, определяющий выбор параметра

Сообщение MIT » 16.02.2009 (Пн) 19:07

Поправь
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Enum, определяющий выбор параметра

Сообщение Nord777 » 16.02.2009 (Пн) 19:11

А ты разбей одно строку на несколько. Чтобы в каждой строке было по одному оператору.
И увидишь где происходит ошибка.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 94

    TopList