Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Не работает программма, вроде бы все правильно |
Автор: ctpz 20.1.2012, 18:42 | ||
Задача программы вычислять площадь 3d объекта, созданного из треугольников. По какой-то причине программа доходит только до получения информации о точке х. Дальше дело не идет. Отладчик и компилятор ошибок не выдает. Среда разработки: Dev-cpp. Компилятор: G++
|
Автор: feodorv 20.1.2012, 19:01 |
Честно говоря, не разбирался, но первое, что бросилось в глаза, это странное условие: Как будто координаты не могут принимать нулевого значения! У Вас есть счётчик числа вершин i, пользуйтесь им ;) |
Автор: Albor 20.1.2012, 19:01 |
Обращение (x[i]) к пустому вектору. |
Автор: ctpz 20.1.2012, 19:09 | ||
Мне надо, чтобы максимально допустимая координата не являлась пустой. |
Автор: ctpz 20.1.2012, 22:26 | ||||
1. Но будет как-то странно, если будет куча точек (0,0,0) 2. Что такое insert |
Автор: feodorv 21.1.2012, 05:37 |
Достаточно одной! У Вас в векторе нет памяти для x[0] (аналогично y[0], z[0], x[1], ...), совсем нет. Её либо нужно заказать, либо воспользоваться методом insert. http://www.cplusplus.com/reference/stl/vector/ ![]() |
Автор: Result 21.1.2012, 09:12 | ||
Если просто "заказать" памяти и писать в нее, будет ли вектор знать про свой состав ? К примеру if(!vect.empty()), будет работать как ожидается ? |
Автор: Albor 21.1.2012, 10:35 | ||
Безусловно, контролировать количество валидных данных в векторе должен "хозяин" кода. Что касается данной задачи, то, как вариант, можно было создать минимальный вектор координат с количеством элементов равным трём (один треугольник), а ещё лучше использовать метод push_back(), тогда значение возвращённое методом size() будет определять количество правильных данных. |
Автор: feodorv 21.1.2012, 14:19 | ||
Нет, конечно не будет. И вообще я погорячился с заказам памяти, потому что если потом делать перезаказ этой самой памяти (под бОльший объём данных), никто не будет копировать старые данные (а они в векторе не будут числиться существующими) в новую область памяти. Поэтому лучше всего (и корректней всего) пользоваться доступными методами класса vector. И да, vect.empty() (или соответсвующий итератор) значительно лучше чем или ![]() И было бы недурно ввести какой-нибудь класс типа triangle, который описывал бы треугольник сразу (и для задания которого нужно было бы ввести сразу 9 координат трёх его вершин).... |
Автор: Result 21.1.2012, 14:25 |
а нормальная работа проги и не дойдет до распределения памяти (только если явно не ресольвить) ибо n-ый push_back потрет нелегала. |