Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17

Могут ли быть взамосвязаны массивы?

15.05.2017, 17:49. Показов 818. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
В программе существуют 3 массива; items - основной массив элементов; item - вспомогательный массив (для выделенных элементов и действия над ними); itemsCopied - массив скопированных элементов. Массив item заполняется из items выделенными элементами (построчно заполняется). Массив itemCopied заполняется из массива item при нажатии кнопки «Копировать» (itemsCopied = item) и остается неизменным до следующего копирования. Все массивы объявлены без определенного типа данных, т.к. данные в них разных типов.
Проблема заключается в следующем:
При копировании элементов необходимо произвести пересчет координат элементов в подмассиве массива itemsCopied, по какой-то причине перерасчет также происходит и в подмассивах других массивов, хотя в коде явно указан только массив itemCopied.
Visual Basic
1
2
3
4
5
6
7
8
       MsgBox("items " & items(0, 3)(0, 0) & " - " & items(0, 3)(0, 1) & "     item " & item(0, 3)(0, 0) & " - " & item(0, 3)(0, 1))
       For strItem = 0 To UBound(itemsCopied)
            For strCoord = 0 To UBound(itemsCopied(strItem, 3), 1)
                itemsCopied(strItem, 3)(strCoord, 0) = itemsCopied(strItem, 3)(strCoord, 0) - Xmin
                itemsCopied(strItem, 3)(strCoord, 1) = itemsCopied(strItem, 3)(strCoord, 1) - Ymin
            Next
        Next
        MsgBox("items " & items(0, 3)(0, 0) & " - " & items(0, 3)(0, 1) & "     item " & item(0, 3)(0, 0) & " - " & item(0, 3)(0, 1))
Снимок 1 - это первый msgbox до пересчета, Снимок 2 - второй msgbox после пересчета и как раз видно, что изменения произошли почему то во всех массивах. Может такое быть, что массивы взаимосвязаны? В программировании я не силен. Подскажите в чем может быть причина и как ее устранить.
С уважением Денис

P.s. VB2010Express
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2017, 17:49
Ответы с готовыми решениями:

Ошибка ORA-01484: массивы могут быть привязаны только к PL/SQL командам
Доброго времени суток, уважаемые форумчане. Возможно, мой вопрос немного не по теме, он касается работы с Oracle из C++(Qt). К сожалению, в...

"В поле может быть введено только одно слово, пробелы могут быть или не быть с начала слова и в конце"
Добрый вечер уважаемые форумчане. Подскажите как написать выражение со след условием: -в поле может быть введено только одно слово,...

я учусь на высшке на программиста.. какие могут быть задачи на экзамене 1й курс .2й семестр!!.. должны быть классы!!
я учусь на высшке на программиста.. какие могут быть задачи на экзамене 1й курс .2й семестр!!.. должны быть классы!!.. например какие...

15
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
15.05.2017, 17:55  [ТС]


0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
15.05.2017, 20:00
Цитата Сообщение от diska Посмотреть сообщение
itemsCopied = item
Вы как бы получаете ссылку на массив.
Теперь все изменения itemsCopied будут касаться и массива item.
0
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
16.05.2017, 06:43  [ТС]
Понятно. Получается item(0,3)(0,0)=items(0,3)(0,0) тоже является ссылкой на ячейку массива?
Заменил строку itemsCopied = item на
Visual Basic
1
2
ReDim itemsCopied(UBound(item), uboundItem2)
Array.Copy(item, itemsCopied, item.Length)
и в итоге ничего, все по прежнему.
Подскажите как правильно копировать данные частично или полностью из массива в массив
Массивы item, items, itemsCopied являются глобальными, элементы (n,2),(n,3) являются подмассивами ()(,)соответственно
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
16.05.2017, 07:18
Цитата Сообщение от diska Посмотреть сообщение
Получается item(0,3)(0,0)=items(0,3)(0,0) тоже является ссылкой на ячейку массива?
Нет.

Цитата Сообщение от diska Посмотреть сообщение
в итоге ничего, все по прежнему.
Не может быть

'''''''''''''''''''''
Вы, по-моему, что-то не так делаете. Зачем Вам двумерный массив двумерных массивов ?

Добавлено через 10 минут
Цитата Сообщение от diska Посмотреть сообщение
как правильно копировать данные частично или полностью из массива в массив
Можно по элементам, можно через Array.Copy, как у Вас сейчас....
1
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
16.05.2017, 07:26  [ТС]
Вот способ заполнения item из items (из этой области item(0,3)(0,0)=items(0,3)(0,0))
Visual Basic
1
2
3
4
5
6
For strItem = 0 To uboundItem1
    If items(strItem, 0) = Nothing Then Exit For
        If items(strItem, 4) = False Then Continue For  
        For q As Byte = 0 To uboundItem2 : item(a, q) = items(strItem, q) : Next
        a += 1
Next
и он так же пересчитывается , а из этого массива заполняется itemCopied
Программка - это что-то типа небольшой САПР, здесь оперирую геометрическими фигурами у которых есть какие-то свои свойства и от 1 до n точек координат. Поэтому введены подмассивы (n,2)() - свойств, (n,3)(,) - координат
И кстати попробовал уже itemsCopied = item.Clone один фиг
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
16.05.2017, 07:37
+1. Ошибка скорее всего где-то в понимании выбранной вами же системы хранения структуры данных.
Без постановки задачи тяжело что-то посоветовать.

Ну, как вариант, есть например, массив пользовательских типов, куда при необходимости воткнуть ещё один массив.
Это более гибко, чем массив массивов.

P.S. В VB.NET проще (а главное, понятнее) писать короче, что-то вроде n -= Xmin, чем такую длинную строку.
2
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
16.05.2017, 07:37
Цитата Сообщение от diska Посмотреть сообщение
один фиг
Чудес не бывает (с). Значит что-то где то не так...
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
16.05.2017, 10:16
Цитата Сообщение от diska Посмотреть сообщение
Массив itemCopied заполняется из массива item
если содержимое массивов должно стать одинаковым, то можно воспользоваться API-шной функцией CopyMemory. Она и работает быстро и просто копирует один участок памяти в другой

Добавлено через 5 минут
а, вообще, можно было бы создать простой массив, где хранились бы только порядковые номера выделенных объектов.
0
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
16.05.2017, 18:10  [ТС]
_shark Просто одним массивом мне никак не обойтись. Массив itemsCopie необходим при вставке скопированных элементов, они всегда следуют(отрисовываются) за курсором, поэтому необходимо произвести перерасчет координат в массиве уменьшив их на Xmin, Ymin тем самым сдвинув их к нулю. Массив item необходим для оперирования над выделенными фигурам(поворот, отражение, изменение свойств и пр.) и отрисовки модификаций на экране. Таким образом без данных массивов не добиться наглядности.
Функция CopyMemory может быть и решила бы проблему с itemsCopied, но еще есть item который заполняется из items и он ему не всегда равен. Я по CopyMemory не нашел чего-то внятного.

Dragokas Все данные хранятся в одном массиве item с подмассивами, остальные вспомогательные. Для меня так удобней. По поводу сокращений при писанине я всегда стараюсь так делать, это здесь я расписал.

Может я выложу свой "прожэкт", а вы гляните на него, вдруг средь моей писанины чего-нибудь да увидите?
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
16.05.2017, 21:58
Цитата Сообщение от diska Посмотреть сообщение
Может я выложу свой "прожэкт"
Выкладывайте.
0
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
17.05.2017, 06:18  [ТС]
Заранее спасибо!
Вложения
Тип файла: zip qwe.zip (147.7 Кб, 7 просмотров)
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
17.05.2017, 10:33
Черт ногу сломит Понятно одно - копируя массив, содержащий массивы, вы тем самым также копируете ссылки на эти массивы , так что ничего удивительного нет, что все у Вас взаимосвязано.

Слишком у Вас мудрено все сделано. Было бы гораздо проще и понятнее создать структуру (как писал Dragokas), или класс.
1
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
17.05.2017, 10:57  [ТС]
Понятно. Я так и думал, что Вы упомяните ногу. Насчет массивов так и есть. Я об этом как-то и не подумал. Попробую переделать.
По поводу структур или классов я пробовал с ними разобраться, но что-то ничего не получалось до конца. Я не знаю как их применить к своему случаю, а потом еще сними оперировать. Не хватает у меня мозга на такие простые вещи.
Спасибо, что Вы нашли время с помочь мне.
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
18.05.2017, 11:31
diska, посмотрел ваш код. Вам, действительно, надо как-то упорядочить структуры данных. Если вам непонятны объекты и классы и вы не хотите с ними заморачиваться и вам ближе массивы, то попробуйте описать графический объект примерно таким образом:

Visual Basic
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
Type ShapeRec
    Type As Byte    ' тип объекта - круг, прямоугольник, полигон текст и т.д.
    Options as Long ' здесь могут храниться любых 32 логических переменных (флага)
    LeftX as Double  'Координаты углов объекта
    TopY as Double
    RightX as Double
    BottomY as Double
    Angle as Double  'угол поворота
    ID as Integer 'уникальный номер объекта, например, для доступа к массиву координат
End Type
 
'описываем массив объектов
Public item() As ShapeRec
 
' описываем флаги
const flagSelection = 1, flagCanFinishItem = 2
const flagItemForMove = 4, flagMouseDownMiddle = 8,
const flagMouseDownLeft = 16, LShiftButDown = 32
const flagPasting = 64
 
'доступ к свойствам осуществляется, например, таким образом
if item(n).Options and flagPasting <> 0 then ...
 
или же можно описать функцию для наглядности
Function SetFlag(AOptions&, Flag&) as Boolean
   SetFlag = (AOptions and Flag) <> 0
End Function
' и использовать как
If SetFlag(item(n).Options, flagSelection) then
 
'доступ к координатам
With item(n)
  .LeftX = .LeftX - XMin : .RightX = .RightX - XMin
  .TopY = .TopY - YMin : .BottomY = .BottomY - YMin
End With
 
'или же 
item(n).LeftX = item(n).LeftX - XMin
1
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
18.05.2017, 12:01  [ТС]
Добрый день _shark.
Вы предлагаете структуру? По крайней мере очень похоже.
Попробую переписать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2017, 12:01
Помогаю со студенческими работами здесь

Могут ли на диске быть данные?
Всем здравствуйте! Подскажите, пожалуйста, если при запуске компа вылетает сообщение: &quot;DISK FAILURE INSERT SYSTEM DISK AND PRESS...

Где могут быть ошибки?
#include &lt;stdio.h&gt; void main () { int a, b, c, d; printf (&quot;Enter the quality of seconds\n&quot;); scanf (&quot;%d&quot;, &amp;a); if (a&lt;60) ...

Могут ли события быть статическими
A) Да B) Нет C) Да, но только в статических классах D) Да, но только в статических методах

какие могут быть последствия?
в последнее время по результатам статистики (переходы со страниц) значится значительные переходы с orients.ru. какие могут быть последствия...

Ключи, с которыми могут быть проблемы
область - секс-шопы: интимные товары и Adult видео Вопрос такой: какие слова противопоказано включать в тайтл, кейворды, контент? ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru