12 / 8 / 2
Регистрация: 14.01.2015
Сообщений: 31
|
||||||||||||||||
1 | ||||||||||||||||
2-мерные массивы: Вызов конструктора портит данные в других экземплярах11.03.2015, 01:07. Показов 605. Ответов 7
Метки нет (Все метки)
Проблема: обнаружилось, что порой пропадают числа из существующих экземпляров класса. Числа (коллективно -- строками или колонками) заменяются на большие числа 3412341232, видимо, адреса. Портятся те массивы, которые переданы в функцию, и казалось бы, не должны изменяться.
TOC -Подробности -Случай 1: вызов конструктора другого экземпляра портит исходный экземпляр, -Случай 2: внутри функции экземпляр не испорчен, сразу же после нее -- испорчен. Подробности: Создаю класс (далее nlNodeList) для работы с двумерными целочисленными массивами и посторонние функции, работающие с экземплярами класса -- например, выделение строки массива, склеивание блоков и прочие. Двумерный массив реализован через указатели. Функции принимают массивы как аргумент и возвращают объект класса.
Поодиночке каждая функция работает нормально, возращает объекты класса, содержащие ожидаемые числовые значения. Случай 1.
, после -- все числовые значения равны по умолчанию, как задается при инициализации конструктором (скажем, это 9). arg_nlA -- . Поведение программы повторяется. Случай 2.
В отличие от первого случая, от выполнения конструктора экземпляра того же класса nlResult1 на строке 6 ничего не портится. Внутри функции FunctionTwo на 8 строке также ничего не портится, arg_F выводится неизменным. Однако, по выходу из FunctionTwo она внезапно оказывается с испорченной первой строкой. До строки 9 arg_nlA -- , после -- испорчена первая строка arg_nlA -- . Поведение повторяется, хотя числа бывают разными. Затем программа вызывает APPCRASH и продолжения не следует. Вопрос: Как сохранять конкретные числа на своих местах? Как не допускать того, чтобы числовые значения, хранящиеся в экземплярах класса, сами по себе внезапно не заменялись на адреса, нули? Задание учебное по рекурсивному разложению логических выражений. Поскольку будет использована рекурсия, то без многократных вызовов функций друг из друга, последовательных вызовов функций с одним экземпляром в качестве аргумента и возврата функциями объектов класса не обойтись. Трудно внятно сформулировать проблему. В прикрепленных темах ответа не нашел. Заранее спасибо.
0
|
11.03.2015, 01:07 | |
Ответы с готовыми решениями:
7
Вызов конструктора из конструктора и проверка правильности передаваемых параметров 2-ух мерные массивы 2х мерные массивы 2-х мерные массивы |
Модератор
13508 / 10758 / 6412
Регистрация: 18.12.2011
Сообщений: 28,725
|
||||||
11.03.2015, 08:37 | 2 | |||||
Зачем писать так хитро, если можно
Нужен код целиком.
0
|
18902 / 9860 / 2410
Регистрация: 30.01.2014
Сообщений: 17,305
|
|
11.03.2015, 08:55 | 3 |
Cene-O-Ralle, конструктор копирования и оператор присваивания, где они?
А вообще да, нужен код целиком.
0
|
12 / 8 / 2
Регистрация: 14.01.2015
Сообщений: 31
|
|||||||||||
11.03.2015, 13:28 [ТС] | 4 | ||||||||||
Всего: myprj.cpp, myprj.hpp, part1.txt.
* Код главного файла myprj.cpp: Кликните здесь для просмотра всего текста
Добавлено через 3 минуты * Код myprj.hpp Кликните здесь для просмотра всего текста
0
|
12 / 8 / 2
Регистрация: 14.01.2015
Сообщений: 31
|
|||||||||||
11.03.2015, 13:34 [ТС] | 5 | ||||||||||
Продолжение
Кликните здесь для просмотра всего текста
Чтение идет из текстового файла part1.txt, в котором: первая строка = число переменных (будет использовано как listWidth - ширина массива), вторая строка = число последущих строк (будет listLength - длина массива), первые цифры в каждой строке = число непустых элементов в этой строке. Числа дают индексы непустых переменных. , , Кликните здесь для просмотра всего текста
Копия во вложении.
0
|
Модератор
13508 / 10758 / 6412
Регистрация: 18.12.2011
Сообщений: 28,725
|
||||||
11.03.2015, 14:37 | 6 | |||||
После исправления ошибок компиляции у меня программа слетает на строке
0
|
18902 / 9860 / 2410
Регистрация: 30.01.2014
Сообщений: 17,305
|
|||||||||||
11.03.2015, 16:31 | 7 | ||||||||||
Cene-O-Ralle, в целом, как я и говорил, необходимо добавить классу конструктор копирования и оператор присваивания. Ты ими в программе активно пользуешься, но при это не определил. А оператор и конструктор, сгенерированные компилятором по умолчанию, не в курсе про то, как правильно копировать твой объект класса nlNodeList. Поэтому выполняется простое почленное копирование, что в итоге означает разделение владение ресурса между разными объектами, попытка двойного освобождения памяти и многие другие неприятности.
Кликните здесь для просмотра всего текста
Идея с индексами с единицы - крайне неудачная. По крайней мере такая реализация. Можно было бы инкапсулировать это поведение с помощью методов nlWrite и nlRead, а в остальных местах программы не делать постоянные +1. Добавлено через 6 минут Еще есть ошибка в функции ANDBlockAndLine.
0
|
12 / 8 / 2
Регистрация: 14.01.2015
Сообщений: 31
|
|
21.03.2015, 18:51 [ТС] | 8 |
Спасибо за помощь.
Исправил, но APPCRASH не побежден. Не до конца понимаю: откуда компилятору становится нужен конструктор копирования и оператор присваивания, если я их не вызывал и пользовался числ. значениями в суррогатном копировании CloneNodeList ? -- или же содержимое объекта nlNodeList arg_nlA в нем передавалось как указатели по непониманию?
0
|
21.03.2015, 18:51 | |
21.03.2015, 18:51 | |
Помогаю со студенческими работами здесь
8
Вызов конструктора из конструктора - ошибка Одномерный и двух мерные массивы Строки,процедуры,записи,массивы 1,2 мерные 1- и 2-мерные массивы. Описание полей и переменных. Как сортируются двух и более мерные массивы? В разных экземплярах класса одинаковые данные Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |