Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
#1

объекты класса TREE - C++

03.11.2012, 22:12. Просмотров 759. Ответов 12
Метки нет (Все метки)

в общем, есть класс TREE с кучей переменных и несколькими методами. суть в том, что если в main() создать разные объекты данного класса любым способом, в частности например, созданием в цикле динамического объекта TREE * ps = new TREE, в конце итерации высвобождая динамическую память delete ps, или обычный массив объектов TREE obj[R] и работая с ними в цикле (или как в данный момент у меня - динамический массив объектов), то РЕЗУЛЬТАТ ОДИН во всех случаях: первый объект - нормальный, остальные - кривые. Например (не вдаваясь в подробности работы), метод int TREE::create_tree_reg() должен перед "return P" вывести cout<<"количество выпавших чисел: "<<Q<<endl; для первого всё нормально, а для второго и остальных объектов это происходит в одном случае из чёрт знает скольки. В общем, помогите, без понятия, в чём косяк (main.cpp, строка 95, писал на dev-cpp 4.9.9.2)
Вложения
Тип файла: rar tree.rar (5.0 Кб, 17 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2012, 22:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос объекты класса TREE (C++):

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса - C++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

Классы и объекты в С++, компонента класса и экземпляр класса - C++
Вариант 8. ИЗДЕЛИЕ наименование– char* шифр– char* тип упаковки– char* количество– int 1. Определить пользовательский ...

Составить описание класса "3D вектор". Объявить объекты класса и продемонстрировать работу методов - C++
Возникли сложности при решении задачи. Буду признателен тем, кто поможет. Задание: Составить описание класса. Объявить объекты класса...

Объекты класса - C++
Приветствую вас) Подскажите пожалуйста какая структура у класса и его объектов в c++bilder К примеру создание класса и 3-х...

Объекты класса. Наследование - C++
Помогите написать программу которая подсчитывает объекты класса используя наследование.

Объекты абстрактного класса - C++
Разбираю пример. В программе задается сразу 6 объектов. А нужно, чтобы количество объектов вводилось пользователем с клавиатуры. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
03.11.2012, 22:34  [ТС] #2
З.Ы. Ещё раскомментируйте там
sprintf(tmpchr, "%d", ps->P);
if (pFile1 != NULL) {fputs(tmpchr,pFile1); fputs(" ",pFile1);}

sprintf(tmpchr, "%f", ps->alpha);
if (pFile2 != NULL) {fputs(tmpchr,pFile2); fputs(" ",pFile2);}

программа вылетит на этом моменте. что не так с дозаписью в текстовый файл?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.11.2012, 21:37 #3
У вас это компилируется?
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
05.11.2012, 01:46  [ТС] #4
да. чем компилируйте?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 01:53 #5
Разным. А вы Dev-cpp?
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
05.11.2012, 01:58  [ТС] #6
dev-cpp 4.9.9.2. компилировать надо main.

Добавлено через 3 минуты
а что пишет-то?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 02:03 #7
Цитата Сообщение от Max_92 Посмотреть сообщение
компилировать надо main.
А остальное что - не надо? И в чём смысл тогда? Пишет много чего. И оно ещё у вас и работает?
Миниатюры
объекты класса TREE  
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
05.11.2012, 02:20  [ТС] #8
смысл в том, что остальные два файла просто подключаются. с main'ом они тоже компилируются. у меня ошибок, предупреждений не выдаёт. версия другая. и project.exe никакой, объектные файлы в процессе не создаются, только main.exe. не первый раз так пишу.

Добавлено через 2 минуты
не вижу если честно никаких повторных объявлений, например.

Добавлено через 5 минут
а подключается всё просто: в файле с вынесенными за класс методами делаем инклюд файла с самим классом (помимо него там ещё разные вещи могут быть, не запрещается), а в файле с функцией main инклюд methods. нажимаем, находясь на нём F9. и никаких прожектов создавать не надо.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 04:09 #9
Цитата Сообщение от Max_92 Посмотреть сообщение
не вижу если честно никаких повторных объявлений
Там не объявления, а определения повторные, из-за того, что methods.cpp подключен в main.cpp. Подключать файлы .cpp - дурной тон.

Добавлено через 3 минуты
Да. Без проекта работает.

Добавлено через 42 минуты
В куске, где запись в файл, что за указатель ps?

Добавлено через 16 минут
char* tmpchr; //временная строковая переменная
А память выделить? Потом попытка записи:
C++
1
sprintf(tmpchr, "%d", ps ->P);
Добавлено через 33 минуты
После записи в файл сразу сделайте:
C++
1
2
fflush(pFile1);
fflush(pFile2);
иначе записанные данные из буфера в файл не попадут, а закрытие файла (с очисткой буфера) произойдёт только после выхода из цикла.
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
05.11.2012, 11:19  [ТС] #10
alsav22, ps был, когда каждый раз создавался и потом удалялся динамический объект, забыл исправить. теперь там будет "obj[i]."

char * tmpchr = new char[10]. так?

а что по поводу кривости самих объектов? заметили, что нормально работает только obj1, в остальных, например, вместо нормального количества узлов функция возвращает 6-ти значное число с потолка.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 12:10 #11
Цитата Сообщение от Max_92 Посмотреть сообщение
теперь там будет "obj[i]."
&obj[i].
И это не забудьте.
Цитата Сообщение от alsav22 Посмотреть сообщение
После записи в файл сразу сделайте:
fflush(pFile1);
fflush(pFile2);
После этих исправлений запись в файл нормально работает.

Добавлено через 54 секунды
Цитата Сообщение от Max_92 Посмотреть сообщение
а что по поводу кривости самих объектов?
Для этого нужно в код вникать. Уверены, что дело в объектах, а не в функциях?

Добавлено через 5 минут
В dev-cpp при отладке можно как-то следить за значениями переменных? Среда для меня незнакомая, а в Студии, номер с такой компиляцией (без проекта) не проходит.

Добавлено через 23 минуты
У вас в трёх функциях возврат значения не при всех путях происходит: int create_tree_nereg_debug(), int create_tree_nereg(), int create_tree_reg(). Возврат там прописан в конце: else if (z > Nmax) {cout<<"количество выпавших чисел: "<<Q<<endl; return P;}, а если z <= Nmax, то вообще ничего не возвращается.
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
05.11.2012, 12:34  [ТС] #12
alsav22, там два случая: выпавшее второе по счёту число оказалось равным нулю - return 0; z стало больше Nmax (а такое рано или поздно будет, т.к. инкрементируется P на каждой итерации) - return P; дело в том что первый объект, каким бы он ни был, работает всегда нормально, а остальные при выполнении тех же самых действий - ненормально. дело в самих объектах, как мне кажется.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 22:55 #13
Цитата Сообщение от Max_92 Посмотреть сообщение
а такое рано или поздно будет
Весь вопрос в том: рано или поздно? Количество итераций в цикле for (в функциях) у вас ограничено величиной Nmax. Что будет, если за это количество итераций значение z не станет больше Nmax, но произойдёт выход из цикла for()? Тут есть кривизна кода и это, в любом случае, нужно исправить, а потом уже дальше разбираться.

Добавлено через 17 минут
Провёл несложный эксперимент. В функции create_tree_nereg() поставил точку останова перед return, а на входе в функцию сделал cout, чтобы сравнить количество заходов в функцию с количеством выходов по return. При пяти заходах в функцию - только два выхода по return.

Добавлено через 9 часов 40 минут
Цитата Сообщение от Max_92 Посмотреть сообщение
дело в том что первый объект, каким бы он ни был, работает всегда нормально
Только потому, что у вас последовательность псевдослучайных чисел всегда одинакова. Сделайте в main(): #include <ctime> и srand(time(NULL)), и увидите, что и с первым будет то правильно, то неправильно.
заметили, что нормально работает только obj1, в остальных, например, вместо нормального количества узлов функция возвращает 6-ти значное число с потолка.
Что возвращает вы не знаете. Вы видите, что выводит cout, как возвращаемое значение. Когда возврат происходи не через return, то возвращаемого значения для cout просто нет, и cout выводит мусор.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 22:55
Привет! Вот еще темы с ответами:

Указатели на объекты класса - C++
Здравствуйте. помогите новичку. есть проблема с освоением программирования на VC++. пытаюсь скомпилировать вот этот пример из книги: ...

Константные статические объекты класса. - C++
Здравствуйте. Есть класс &quot;матрица&quot; нужно задать константные матрицы такие как E - единичная матрица и т.д., как это сделать? #include...

Вектор, содержащий объекты класса - C++
Нужно определить класс, содержащий строку и значение, и создать вектор, который содержит объекты этого класса. Названия строк объектов...

ifstream, ofstream и объекты класса - C++
Доброго времени суток, помогите пожалуйста разобраться. Есть некий класс: class Tr { public: Tr(){} ~Tr(){} private:


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.11.2012, 22:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru