mashakovmarat | Дата: Пятница, 27.12.2019, 18:39 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 36
Статус: Offline
| Здравствуйте.
Столкнулся с интересной аномалией. Есть, скажем так, основной большой массив А, каждый элемент которого представляет собой тип ТА, поля которого: 1) Ulong; 2) Простой тип ТБ с двумя полями Ubyte; 3) Массив Б простого типа ТБ, размер которого определяется однажды. Разумеется, длина этого внутреннего массива Б одинакова для всех элементов массива А.
Размер большого массива А определяю сразу в начале программы; его элементы наполняю данными по мере выполнения программы (индекс подрастает, начиная с 0).
Внимание вопрос ))
В основном приходится копировать данные из более ранних записей с переопределением отдельных полей для данной итерации. И вот при таком копировании, например запись А(123, Б(2)) в "новую" запись А(176, Б(2)), если длина внутреннего массива Б превышает 8 элементов (от 0 до 7), одновременно меняются записи внутреннего массива Б с индексом +8 к текущей, как будто я заношу одно и тоже копируемое значение и в Б(0), и в Б(8), и в Б(16), и т.д. с шагом +8. Причем весьма странно, что такое же самовоспроизведение с индексами +8 к копируемой записи происходит и в записи-источнике А(123, Б(2)), т.е. весь массив Б в ней тоже начинает самокопироваться с периодом 8 шагом. Таким образом, я заношу значение А(123, Б(2)) в А(176, Б(2)) и тут же одновременно получаю копирование и в А(176, Б(10)), и в А(176, Б(18)), и т.д. И то же самое в А(123, Б(10)), и А(123, Б(18)), и т.д.
Если просто читать данные из записи А(123,Б(2)), не занося ничего в А(176, Б(2)), то все, как бы норм. Но стоит занести любое значение в запись 176, это меняет все описанным выше способом.
Пробовал использовать "транзитные" переменные для передачи данных из записи в запись, не сработало. Пробовал ради интереса пускать цикл наоборот от большего к меньшему, не помогло.
Каждую итерацию вывожу кучу данных на экран вкупе со Sleep и всю эту ерунду вижу.
Напомню, и мне кажется это важным, что массив Б - это массив моего типа ТБ, и массив А - тоже массив моего типа ТА. Очевидным решением кажется уйти от собственного типа ТБ массива Б, и вместо него завести два вложенных одномерных массива Ubyte размер которых также будет определятся один раз в начале программы. Либо еще очевидней рабочее решение разбить большой массив А на несколько одномерных, вообще отказавшись от создания своего типа ТА записи.
Просто работать с собственными типами очень уж удобно и наглядней.
Кто-нибудь сталкивался с подобным?
У меня Линукс.Добавлено (27.12.2019, 19:35) --------------------------------------------- В общем, отказался от применения типов, разбил тип ТА на отдельные одномерные массивы. Внутренний массив Б типа ТБ тоже вынес в два отдельных двумерных массива. Все работает как надо. Вот такая "курская аномалия" с применением типов в многомерных массивах. Во всяком случае, надо будет отдельно к этому вопросу вернуться. Похоже на баг.
Сообщение отредактировал mashakovmarat - Пятница, 27.12.2019, 18:45 |
|
| |
haav | Дата: Пятница, 27.12.2019, 21:02 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Цитата mashakovmarat ( ) Во всяком случае, надо будет отдельно к этому вопросу вернуться. Похоже на баг. Было бы интересно посмотреть на этот баг в минимально-возможном коде.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
mashakovmarat | Дата: Пятница, 27.12.2019, 21:32 | Сообщение # 3 |
Сержант
Группа: Пользователи
Сообщений: 36
Статус: Offline
| Подготовлю рабочую выжимку. В ближайшее время постараюсь выложить.
|
|
| |