Vb.net как узнать размер двухмерного массива
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Vb.net как узнать размер двухмерного массива

Vb.net как узнать размер двухмерного массива

Ответ
Поиск в этой теме
Непрочитано 28.08.2024, 07:17 #1
Vb.net как узнать размер двухмерного массива
HiddenM
 
Проектирование иссо. Программирование
 
Хаб
Регистрация: 23.10.2005
Сообщений: 52

Здравствуйте

есть класс

Код:
[Выделить все]
Public Class Arm
        Public Property gv As String
        Public Property Poz As String
        Public Property diam As Byte 
        Public Property stal As String
        Public Property stp As Short
        Public Property dlina As Short
        Public Property ves As Double
        Public Property Spec As String 
End Class
объявление двухмерного массива классов

Код:
[Выделить все]
Dim arm1(10, 35) As Arm

заполненный массив имеет вид

Код:
[Выделить все]
>	* (0,27)
>	* (0, 28)
>	* (0, 29)
>	* (0, 30)	{TheWallRa.Forml .Arm} {TheWallRa.Forml .Arm} {TheWallRa.Forml .Arm} {TheWallRa.Forml .Arm}
* (0- 31)	{TheWallRa.Forml .Arm}
 Poz	"26"
 Spec	Nothing
 diam	10
 dlina	520
 gv	        "G"
 stal	        ""
 stp	        200
 ves	        0.32
' * (0, 32)	{TheWallRa.Forml .Arm}
 Poz	         "27"
 Spec	"170,2450,-1280"
 diam	10
 dlina	1980
 gv	         "G"
 stal        	"Ac300"
 stp	         50
 ves	         1.22
* (0,33)	Nothing
* (0,34)	Nothing
* (0,35)	Nothing
> * (1,0)	{TheWallRa.Forml .Arm}
> * (1,1)	{TheWallRa.Forml .Arm}

массив где-то заполняется, на меньшее количество чем объявлен.
затем идёт использование его

Код:
[Выделить все]
For i = 0 To UBound(arm1, 2)
            If arm1(1, i).Poz = "" Then Exit For
            If arm1(1, i).gv = "v" Then
                pt1(0) = stpX 
                pt1(1) = y 
                pt2(0) = stpX 
                pt2(1) = y + arm1(1, i).dlina  '
                stpX = stpX + arm1(1, i).stp
                Dim obj 
                obj = ThisDrawing.ModelSpace.AddLine(pt1, pt2) 
            End If
        Next

И вот.
Ubound врёт. Он всегда показывает размер объявленного массива. Не существующий класс в массиве никак не могу отследить.
в строке
If arm1(1, i).Poz = "" Then Exit For
ломается в левой части, когда i=33. так как он не был создан как класс.
Мне надо чтоб не попадать дальше заполненного массива. Как ?
__________________
вот бы сейчас сесть за QB 4.5
Просмотров: 2561
 
Непрочитано 28.08.2024, 07:27
#2
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Ты объявляешь статический массив (т.е. с явно заданными размерностями), а тебе нужен динамический массив
Можешь тут посмотреть
name02 вне форума  
 
Автор темы   Непрочитано 28.08.2024, 07:52
1 | #3
HiddenM

Проектирование иссо. Программирование
 
Регистрация: 23.10.2005
Хаб
Сообщений: 52
<phrase 1=


объявляю
Dim arm1(, ) As Arm

заполняю
arm1(NumSetki, j) = New Arm

и уже в значении arm1(0,0)
System.NullReferenceException: "В экземпляре объекта не задана ссылка на объект."

причём, студия подсвечивает ошибку мимо на две строки позже, не связанную с этим совсем.

----- добавлено через ~4 мин. -----
ну понятно. поторопился. Наверное нужно в момент New Arm присваивать значения. но они у меня там ещё только вычисляются и формируются
__________________
вот бы сейчас сесть за QB 4.5
HiddenM вне форума  
 
Непрочитано 28.08.2024, 08:01
#4
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Не понял что ты делаешь. Смотри тут - все написано как делать
name02 вне форума  
 
Непрочитано 28.08.2024, 08:06
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,408


Может, стоит тогда посмотреть в сторону List?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.08.2024, 09:33
#6
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Может не так уж и нужен двумерный массив?
Ну на вскидку можно использовать словарь: var Arm1 = new Dictionary<String, String>(); если ключ уникальный
Можно использовать список с кортежем: var Arm2 = new List<(string, string)> ();
или сделать что то похожее на словарь, но без уникального ключа: var Arm3 = new List<KeyValuePair<string, string>>();

Блин, вариантов масса, причем с контролем уникальности и без этого, зачем себя ограничивать простыми массивами?

А если отвечать на вопрос в начале топика, то ответ простой, нужно написать свой метод расширение для массива, который будет возвращать количество заполненных ячеек массива... а вот что делать с "разрывами", тут уж Вам решать =))

----- добавлено через ~13 мин. -----
Цитата:
Сообщение от HiddenM Посмотреть сообщение
ну понятно. поторопился. Наверное нужно в момент New Arm присваивать значения. но они у меня там ещё только вычисляются и формируются
Вам бы разобраться с основными механизмами работы с памятью: https://microsin.net/programming/pc/...-unboxing.html , там много интересного и важного
Boxa вне форума  
 
Непрочитано 28.08.2024, 09:52
| 2 #7
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Не надо использовать VB.Net - давно надо перейти на C#
trir вне форума  
 
Непрочитано 29.08.2024, 02:24
#8
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071


Практически во всех языках, от Барсика до Пурсика, для ссылочных типов есть стандартное обозначение пустого объекта. В Барсике это Нифига Nothing. Пока объект не создан через вызов New - он Nothing и использовать его нелья. Но можно сначала проверить его на Is Nothing, и пропускать нулевые (или заканчивать цикл, если все нули в конце массива, но тогда проще свой счетчик использовать).

Код:
[Выделить все]
Class Arm
    Public diam As Byte 
    Public dlina As Short
End Class

Module Program
    Sub Main()
        Dim arms(5) As Arm

        For i As Integer = 1 To 3
            arms(i) = New Arm
            With arms(i)
                .diam = i
                .dlina = i * 10
            End With
        Next

        For i As Integer = 1 to 5
            If arms(i) Is Nothing Then 
                Console.WriteLine( "{0}. Нифига нет", i)
            Else
                Console.WriteLine("{0}. Arm {1}x{2}", i, arms(i).diam, arms(i).dlina)
            End If
        Next

    End Sub
End Module

Код:
[Выделить все]
1. Arm 1x10
2. Arm 2x20
3. Arm 3x30
4. Нифига нет
5. Нифига нет
Цитата:
Сообщение от trir Посмотреть сообщение
давно надо перейти на C#
  • C#
    null вместо Nothing - это круто! Это все меняет! Переходи на null!
  • JavaScript
    Какой еще нал-анал?! Вот потому, что вы говорите то, что не думаете и думаете то, что не думаете, вот в # и сидите! Если объект пустой - он isEmpty.
  • Pure C
    Ты говоришь null, но делаешь это без уважения! Гвори NULL, или пожалеешь!
  • C++
    Что за односложные слова, ты что, недоучка? Надо nullptr! Учись говорить полным предложением! Разве что гласные проглатывать можно, они, типа, вкусные.
  • Pascal
    Что за Null, это что тебе, число? Пустой объект - это Nil! Новое специальное слово для нового специального понятия! Наука, епта!
Кто еще знает разные смешные слова, указывающие пустому месту на его место - пишите комментарии!
Нубий-IV вне форума  
 
Автор темы   Непрочитано 29.08.2024, 03:47
#9
HiddenM

Проектирование иссо. Программирование
 
Регистрация: 23.10.2005
Хаб
Сообщений: 52
<phrase 1=


Всем спасибо. На словари и списки ума не хватило, другое не подошло. Сделал ещё один массив который знает сколько элементов в другом массиве.

но вернусь к вот этому
If arm1(j, i) Is Nothing (спасибо)
почему то вчера синтаксис я не так писал, вот и гнало.
__________________
вот бы сейчас сесть за QB 4.5

Последний раз редактировалось HiddenM, 29.08.2024 в 03:55.
HiddenM вне форума  
 
Автор темы   Непрочитано 04.10.2024, 03:08
#10
HiddenM

Проектирование иссо. Программирование
 
Регистрация: 23.10.2005
Хаб
Сообщений: 52
<phrase 1=


и снова никак
пока продолжу здесь, но это уже не по теме.
ранее созданный массив классов объявлен на 50 элементов. Заполняется на 32.
В работе возникает необходимость вставить элемент в позицию 31, для этого 32 копируется на 33, 31 копируется на 32, а в старый 31 копируется всё из 30.
потом идет пересчет массива, везде всё нормально, но когда цикл доходит до значения массива 30, меняются все из 30 и 31 на одинаковые как для 30. Когда меняю значения для 31, меняются для 31 и 30 одинаково как для 31.
меняются одновременно, это видно в отладчике.
Как так то ?
Какая то неведомая связь произошла ?
__________________
вот бы сейчас сесть за QB 4.5
HiddenM вне форума  
 
Непрочитано 04.10.2024, 04:55
1 | #11
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071


Цитата:
Сообщение от HiddenM Посмотреть сообщение
Какая то неведомая связь произошла ?
Очень даже ведомая. Называется "ссылка". Работает так же, как ярлык к файлу. Объяснение - по ссылке из поста 6. Реально новый объект создается через new. Простое присваивание только связывает новое имя с уже существующим объектом.

Вообще Барсика придумали, чтобы программист про такое не знал. Вот в Пурсике и в Сихуахуа для ссылок и указателей отдельное обозначение, там сразу видно, где настоящий объект, а где липовый; но взамен это прямо учить надо и обязательно писать явно. А в Барсике разве что ByRef иногда заставляют добавить, да вот такие приколы ловить дают, чтобы скучно не было.


Код:
[Выделить все]
class Test
    public i as integer
end class

module program
    sub main()

    dim t1 as new Test
    t1.i = 10

    dim  t2 as Test
    t2 = t1
    t2.i = 20

    console.writeline(t1.i)
    console.writeline(t2.i)

    end sub
end module
Нубий-IV вне форума  
 
Автор темы   Непрочитано 04.10.2024, 08:09
#12
HiddenM

Проектирование иссо. Программирование
 
Регистрация: 23.10.2005
Хаб
Сообщений: 52
<phrase 1=


ну как так то ?

это так вставляю новый элемент в позицию NumWhere. PozSeti это сколько было стрежней в сетке до корректировки.
Код:
[Выделить все]
 arm1(nSetka, PozSeti + 1) = New Arm 'создаю следующий 
            ' сдвигаю вниз массив на 1 элемент снизу вверх
            For i = PozSeti + 1 To NumWhere Step -1
                arm1(nSetka, i) = arm1(nSetka, i - 1)
            Next
            If what = "near" Then ' берём всё из нижнего стержня
                arm1(nSetka, NumWhere) = arm1(nSetka, NumWhere - 1)
                arm1HowMuch(nSetka) = arm1HowMuch(nSetka) + 1 ' стержней стало больше на 1
            Else ' берем из передачи
            ... 
            end if  
почему все 31 элемент одного массива ведут себя адекватно а эти два нет.

вообще-то arm1(nSetka, i) содержит это
arm1(nSetka, NumWhere).gv
arm1(nSetka, NumWhere).Poz
arm1(nSetka, NumWhere).diam
arm1(nSetka, NumWhere).stal
arm1(nSetka, NumWhere).stp
arm1(nSetka, NumWhere).ves
arm1(nSetka, NumWhere).dlina
arm1(nSetka, NumWhere).Spec
может нужно поштучно присваивать когда вставляю в новый в арм1 ?


так потом пересчитываю каждый стержень

Код:
[Выделить все]
  '-=-= горизонтальные стержни -=-=-=-
        mes = mes & "<br>***<br>"
        sideWide0 = c - otstupV ' длина которую буду уменьшать вертикальный шаг стрежней
        Cone = 180 - 90 - Cone

        For i = 0 To PozSeti ' 
            If arm1(nSetka, i).gv = "g" Then
                sideWide0 = sideWide0 - arm1(nSetka, i).stp
                If sideWide0 < e Then ' на склоне
                    Dim tim As Single = (sideWide0) * Math.Tan(Cone * Math.PI / 180)
                    arm1(nSetka, i).dlina = tim + v - (a - v) * 0.013605 - Val(ZazorArm0.Text)
                    If Usechgor.Checked = True Then
                        arm1(nSetka, i).dlina = arm1(nSetka, i).dlina + Val(UsechGorDelta.Text)
                    End If
                Else ' потсоянные
                    arm1(nSetka, i).dlina = a - Val(ZazorArm0.Text) * 2
                End If
                'Dim myVes As Double = (Math.PI * arm1(nSetka, i).diam ^ 2) / 4 * arm1(nSetka, i).dlina / 1000 * 7.85 / 1000

                arm1(nSetka, i).ves = myVes(arm1(nSetka, i).diam, arm1(nSetka, i).dlina)
            End If

            If arm1(nSetka, i).gv = "G" Then ' специальная арматура  -\  самая верхняя, идет после последней прямой короткой
                Dim asm = Split(arm1(nSetka, i).Spec, ",")
                Dim specgor As Integer = a - v
                Dim specver As Integer = -(c - b)
                arm1(nSetka, i).Spec = asm(0) & "," & specgor & "," & specver
            End If

            mes = mes & arm1(nSetka, i).Poz & " длина = " & arm1(nSetka, i).dlina & "   " & arm1(nSetka, i).gv & "   " & arm1(nSetka, i).ves & "<Br>"
        Next
вмешательство в массив происходит в 11 и в 20-ой строке
__________________
вот бы сейчас сесть за QB 4.5

Последний раз редактировалось HiddenM, 04.10.2024 в 08:46.
HiddenM вне форума  
 
Непрочитано 04.10.2024, 09:46
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Выделение по одному новому элементу массива за раз - это плохая идея в плане нагрузки на сборщик памяти, любая коллекция запрашивает сразу увеличенный на множество элементов массив, и учитывает с помощью внутреннего поля количество реально занятых ячеек. А так поставьте точки остановки на эти строки и проверяйте пошагово в отладчике - что в переменных индексов массива и в присваиваемой переменной. Где-то логическая ошибка в коде - не то условие, не ту переменную в код случайно вставили (которая совпала по типу данных).

----- добавлено через ~7 мин. -----
И зачем в цикл заносить операции преобразования строки в число: Val(ZazorArm0.Text) и прочие... Перед циклом преобразуйте текст в локальные переменные и дальше уже только с числами работайте.

Последний раз редактировалось Сергей812, 04.10.2024 в 10:00.
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.10.2024, 10:31
#14
HiddenM

Проектирование иссо. Программирование
 
Регистрация: 23.10.2005
Хаб
Сообщений: 52
<phrase 1=


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Выделение по одному новому элементу массива за раз - это плохая идея в плане нагрузки на сборщик памяти, любая коллекция запрашивает сразу увеличенный на множество элементов массив, и учитывает с помощью внутреннего поля количество реально занятых ячеек. А так поставьте точки остановки на эти строки и проверяйте пошагово в отладчике - что в переменных индексов массива и в присваиваемой переменной. Где-то логическая ошибка в коде - не то условие, не ту переменную в код случайно вставили (которая совпала по типу данных).

----- добавлено через ~7 мин. -----
И зачем в цикл заносить операции преобразования строки в число: Val(ZazorArm0.Text) и прочие... Перед циклом преобразуйте текст в локальные переменные и дальше уже только с числами работайте.
да это ещё набросок. Испытываю основные принципы. Потом вылизывать буду. Спасибо.
__________________
вот бы сейчас сесть за QB 4.5
HiddenM вне форума  
 
Непрочитано 04.10.2024, 10:56
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


И вместо сдвига ячеек в цикле можно использовать Array.Copy. Но лучше вообще избегать по возможности операций вставки в массивы: каждая вставка - это две "тяжелые" операции (выделение новой памяти под массив с инициализацией значением по умолчанию - поэтому в коллекциях сразу с запасом выделяют емкость массива, как писал выше) и копирование непустых ячеек. И если все это вызывается в цикле большое (десятки-сотни тысяч) число раз, то задержка выполнения кода будет уже весьма заметна.
Сергей812 вне форума  
 
Непрочитано 05.10.2024, 07:07
#16
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071


Цитата:
Сообщение от HiddenM Посмотреть сообщение
это так вставляю новый элемент
Ну вот, опять сорок два. Магия не заработает, пока не выучить заклинания из поста по ссылке выше. Не знаю, есть ли учебники по Барсику, где просто-понятно объясняют, как оно устроено. В крестоплюсах тема управления памятью считается сложной, а незнание указателей - признаком профнепригодности. И вменяемых объяснений, кстати, тоже почти не найти.

Коротко:

Самодельные классы - ссылочные типы. Это значит, что переменная типа "класс" состоит из двух частей.

Первая часть - та, что мы пишем в программе. Именно ее мы видим в коде, и думаем, что она и есть объект. Но это всего лишь ярлык для второй, настоящей, части. Как и в ярлыке, тут всего лишь записан адрес настоящего объекта. Ярлык не работает, если нет файла, к которому он создан. См. бородатые анекдоты про "скопировал ярлык на дискету".
Код:
[Выделить все]
' Ярлык к настоящей переменной
' Ярлык создан, а переменная - нет
dim t as Test

' Нет переменной - ярлык битый.
' Необработанное исключение: System.NullReferenceException: 
' Ссылка на объект не указывает на экземпляр объекта.
console.writeline(t.i)
Вторая часть - настоящая. Она создается командой NEW. Лежит она где-то в глубинах памяти, управляемой диспетчером. Вторая часть - это как гигабайтное видео. А первая часть - как килобайтный ярлык на это видео.
Код:
[Выделить все]
' Волшебное слово NEW создает за раз и настоящую переменную, и ссылку на нее
' Это как записать видео, а потом создать ярлык.
' Теперь t - это комплектная пара, которая работает.
dim t as new Test

' OK
' По ссылке из первой части (t) мы идем ко второй (невидимой), и читаем оттуда i
console.writeline(t.i)
При копировании переменных происходит всего лишь копирование адреса. Это как в один ярлык скопипастить путь из другого ярлыка. Оба ярлыка станут показывать на один файл. А сами файлы при этом никуда не копируются.
Код:
[Выделить все]
dim t1 as new Test ' Реальная переменная (невидимая) и ссылка на нее  - t1 (видимая)
dim t2 = t1        ' Теперь t2 ссылается на ту же невидимую переменную, что и t1 (как копия ярлыка)
dim t3 = t1        ' И t3 - тоже. Теперь у нас есть один настоящий файл и три ярлыка к нему

' Неважно, через какой ярлык я меняю файл
t1.i = 1000

' Все три ярлыка покажут один результат, потому что настоящий файл - один
console.writeline(t1.i) ' 1000
console.writeline(t2.i) ' 1000
console.writeline(t3.i) ' 1000
А еще Барсик сам удаляет скрытые части, на которые не осталось ярлыков. И при присваивании происходит магия.
Код:
[Выделить все]
' Массив переменных Test
' То есть массив пустых ярлыков
dim array(3) as Test

' Теперь к каждому ярлыку создается свой файл
array(1) = new Test: array(1).i = 1000
array(2) = new Test: array(2).i = 2000
array(3) = new Test: array(3).i = 3000

' А тут в ярлык 2 копипастится путь из ярлыка 1.
' И файл 2 остается без ссылок.
' Приходит злой мусорщик, и хана второму файлу.
' Остался первый файл и два ярлыка к нему
array(2)= array(1)

' А тут хана третьему файлу
' Зато остались три одинаковых ярлыка
array(3) =array(1)

' Все ярлыки открывают один файл
console.writeline(array(1).i) ' 1000
console.writeline(array(2).i) ' 1000
console.writeline(array(3).i) ' 1000
Если надо реально вставить новый объект в массив, надо явно создавать объект через NEW:
Код:
[Выделить все]
arm1(nSetka, NumWhere) = NEW arm1(nSetka, NumWhere - 1)
Иначе стержней становится не на один больше, а на один меньше: старый стержень теряет свою ссылку, и за ним приходит злой мусорщик. Зато в двух элементах массива получаются две одинаковые ссылки на один стержень. И снаружи их не отличить.
Нубий-IV вне форума  
 
Непрочитано 05.10.2024, 09:57
#17
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
надо явно создавать объект через NEW:
вообще то интерфейс клонирования надо использовать, новый объект со значениями полей по умолчанию особого интереса не представляет)
Сергей812 вне форума  
 
Автор темы   Непрочитано 07.10.2024, 09:41
#18
HiddenM

Проектирование иссо. Программирование
 
Регистрация: 23.10.2005
Хаб
Сообщений: 52
<phrase 1=


Так прекрасно всё объяснено. Спасибо.
но у меня пока не получилось (
это arm1(nSetka, NumWhere) = NEW arm1(nSetka, NumWhere - 1) тоже не работает.
можно так arm1(nSetka, NumWhere) = NEW arm
но не лучше.
__________________
вот бы сейчас сесть за QB 4.5
HiddenM вне форума  
 
Непрочитано 07.10.2024, 10:31
#19
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от HiddenM Посмотреть сообщение
Так прекрасно всё объяснено. Спасибо.
но у меня пока не получилось (
это arm1(nSetka, NumWhere) = NEW arm1(nSetka, NumWhere - 1) тоже не работает.
можно так arm1(nSetka, NumWhere) = NEW arm
но не лучше.
может пытаться не перебором подобрать работающее решение, а анализом алгоритма и трассировкой выполнения кода?
Сергей812 вне форума  
 
Непрочитано 11.10.2024, 10:10
#20
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071


Цитата:
Сообщение от HiddenM Посмотреть сообщение
Так прекрасно всё объяснено.
Пока результата нет - ничего не понятно.
Цитата:
Сообщение от HiddenM Посмотреть сообщение
можно так arm1(nSetka, NumWhere) = NEW arm
Со стороны по обрывкам кода тоже мало что понятно. Но скорее всего дело было так:

В исходном состоянии есть массив на три элемента, где реально созданы только два,а третий пустой:

При вызове Setka(2) = New Setka создается новый реальный объект Real_Setka_2, а связь со старым теряется, и его прибирает злой мусорщик:

При смещении Setka(3) = Setka(2) бывший пустой третий ярлык связывается со вторым, и получается тот самый глюк - два одинаковых объекта в массиве:

Надо делать так:

Сначала смещение элемента Setka(3) = Setka(2). Бывший пустой ярлык привязывается к существующему Real_Setka_2, и от теперь фактически Real_Setka_2,3.

Потом создание объекта Setka(2) = New Setka. Тут создается новый реальный объект, и ярлык Setka(2) привязывается к нему. А ярлык Setka(3) остается отвечать за бывший Real_Setka_2,3, который теперь становится просто Real_Setka_3. Нет потерянных связей - мусорщик ничего не выбрасывает.


В плюсах, например, такие игры с памятью - отдельная глава в книгах. Написать связный список. Написать вставку элемента в начало. Написать вставку в конец. Написать обмен элементов. Написать инверсию списка. Все это - вовремя выделив память, и не потеряв ни одной ссылки. Упражнения: двусвязный список, дерево, и т.п. А в бейсике это прячут, видимо, отсюда и непонимание.
Миниатюры
Нажмите на изображение для увеличения
Название: 01.png
Просмотров: 123
Размер:	11.2 Кб
ID:	265027  Нажмите на изображение для увеличения
Название: 02.png
Просмотров: 121
Размер:	13.3 Кб
ID:	265028  Нажмите на изображение для увеличения
Название: 03.png
Просмотров: 120
Размер:	12.1 Кб
ID:	265029  Нажмите на изображение для увеличения
Название: 04.png
Просмотров: 123
Размер:	12.0 Кб
ID:	265030  Нажмите на изображение для увеличения
Название: 05.png
Просмотров: 120
Размер:	11.7 Кб
ID:	265031  

Нубий-IV вне форума  
 
Автор темы   Непрочитано 26.12.2024, 08:58
#21
HiddenM

Проектирование иссо. Программирование
 
Регистрация: 23.10.2005
Хаб
Сообщений: 52
<phrase 1=


Спасибо Нубий-IV. Доходчиво.
Эту задачу я прошёл примерно месяц назад.
Это было так : стержень который нужно сдвинуть, я "материализовал" вне массива, а в массиве ссылался не на соседний стержень как раньше, а на "материализованный" элемент.
И VB наверное не понял что от него хотят, и на всякий случай сделал правильно.
__________________
вот бы сейчас сесть за QB 4.5
HiddenM вне форума  
 
Непрочитано 26.12.2024, 10:52
#22
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071


Он сделал так, как он устроен. Просто языки, в которых ссылок нет, слишком тормозные, потому что все и всегда копируют. А где ссылки есть - бывают двух видов. В одних (типа C/C++) ссылки/указатели пишут явно, в других (NET) стыдливо прячут. Считается, что неявная запись не требует учить лишние понятия, поэтому бейсик "типа простой" и "типа надежный". В штатах сейчас на государственном уровне пытаются плюсы запретить "потому что слишком сложно и ошибки в указателях". А у нас тут как раз видно, что на бейсике в указателях ошибок не бывает . Все равно же с этой темой разбираться надо, хотя она и не слишком простая. Есть даже такое мнение: Почему учить программирование надо с Пурсика.
Нубий-IV вне форума  
 
Непрочитано 06.02.2025, 04:11
#23
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071


Миниатюры
Нажмите на изображение для увеличения
Название: Pass-by.jpg
Просмотров: 42
Размер:	26.0 Кб
ID:	266639  
Нубий-IV вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Vb.net как узнать размер двухмерного массива



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размер в формате "NхШаг" sam_n Программирование 32 30.06.2019 17:50
Как сделать параметрический размер информационным Малюк AutoCAD 2 27.10.2014 11:01
Как определить (назначить, задать) размер катета К1 в сварных швах У7 и Т7 по ГОСТ 5264-80 rus_h Машиностроение 5 17.06.2014 10:02
Как определить размер катета К1 в сварных швах У7 и Т7 по ГОСТ 5264-80 rus_h Металлические конструкции 2 30.05.2014 19:49
Размер в листе показывает не размер детали! Witalij AutoCAD 6 24.06.2008 07:56