Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
-15 / 0 / 4
Регистрация: 27.10.2015
Сообщений: 211
1

Как правильно создать и изменить размер трёхмерного динамического массива

27.10.2015, 22:33. Показов 737. Ответов 5
Метки нет (Все метки)

массив нужeн для того чтобы сохранять в сeб вычислeния по массивам sigma1(i) sigma3(J) и парамeтр N- это номeр вычислeния, он вносится чeрeз форму для каждого порадка вычислeний. получаю ошибку по строкe ReDim Preserve D(sigma1(i))(sigma3(j))(N) (ссылка на объeкт не указываeт на экзeмпляр объeкта ).
h
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
Public Class Form5
    Public m As Integer, h As Integer
 
    Private Sub BtnOk5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOk5.Click
        Dim Alfa As Double, Betta As Double, Gamma As Double
        Dim P0 As Double, P1 As Double, E1 As Double
        Dim b0 As Double, a0 As Double, F As Double
        Dim A As Double, B As Double, R As Double
        Dim L As Double, Lb As Double
        Dim i As Integer, j As Integer
        Dim Delta As Double, T As Double
        Dim K As Integer
        Dim N As Double
        Dim cosT As Double, sinT As Double
        Dim sigma11 As Double, sigma31 As Double
        Dim sigma1(0 To 16) As Double, sigma3(0 To 16) As Double
        Dim sigma12 As Double, sigma32 As Double
        Dim dSigma1 As Double, dSigma3 As Double
        Dim D()()() As Double
        Dim answer As String, x As Integer
 
        'ReDim Preserve D()()()
        sigma11 = Form4.TxtS1.Text()
        sigma31 = Form4.TxtS2.Text()
        sigma12 = Form4.TxtS12.Text()
        sigma32 = Form4.TxtS32.Text()
 
        a0 = Form3.TxtA0.Text()
        b0 = Form3.TxtB0.Text()
        Alfa = Form3.TxtAlfa.Text()
        Gamma = Form3.TxtGamma.Text()
        Betta = Form3.TxtBetta.Text()
        P0 = Form3.TxtP0.Text()
        P1 = Form3.TxtP1.Text()
 
        E1 = Form3.TxtE1.Text()
        N = Form2.TxtN.Text()
        Delta = Form6.TxtDelta.Text()
        K = Form2.TxtK.Text()
        
        T = Form2.TxtT.Text()
        A = a0 + Alfa * (P0 + P1 * Math.Exp(-Gamma * T)) * E1
        B = b0 + Betta * (P0 + P1 * Math.Exp(-Gamma * T)) * E1
        R = (1 - Alfa) * (P0 + P1 * Math.Exp(-Gamma * T)) * E1
 
        For x = 1 To 20
            i = 0
            j = 0
             ReDim Preserve D(sigma1(i))(sigma3(j))(N)
            'm = sigma1(i)
            'h = sigma3(j)
 
            'D(x)(0)(N) = m
            'D(x)(1)(N) = h
 
 
            L = Math.Sqrt(((sigma11 - sigma12) ^ (2)) + ((sigma31 - sigma32) ^ (2)))
            cosT = (sigma11 - sigma12) / L
            sinT = (sigma31 - sigma32) / L
 
 
            Lb = L / K
 
            sigma1(i) = sigma11
            sigma3(j) = sigma31
 
            i = i + 1
            j = j + 1
1:          dSigma1 = Lb * cosT
            dSigma3 = Lb * sinT
 
            Do
                sigma1(i) = sigma1(i - 1) + dSigma1
                sigma3(j) = sigma3(j - 1) + dSigma3
                F = (((sigma1(i) - R) ^ (2)) / (A ^ (2))) + ((sigma3(j) ^ (2)) / (B ^ (2))) - 1
                i = i + 1
                j = j + 1
            Loop While (F < 0)
 
            If (Lb <= Delta) Then
                A = Math.Round(A, 2) : B = Math.Round(B, 2) : R = Math.Round(R, 2)
                LbA.Text = CDbl(A) : LblB.Text = CDbl(B) : LblR.Text = CDbl(R)
 
                
 
                For i = 0 To 16
 
                    Me.DataGridViewI.Rows.Add(sigma1(i), sigma3(j), N)
                    Me.DataGridViewI.Rows.Insert(sigma1(i), sigma3(j), N)
                    'Me.DataGridViewI.Rows(i).Cells(0).Value = sigma1(i)
 
 
                Next i
 
                'For j = 0 To 16
                '    Me.DataGridViewJ.Rows.Add(sigma3(j))
                '    Me.DataGridViewJ.Rows(j).Cells(0).Value = sigma3(j)
                'Next j
                '
 
 
 
                answer = MsgBox("Ввести другую точку?", vbYesNo + vbQuestion, "Запрос")
 
                If answer = vbYes Then
                    Form2.Show()
                    Me.Close()
                    x = x + 1
                End If
 
            Else
 
                Lb = Lb / 4
                i = i - 1
                j = j - 1
                GoTo 1
            End If
        Next x
    End Sub
    Private Sub Form5_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        LbA.Text = ""
        LblB.Text = ""
        LblR.Text = ""
        LblS.Text = ""
        LblC.Text = ""
        LblF.Text = ""
        LblX.Text = ""
        LblY.Text = ""
    End Sub
 
 
End Class
Вложения
Тип файла: txt Новый текстовый документ (2).txt (4.0 Кб, 2 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2015, 22:33
Ответы с готовыми решениями:

Как лучше изменить размер динамического массива
В Шилдте в для закрепления теория по индексаторам и свойствам рекомендуют в качестве упражения...

Как изменить размер динамического массива структур после того как был добавлен товар
Подскажите как мне изменить размер динамической массива структур после того как был добавлен товар...

Изменить размер динамического массива
Как это сделать? И пример, если можно.

Изменить размер динамического массива
Дан класс, который описывает двумерный массив class matr{ private: int **matrix; int rows,...

5
4012 / 3202 / 772
Регистрация: 02.02.2013
Сообщений: 3,073
Записей в блоге: 2
28.10.2015, 00:31 2
Есть конструкция, именуемая как массив массивов, ее объявление имеет вид
VB.NET
1
Dim D()() As Double
Сравните с вашим.
Трехмерный массив можно объявить так
VB.NET
1
Dim D(,,,) As Double
И далее можно установить его конкретные размеры
VB.NET
1
ReDim D(5, 11, 4)
Использование модификатора Preserve имеет ограничения: с его помощью можно изменить только размер последней размерности массива. Например, для последнего примера, так
VB.NET
1
ReDim Preserve D(5, 11, 14)
Добавлено через 15 минут
исправьте
VB.NET
1
Dim D(,,) As Double
0
-15 / 0 / 4
Регистрация: 27.10.2015
Сообщений: 211
01.11.2015, 15:08  [ТС] 3
Спасибо.Я исправила. только прeдыдущиe вычислeния всё равно нe сохраняются. код получился таким
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
Public Class Form5
    Public m As Integer, h As Integer
    Dim D(,,) As Double
 
 
    Private Sub BtnOk5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOk5.Click
        Dim Alfa As Double, Betta As Double, Gamma As Double
        Dim P0 As Double, P1 As Double, E1 As Double
        Dim b0 As Double, a0 As Double, F As Double
        Dim A As Double, B As Double, R As Double
        Dim L As Double, Lb As Double
        Dim i As Integer, j As Integer
        Dim Delta As Double, T As Double
        Dim K As Integer
        Dim N As Double
        Dim cosT As Double, sinT As Double
        Dim sigma11 As Double, sigma31 As Double
        Dim sigma1(0 To 16) As Double, sigma3(0 To 16) As Double
        Dim sigma12 As Double, sigma32 As Double
        Dim dSigma1 As Double, dSigma3 As Double
 
        Dim answer As String, x As Integer
 
        'ReDim Preserve D()()()
        sigma11 = Form4.TxtS1.Text()
        sigma31 = Form4.TxtS2.Text()
        sigma12 = Form4.TxtS12.Text()
        sigma32 = Form4.TxtS32.Text()
 
        a0 = Form3.TxtA0.Text()
        b0 = Form3.TxtB0.Text()
        Alfa = Form3.TxtAlfa.Text()
        Gamma = Form3.TxtGamma.Text()
        Betta = Form3.TxtBetta.Text()
        P0 = Form3.TxtP0.Text()
        P1 = Form3.TxtP1.Text()
 
        E1 = Form3.TxtE1.Text()
        N = Form2.TxtN.Text()
        Delta = Form6.TxtDelta.Text()
        K = Form2.TxtK.Text()
        
        T = Form2.TxtT.Text()
        A = a0 + Alfa * (P0 + P1 * Math.Exp(-Gamma * T)) * E1
        B = b0 + Betta * (P0 + P1 * Math.Exp(-Gamma * T)) * E1
        R = (1 - Alfa) * (P0 + P1 * Math.Exp(-Gamma * T)) * E1
 
 
 
        x = 1
        i = 0
        j = 0
        ReDim Preserve D(20, 20, 20)
 
 
 
        L = Math.Sqrt(((sigma11 - sigma12) ^ (2)) + ((sigma31 - sigma32) ^ (2)))
        cosT = (sigma11 - sigma12) / L
        sinT = (sigma31 - sigma32) / L
 
 
        Lb = L / K
 
        sigma1(i) = sigma11
        sigma3(j) = sigma31
 
        i = i + 1
        j = j + 1
1:      dSigma1 = Lb * cosT
        dSigma3 = Lb * sinT
 
        Do
            sigma1(i) = sigma1(i - 1) + dSigma1
            sigma3(j) = sigma3(j - 1) + dSigma3
            F = (((sigma1(i) - R) ^ (2)) / (A ^ (2))) + ((sigma3(j) ^ (2)) / (B ^ (2))) - 1
            i = i + 1
            j = j + 1
        Loop While (F < 0)
 
        If (Lb <= Delta) Then
            A = Math.Round(A, 2) : B = Math.Round(B, 2) : R = Math.Round(R, 2) : sigma1(i) = Math.Round(sigma1(i), 2) : sigma3(j) = Math.Round(sigma3(j), 2)
            LbA.Text = CDbl(A) : LblB.Text = CDbl(B) : LblR.Text = CDbl(R)
 
            m = sigma1(i)
            h = sigma3(j)
            'D(N, x, 0) = m
            'D(N, 0, x) = h
 
            For i = 0 To 16
 
                For j = 0 To 16
 
                    Me.DataGridViewJ.ColumnCount = 3
 
                    Me.DataGridViewJ.Rows.Add()
 
                    Me.DataGridViewJ.Rows(i).Cells(0).Value = N
                    Me.DataGridViewJ.Rows(i).Cells(1).Value = sigma1(i)
                    Me.DataGridViewJ.Rows(j).Cells(2).Value = sigma3(j)
 
                Next j
 
            Next i
 
 
 
 
 
        Else
 
            Lb = Lb / 4
            i = i - 1
            j = j - 1
            GoTo 1
 
        End If
 
 
      
 
        D(N, x, 0) = m
        D(N, 0, x) = h
 
 
        answer = MsgBox("Ввести другую точку?", vbYesNo + vbQuestion, "Запрос")
        If answer = vbYes Then
            'Form2.Show()
            Me.Close()
            Form3.Close()
            Form4.Close()
            Form6.Close()
            x = x + 1
        End If
 
    End Sub
0
4012 / 3202 / 772
Регистрация: 02.02.2013
Сообщений: 3,073
Записей в блоге: 2
01.11.2015, 18:08 4
Мне трудно понять что здесь и зачем, для начала замените ReDim Preserve D(20, 20, 20) на ReDim D(20, 20, 20).
0
-15 / 0 / 4
Регистрация: 27.10.2015
Сообщений: 211
01.11.2015, 18:49  [ТС] 5
задача состоит в том, чтобы можно было нeсколько раз вычислять значeния массивов sigma1 , sigma3 и N- номeр вычислeния. и всe вычислeния должны сохраняться чтобы затeм вывeсти всe рeзультаты в таблицe и графикe для дальнeйшeго анализа
0
4012 / 3202 / 772
Регистрация: 02.02.2013
Сообщений: 3,073
Записей в блоге: 2
01.11.2015, 19:41 6
М.б. проще и удобнее будет отказаться от трехмерного массива. Например, так
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
 Public Structure myData
    Public NN As Integer   'номер наблюдения
    Public sgm1() As Double  'результаты sigma1
    Public sgm2() As Double  'результаты sigma1
    Public Sub New(ByVal n As Integer, ByVal s1() As Double, ByVal s2() As Double)
        NN = n
        sgm1 = s1
        sgm2 = s2
    End Sub
End Structure
 
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim dtCollect(3) As myData
    'заполнение
    For i = 0 To 3
        dtCollect(i) = New myData(i + 1, {44 + i, 22, 57, 45}, {22 + i, 78, 365, 42})
    Next
    'чтение
    'наблюдение 2
    Dim ss As String = dtCollect(1).NN.ToString & vbCrLf
    For Each ii As Double In dtCollect(1).sgm1
        ss &= ii.ToString & ", "
    Next
    ss &= vbCr
    For Each ii As Double In dtCollect(1).sgm2
        ss &= ii.ToString & ", "
    Next
    MsgBox(ss)
End Sub
PS. Это не значит, что трехмерный массив для ваших целей не подходит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2015, 19:41

Изменить размер глобального динамического массива в Private Sub
Имеем следующий код: Dim meriarr() As String Private Sub UserForm_Initialize() 'изменяем...

Изменить размер трехмерного вектора
Товарищи, у меня есть массив вида vector&lt;vector&lt;int&gt; &gt; rand_num_first(220, vector&lt;double&gt;(3, 0))...

Создание трехмерного динамического массива
Создать трехмерный динамический массив, типа string, количество страниц =9. Каждая страница...

Задание трехмерного динамического массива
Здравствуйте! Вот постигаю азы численных методов, в частности решение двумерной задачи...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru