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

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

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

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

03.11.2012, 22:12. Просмотров 697. Ответов 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 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
03.11.2012, 22:34  [ТС]     объекты класса TREE #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
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.11.2012, 21:37     объекты класса TREE #3
У вас это компилируется?
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
05.11.2012, 01:46  [ТС]     объекты класса TREE #4
да. чем компилируйте?
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 01:53     объекты класса TREE #5
Разным. А вы Dev-cpp?
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
05.11.2012, 01:58  [ТС]     объекты класса TREE #6
dev-cpp 4.9.9.2. компилировать надо main.

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

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

Добавлено через 5 минут
а подключается всё просто: в файле с вынесенными за класс методами делаем инклюд файла с самим классом (помимо него там ещё разные вещи могут быть, не запрещается), а в файле с функцией main инклюд methods. нажимаем, находясь на нём F9. и никаких прожектов создавать не надо.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 04:09     объекты класса TREE #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  [ТС]     объекты класса TREE #10
alsav22, ps был, когда каждый раз создавался и потом удалялся динамический объект, забыл исправить. теперь там будет "obj[i]."

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

а что по поводу кривости самих объектов? заметили, что нормально работает только obj1, в остальных, например, вместо нормального количества узлов функция возвращает 6-ти значное число с потолка.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 12:10     объекты класса TREE #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  [ТС]     объекты класса TREE #12
alsav22, там два случая: выпавшее второе по счёту число оказалось равным нулю - return 0; z стало больше Nmax (а такое рано или поздно будет, т.к. инкрементируется P на каждой итерации) - return P; дело в том что первый объект, каким бы он ни был, работает всегда нормально, а остальные при выполнении тех же самых действий - ненормально. дело в самих объектах, как мне кажется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 22:55     объекты класса TREE
Еще ссылки по теме:

Составить описание класса "3D вектор". Объявить объекты класса и продемонстрировать работу методов C++
Объекты абстрактного класса C++
C++ Классы и объекты в С++, компонента класса и экземпляр класса
C++ Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса
C++ Vector ссылок на объекты класса

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

Или воспользуйтесь поиском по форуму:
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.11.2012, 22:55     объекты класса TREE #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 выводит мусор.
Yandex
Объявления
05.11.2012, 22:55     объекты класса TREE
Ответ Создать тему
Опции темы

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