|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Vb.net как узнать размер двухмерного массива
Проектирование иссо. Программирование
Хаб
Регистрация: 23.10.2005
Сообщений: 52
|
||
Просмотров: 2561
|
|
||||
Регистрация: 10.01.2020
Сообщений: 415
|
Ты объявляешь статический массив (т.е. с явно заданными размерностями), а тебе нужен динамический массив
Можешь тут посмотреть |
|||
![]() |
|
||||
Проектирование иссо. Программирование Регистрация: 23.10.2005
Хаб
Сообщений: 52
![]() |
объявляю
Dim arm1(, ) As Arm заполняю arm1(NumSetki, j) = New Arm и уже в значении arm1(0,0) System.NullReferenceException: "В экземпляре объекта не задана ссылка на объект." причём, студия подсвечивает ошибку мимо на две строки позже, не связанную с этим совсем. ----- добавлено через ~4 мин. ----- ну понятно. поторопился. Наверное нужно в момент New Arm присваивать значения. но они у меня там ещё только вычисляются и формируются
__________________
вот бы сейчас сесть за QB 4.5 |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 415
|
Не понял что ты делаешь. Смотри тут - все написано как делать
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,408
|
Может, стоит тогда посмотреть в сторону List?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
КЖ; 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 мин. ----- Цитата:
|
|||
![]() |
|
||||
Инженер-философ Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071
|
Практически во всех языках, от Барсика до Пурсика, для ссылочных типов есть стандартное обозначение пустого объекта. В Барсике это Нифига Nothing. Пока объект не создан через вызов New - он Nothing и использовать его нелья. Но можно сначала проверить его на Is Nothing, и пропускать нулевые (или заканчивать цикл, если все нули в конце массива, но тогда проще свой счетчик использовать).
Код:
Код:
|
|||
![]() |
|
||||
Проектирование иссо. Программирование Регистрация: 23.10.2005
Хаб
Сообщений: 52
![]() |
Всем спасибо. На словари и списки ума не хватило, другое не подошло. Сделал ещё один массив который знает сколько элементов в другом массиве.
но вернусь к вот этому If arm1(j, i) Is Nothing (спасибо) почему то вчера синтаксис я не так писал, вот и гнало.
__________________
вот бы сейчас сесть за QB 4.5 Последний раз редактировалось HiddenM, 29.08.2024 в 03:55. |
|||
![]() |
|
||||
Проектирование иссо. Программирование Регистрация: 23.10.2005
Хаб
Сообщений: 52
![]() |
и снова никак
пока продолжу здесь, но это уже не по теме. ранее созданный массив классов объявлен на 50 элементов. Заполняется на 32. В работе возникает необходимость вставить элемент в позицию 31, для этого 32 копируется на 33, 31 копируется на 32, а в старый 31 копируется всё из 30. потом идет пересчет массива, везде всё нормально, но когда цикл доходит до значения массива 30, меняются все из 30 и 31 на одинаковые как для 30. Когда меняю значения для 31, меняются для 31 и 30 одинаково как для 31. меняются одновременно, это видно в отладчике. Как так то ? Какая то неведомая связь произошла ?
__________________
вот бы сейчас сесть за QB 4.5 |
|||
![]() |
|
||||
Инженер-философ Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071
|
Очень даже ведомая. Называется "ссылка". Работает так же, как ярлык к файлу. Объяснение - по ссылке из поста 6. Реально новый объект создается через new. Простое присваивание только связывает новое имя с уже существующим объектом.
Вообще Барсика придумали, чтобы программист про такое не знал. Вот в Пурсике и в Сихуахуа для ссылок и указателей отдельное обозначение, там сразу видно, где настоящий объект, а где липовый; но взамен это прямо учить надо и обязательно писать явно. А в Барсике разве что ByRef иногда заставляют добавить, да вот такие приколы ловить дают, чтобы скучно не было. Код:
|
|||
![]() |
|
||||
Проектирование иссо. Программирование Регистрация: 23.10.2005
Хаб
Сообщений: 52
![]() |
ну как так то ?
это так вставляю новый элемент в позицию NumWhere. PozSeti это сколько было стрежней в сетке до корректировки. Код:
вообще-то 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 ? так потом пересчитываю каждый стержень Код:
__________________
вот бы сейчас сесть за QB 4.5 Последний раз редактировалось HiddenM, 04.10.2024 в 08:46. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Выделение по одному новому элементу массива за раз - это плохая идея в плане нагрузки на сборщик памяти, любая коллекция запрашивает сразу увеличенный на множество элементов массив, и учитывает с помощью внутреннего поля количество реально занятых ячеек. А так поставьте точки остановки на эти строки и проверяйте пошагово в отладчике - что в переменных индексов массива и в присваиваемой переменной. Где-то логическая ошибка в коде - не то условие, не ту переменную в код случайно вставили (которая совпала по типу данных).
----- добавлено через ~7 мин. ----- И зачем в цикл заносить операции преобразования строки в число: Val(ZazorArm0.Text) и прочие... Перед циклом преобразуйте текст в локальные переменные и дальше уже только с числами работайте. Последний раз редактировалось Сергей812, 04.10.2024 в 10:00. |
|||
![]() |
|
||||
Проектирование иссо. Программирование Регистрация: 23.10.2005
Хаб
Сообщений: 52
![]() |
Цитата:
__________________
вот бы сейчас сесть за QB 4.5 |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
И вместо сдвига ячеек в цикле можно использовать Array.Copy. Но лучше вообще избегать по возможности операций вставки в массивы: каждая вставка - это две "тяжелые" операции (выделение новой памяти под массив с инициализацией значением по умолчанию - поэтому в коллекциях сразу с запасом выделяют емкость массива, как писал выше) и копирование непустых ячеек. И если все это вызывается в цикле большое (десятки-сотни тысяч) число раз, то задержка выполнения кода будет уже весьма заметна.
|
|||
![]() |
|
||||
Инженер-философ Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071
|
Ну вот, опять сорок два. Магия не заработает, пока не выучить заклинания из поста по ссылке выше. Не знаю, есть ли учебники по Барсику, где просто-понятно объясняют, как оно устроено. В крестоплюсах тема управления памятью считается сложной, а незнание указателей - признаком профнепригодности. И вменяемых объяснений, кстати, тоже почти не найти.
Коротко: Самодельные классы - ссылочные типы. Это значит, что переменная типа "класс" состоит из двух частей. Первая часть - та, что мы пишем в программе. Именно ее мы видим в коде, и думаем, что она и есть объект. Но это всего лишь ярлык для второй, настоящей, части. Как и в ярлыке, тут всего лишь записан адрес настоящего объекта. Ярлык не работает, если нет файла, к которому он создан. См. бородатые анекдоты про "скопировал ярлык на дискету". Код:
Код:
Код:
Код:
Код:
|
|||
![]() |
|
||||
Проектирование иссо. Программирование Регистрация: 23.10.2005
Хаб
Сообщений: 52
![]() |
Так прекрасно всё объяснено. Спасибо.
но у меня пока не получилось ( это arm1(nSetka, NumWhere) = NEW arm1(nSetka, NumWhere - 1) тоже не работает. можно так arm1(nSetka, NumWhere) = NEW arm но не лучше.
__________________
вот бы сейчас сесть за QB 4.5 |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
может пытаться не перебором подобрать работающее решение, а анализом алгоритма и трассировкой выполнения кода?
|
|||
![]() |
|
||||
Инженер-философ Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071
|
Пока результата нет - ничего не понятно.
Со стороны по обрывкам кода тоже мало что понятно. Но скорее всего дело было так: В исходном состоянии есть массив на три элемента, где реально созданы только два,а третий пустой: При вызове 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. Нет потерянных связей - мусорщик ничего не выбрасывает. В плюсах, например, такие игры с памятью - отдельная глава в книгах. Написать связный список. Написать вставку элемента в начало. Написать вставку в конец. Написать обмен элементов. Написать инверсию списка. Все это - вовремя выделив память, и не потеряв ни одной ссылки. Упражнения: двусвязный список, дерево, и т.п. А в бейсике это прячут, видимо, отсюда и непонимание. |
|||
![]() |
|
||||
Проектирование иссо. Программирование Регистрация: 23.10.2005
Хаб
Сообщений: 52
![]() |
Спасибо Нубий-IV. Доходчиво.
Эту задачу я прошёл примерно месяц назад. Это было так : стержень который нужно сдвинуть, я "материализовал" вне массива, а в массиве ссылался не на соседний стержень как раньше, а на "материализованный" элемент. И VB наверное не понял что от него хотят, и на всякий случай сделал правильно.
__________________
вот бы сейчас сесть за QB 4.5 |
|||
![]() |
|
||||
Инженер-философ Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,071
|
Он сделал так, как он устроен. Просто языки, в которых ссылок нет, слишком тормозные, потому что все и всегда копируют. А где ссылки есть - бывают двух видов. В одних (типа C/C++) ссылки/указатели пишут явно, в других (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 |