Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
jkrnd
94 / 53 / 11
Регистрация: 22.12.2015
Сообщений: 1,502
#1

Как обратиться к неиндексированной переменной используя цикл?

15.10.2017, 20:13. Просмотров 848. Ответов 23
Метки t4 (Все метки)

Всем здравствуйте.
Есть 5 вешественных переменных, одинаково начинающихся и заканчивающихся цифрами 0,1,2,3,4:
vb.net
1
2
3
4
5
        Dim value0 As Single
        Dim value1 As Single
        Dim value2 As Single
        Dim value3 As Single
        Dim value4 As Single
Нужно обработать их значения в For Next цикле.
Вариант объявления
vb.net
1
Dim value(5) as Single
это, конечно, оптимальный вариант, но в моём конкретном случае не годится.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2017, 20:13
Ответы с готовыми решениями:

Как обратиться к переменной в цикле?
вот код: If Drinks.n1 > i1 Then Drinks.n1 = Drinks.n1 - 3 If Drinks.n2 > i1...

WPF, обратиться к переменной другой формы
С начало запускается окно (MainWindow) которое скачивает строчку с сайта, и...

Используя один цикл, найти сумму ряда
Дано целое число N (> 0). Используя один цикл, найти сумму 1 + 1/(1!) +...

Используя DrawLines и цикл прорисовать линии по массиву координат
прогоняю только по счётчику i потому что если ещё использую счётчик j то...

Изменить значение переменной в Родительском классе используя Потомственной класс
Всем привет. Я столкнулся с проблемой при выполнении одного задания. Хочу...

23
jkrnd
94 / 53 / 11
Регистрация: 22.12.2015
Сообщений: 1,502
16.10.2017, 21:33  [ТС] #21
OwenGlendower, огромнейшее спасибо!

Добавлено через 3 минуты
OwenGlendower, перепутал флажок "Разрешить отладку неуправляемого кода" с флажком "разрешить небезопасный код"

Добавлено через 17 минут
OwenGlendower,
помогите прокомментировать строку:
C#
1
fixed (void* ptr = buf){}
инструкцию
C#
1
AData* dataPtr = (AData*)ptr;
я понял так: в указатель dataPtr помещается адрес на который указывает указатель ptr. Правильно?
0
Sklifosofsky
757 / 693 / 172
Регистрация: 29.09.2015
Сообщений: 838
16.10.2017, 21:39 #22
vb.net
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
Imports System.Runtime.InteropServices
Public Class Form1
    <StructLayout(LayoutKind.Sequential)> _
    Structure StructValue
        Public value0 As Single
        Public value1 As Single
        Public value2 As Single
        Public value3 As Single
        Public value4 As Single
    End Structure
 
    Dim el(100000) As StructValue
    Dim valResult(100000) As Single
    Dim rsa As New RefStructArr(Of StructValue, Single)(el) 'инициализация спец класса
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        Dim sw As New System.Diagnostics.Stopwatch()
        sw.Start()
 
        'заполнение массива структур для демонстрации работы процедуры Procedure
        For i = 0 To rsa.Count - 1
            rsa(i, 0) = 10.34F
            rsa(i, 1) = 11.34F
            rsa(i, 2) = 12.34F
            rsa(i, 3) = 13.34F
            rsa(i, 4) = 14.34F
        Next
 
        ' вызовы процедуры Procedure и проверка результата её работы:
        Procedure(el, 0)
        Label1.Text = valResult(100000 - 1).ToString
        Procedure(el, 1)
        Label2.Text = valResult(100000 - 1).ToString
        Procedure(el, 2)
        Label3.Text = valResult(100000 - 1).ToString
        Procedure(el, 3)
        Label4.Text = valResult(100000 - 1).ToString
        Procedure(el, 4)
        Label5.Text = valResult(100000 - 1).ToString
 
        sw.Stop()
        Debug.Print(sw.ElapsedMilliseconds)
    End Sub
    Private Sub Procedure(ByRef elem() As StructValue, ByVal n As Integer)
        For i = 0 To rsa.Count - 1
            valResult(i) = rsa(i, n)
        Next
    End Sub
End Class
 
Public Class RefStructArr(Of TStruc, TElem)
    Private _gch As GCHandle
    Private _ptr As IntPtr
    Private _sizeElem As Integer
    Private _sizeStruct As Integer
    Private _arr() As TStruc
 
    Sub New(Arr() As TStruc)
        _arr = Arr
        _gch = GCHandle.Alloc(Arr, GCHandleType.Pinned)
        _ptr = _gch.AddrOfPinnedObject()
 
        _sizeElem = Marshal.SizeOf(GetType(TElem))
        _sizeStruct = Marshal.SizeOf(GetType(TStruc))
 
        If _sizeStruct Mod _sizeElem <> 0 Then
            Throw New ArgumentException()
        End If
    End Sub
 
    Default Public Property Item(Index As Integer, ElementIndex As Integer) As TElem
        Get
            Return CType(Marshal.PtrToStructure(_ptr + Index * _sizeStruct + ElementIndex * _sizeElem, GetType(TElem)), TElem)
        End Get
        Set(value As TElem)
            Marshal.StructureToPtr(value, _ptr + Index * _sizeStruct + ElementIndex * _sizeElem, False)
        End Set
    End Property
 
    Public ReadOnly Property ElementCount As Integer
        Get
            Return _sizeStruct \ _sizeElem
        End Get
    End Property
 
    Public ReadOnly Property Count As Integer
        Get
            Return _arr.Length
        End Get
    End Property
 
    Public Sub Free()
        _gch.Free()
        _arr = Nothing
        _sizeElem = 0
        _sizeStruct = 0
    End Sub
 
End Class
Производительность не внушает, но опять зависит от спроса
1
OwenGlendower
Супер-модератор
Эксперт .NET
8869 / 7871 / 3359
Регистрация: 17.03.2014
Сообщений: 15,522
Записей в блоге: 1
16.10.2017, 21:41 #23
Цитата Сообщение от jkrnd Посмотреть сообщение
помогите прокомментировать строку:
C#
1
fixed (void* ptr = buf){}
Фиксируем переменную buf в памяти (чтобы сборщик мусора не двигал область памяти во время дефрагментации кучи) и записываем в переменную ptr адрес первого элемента массива.

Цитата Сообщение от jkrnd Посмотреть сообщение
инструкцию
C#
1
AData* dataPtr = (AData*)ptr;
Меняем тип указателя с void* на AData*. Оба указателя указывают на одну и ту же область памяти, но dataPtr имеет конкретный тип и это позволяет применять к нему адресную арифметику. Например, dataPtr++; сдвинет значение указателя dataPtr на количество байтов равное размеру типа AData. Добавление числа - dataPtr += N; - означает движение вперед на N структур AData.
1
Замабувараев
319 / 328 / 91
Регистрация: 18.12.2014
Сообщений: 677
Записей в блоге: 1
19.10.2017, 03:12 #24
Вариант.

vb.net
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
Imports System.IO
Imports System.Runtime.InteropServices
 
Module Module1
 
    Structure MyData
        Dim Value0 As Single
        Dim Value1 As Single
        Dim Value2 As Single
        Dim Value3 As Single
        Dim Value4 As Single
    End Structure
 
    Sub Main()
        Dim t As MyData
        With t
            .Value0 = 2.0
            .Value2 = 5.1
            .Value4 = 4.0
        End With
 
        ' Структуру в массив
        Dim bytes() As Single = GetSingleBytes(t)
 
        ' Распечатать
        For i As Integer = 0 To bytes.Length - 1
            Console.WriteLine("Value{0} содержит {1}", i, bytes(i))
        Next
    End Sub
 
    Function GetSingleBytes(data As Object) As Single()
        Const SingleVariableLength As Integer = 4
 
        Dim buffer As Single() = New Single(Marshal.SizeOf(data) \ SingleVariableLength - 1) {}
 
        Dim pMem As IntPtr = Marshal.AllocHGlobal(buffer.Length * SingleVariableLength)
 
        Marshal.StructureToPtr(data, pMem, False)
        Marshal.Copy(pMem, buffer, 0, buffer.Length)
 
        Marshal.FreeHGlobal(pMem)
 
        Return buffer
    End Function
 
End Module
1
19.10.2017, 03:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2017, 03:12

Как обратиться к переменной, если после функции тебе дали строку, с именем переменной
Допустим есть Function Generation():String; там генерируется строка, с именем...

В переменной типа string хранится имя переменной, к которой нужно обратиться. Как это сделать?
Пример: int speed = 10; string s = &quot;speed&quot;; MessageBox.Show(/*как-то...

Как подставляя значение переменной к неполному имени переменной обратиться "куда надо"?
Салют, нужно в циклах обращаться к разным переменным ($b1-$b5), но так ручками...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru