FreeBasic
Главная
Вход
Регистрация
Четверг, 25.04.2024, 01:07Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Странное поведение счетчика массива (Странное поведение счетчика массива)
Странное поведение счетчика массива
mashakovmaratДата: Пятница, 27.12.2019, 18:39 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 36
Репутация: 0
Статус: 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
Репутация: 49
Статус: Offline
Цитата mashakovmarat ()
Во всяком случае, надо будет отдельно к этому вопросу вернуться. Похоже на баг.

Было бы интересно посмотреть на этот баг в минимально-возможном коде.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
mashakovmaratДата: Пятница, 27.12.2019, 21:32 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 36
Репутация: 0
Статус: Offline
Подготовлю рабочую выжимку. В ближайшее время постараюсь выложить.
 
Форум » Freebasic » Вопросы по языку FreeBasic » Странное поведение счетчика массива (Странное поведение счетчика массива)
  • Страница 1 из 1
  • 1
Поиск: