Russian Qt Forum
Май 04, 2024, 02:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 4 5 [6] 7   Вниз
  Печать  
Автор Тема: Создание массива вершин фигуры с помощью редактора  (Прочитано 41057 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #75 : Апрель 12, 2014, 07:28 »

Old, это какой-то паттерн?
Вы про что сейчас спрашивает? Улыбающийся

И зачем вам xml? Что бы файл больше места занимал и дольше парсился? Улыбающийся
Записан
8Observer8
Гость
« Ответ #76 : Апрель 12, 2014, 08:23 »

Я про Ваш Ответ #73. Я так понимаю, что это не имеет отношения к какому-либо паттерну, раз Вы переспросили.

С XML было бы легче работать. Но ведь есть же экспортёры в XML? Значит для чего-то люди их используют?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #77 : Апрель 12, 2014, 08:28 »

Я про Ваш Ответ #73. Я так понимаю, что это не имеет отношения к какому-либо паттерну, раз Вы переспросили.
Вы про мысли о ОО-парсере? Это стандартный ОО-подход, когда вначале нужно выбрать сущности, которые участвуют в процессе.

С XML было бы легче работать. Но ведь есть же экспортёры в XML? Значит для чего-то люди их используют?
Можно то можно, хотя я не вижу, что это облегчит.
Записан
8Observer8
Гость
« Ответ #78 : Апрель 12, 2014, 08:34 »

Может экспорт в XML служит для каких-то специфических целей? Хотя тот факт, что этот экспортёр надо отдельно устанавливать говорит о том, что используется он очень редко.
Записан
Hrundel
Гость
« Ответ #79 : Апрель 12, 2014, 12:25 »

Из того, что сплит для Вас прост и удобен, ещё не следует, что он в этой задаче - оптимальное решение.. И, кстатии, ошибок в работе своего молотка я тоже пока не замечал, но это не значит, что его нужно использовать для решения проблем, которые под руку попадутся..)  

По ходу ваша обсессивная компульсивность меня начала раздражать. Думаю, что деструктивность - цель ваших сообщений. Я так понимаю, комплекс вашей неполноценности толкает вас к тому, чтобы самоутверждаться за чужой счет. Одобрение вам не известно, так как вас никто и никогда не одобраял, потому вы не умеете одобрять и поддерживать. Вы пытаетесь умышленно придераться к словам, или в просторечье - троллить. Вы жалки.

По-поводу процедурного стиля.. Наверное правильнее было сказать - процедурный подход решения проблемы..
Достаточно взглянуть на метод parseLine..
Я понимаю, конечно, что формат obj Вам упрощает задачу, и число этих if else if else по пальцам пересчитать, но что если чуть усложнить формат.. Вас бы не смутило, что этих if else if else стало бы стопятьсот? И всё это в одном методе..

Намекаете, что я о существовании switch не знаю? А вы еще и наглый.

Потом этот парсер выкинет вам исключение out of range, если чуть подпортить obj файл.. И пользователь вашего парсера не сможет его адекватно обработать.. Он даже не будет в курсе что произошло.. и как с этим дальше жить(
Но Вас, конечно, такие мелочи не беспокоят.. работает и ладно..

Вот, и именно, меня в данном коде такие мелочи не беспокоят. На универсальность он не претендует.

Итак, когда же мы увидем ваше бессмертное, не процедурное творение?
Да мы его и не увидем! Потому, что к вашей обсессивной компульсивности скорее всего еще примешивается параноидальная депрессия. Вы трус, который боится чужой критики и троль. Все ваши последующие сообщения в форуме будут мной проигнорированы. Я всегда призерал таких людей как вы.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #80 : Апрель 12, 2014, 13:06 »

Прелееестно) Посмеялся от души)  /* заскринел для истории */

Простите меня Hrundel, не предполагал, что Вы так ранимы(

 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #81 : Апрель 13, 2014, 13:01 »

По ходу ваша обсессивная компульсивность меня начала раздражать.
Да, неприятно когда некто "морщит носик" (с видом знатока), но ничего не предлагает взамен. Но все-таки надо сдержаться и свое раздражение оставить при себе.

А вообще критика "та еще". Вот напр
Да, здесь он "промахнулся", он должен был использовать QVector, т.к вы везде используете QVector. простите его, он просто этого не знал. Улыбающийся
Откуда QVector - хз  Непонимающий Я его не юзал и сказать такого не мог Улыбающийся Ладно, залупнулся паренек, прихвастнул. Ну а по делу-то что? Как он собирался хранить массив индексов? И потом - "только треугольники" это упрощение позволительное студенту, но никак не профи. Полигон может ссылаться на любое число вертексов. Как хранить данные в этом случае?

Это все вещи на уровне "общей культуры программирования" - как организовать/поставить базовые данные. На пулеметы (нурбсы, триангуляция, материал и др) никто не посылал, мы же не звери. Но почему-то я уверен - даже для простых базовых задач никаких предложений не последует  Плачущий Хотя почему бы не проверить еще раз, мне это ничего не стоит
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #82 : Апрель 13, 2014, 14:36 »

Да, неприятно когда некто "морщит носик" (с видом знатока), но ничего не предлагает взамен.
Не переживайте, к этой вашей черте уже все привыкли. Улыбающийся

А вообще критика "та еще". Вот напр
Фух, ну слава Богу, и я вам про это. Улыбающийся

Я же и говорю, для чего было писать эту фигню:
Да еще контейнеры подобраны - полный ппц. Потому что голова занята не делом а "всякой всячиной"

Ладно, залупнулся паренек, прихвастнул. Ну а по делу-то что?
Да ничего он не хвастал. Он выбрал нормальный контейнер для этой задачи - QList.

Как он собирался хранить массив индексов?
Да он не собрался, он их спокойно хранит в этом QList. Улыбающийся

И потом - "только треугольники" это упрощение позволительное студенту, но никак не профи.
У вас прямо глаза сегодня открылись. Улыбающийся
Правильно, он и есть студент, он учится. Он еще понятия не имеет куда что и почем. Улыбающийся

Полигон может ссылаться на любое число вертексов. Как хранить данные в этом случае?
А вот он столкнется и задумается. И запомнит на всю жизнь, как это делать лучше.

Это все вещи на уровне "общей культуры программирования" - как организовать/поставить базовые данные.
Конечно, и он эту культура начинает осваивать. Только сейчас начинает. А вы от него, что то требуете и называете халтурщиком. Улыбающийся

На пулеметы (нурбсы, триангуляция, материал и др) никто не посылал, мы же не звери.
А никого никуда посылать и не надо. Как только ему это понадобиться, тогда он начнет этим интересоваться.

Но почему-то я уверен - даже для простых базовых задач никаких предложений не последует  Плачущий
О каких предложениях вы говорите?

Хотя почему бы не проверить еще раз, мне это ничего не стоит
Вам ничего не стоит проверить?

Последний абзац - вы как-то ушли в себя. Улыбающийся
« Последнее редактирование: Апрель 13, 2014, 17:46 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #83 : Апрель 14, 2014, 12:36 »

Он выбрал нормальный контейнер для этой задачи - QList.
...
Да он не собрался, он их спокойно хранит в этом QList. Улыбающийся
Что Вы скажете об инженере который вот просто так, без раздумий, увеличил расход памяти для базовых данных более чем в 3 раза? Может он добился этим др выгод? Наоборот, он не может даже подать их для рисования напрямую.

И куда же девается вся Ваша "грамотность", тонны прочитанных книг при первом самостоятельном решении? Это есть хотя бы у Александреску
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #84 : Апрель 14, 2014, 12:42 »

Что Вы скажете об инженере который вот просто так, без раздумий, увеличил расход памяти для базовых данных более чем в 3 раза?
То же что и вам, что он "профессионал". Улыбающийся
А 8Observer8 ничего не скажу, потому что он не инженер, он только учиться. Этот контейнер вполне подходит для решения той задачи, которую он сейчас решает.

И куда же девается вся Ваша "грамотность", тонны прочитанных книг при первом самостоятельном решении?
У меня "грамотность" уменьшается постоянно, я стараюсь учиться и изучать все новое.
А вот ваша "грамотность" растет день ото дня, вместе с комплексами "большого специалиста". Улыбающийся
Записан
OKTA
Гость
« Ответ #85 : Апрель 14, 2014, 12:56 »

А как пишут инженеры в циклах? ++i или i++?  Смеющийся
Записан
8Observer8
Гость
« Ответ #86 : Апрель 19, 2014, 18:36 »

Улучшил немного свой парсер. Прототип:
Код
C++ (Qt)
   void parseData( const QString &input, QList<QVector3D> &points, QList<QVector3D> &indexes )
   throw(EmptyInput, BadLine);
 

Теперь он выбрасывает исключения:
- EmptyInput - если на входе пустая строка
Тогда пользователь увидит на экране:
"Input argument is empty."

- BadLine - если в строке некорректные данные. Причем пользователю выводится сама строка и номер строки в файле. К примеру, пользователь открыл файл .obj и случайно изменил какую-либо из строк:

Пользователь испортил строку с координатой x:
"v 1.000w000 1.000001 -0.999999"

Тогда пользователь увидит:
Error string "v 1.000w000 1.000001 -0.999999" at line 3

Либо случайно изменил строку с индексами:
f 1w 2 4

Тогда пользователь увидит:
Error string "f 1w 2 4" at line 12

Либо случайно удалил одну из координат:
"v -0.999999 -1.000001"

Тогда пользователь увидит:
Error string "v -0.999999 -1.000001" at line 4

Либо удалил один из индексов, то есть вместо:
"f 5 8 6"
Получилось так:
"f 8 6"

Тогда пользователь увидит:
Error string "f 8 6" at line 13

Задокументировал с помощью тестов срабатывание всех исключений выше:
Код
C++ (Qt)
#include <QString>
#include <QtTest>
#include "Parser.h"
#include <QVector3D>
#include "EmptyInput.h"
#include "BadLine.h"
 
enum ExceptionType {
   noException,
   emptyInput,
   badLine
};
 
class CubeFromBlenderTests : public QObject {
   Q_OBJECT
 
public:
   CubeFromBlenderTests( );
 
   static inline bool qFuzzyCompare( double p1, double p2, double delta ) {
       return ( qAbs( p1 - p2 ) <= delta * qMin( qAbs( p1 ), qAbs( p2 ) ));
   }
 
   private
Q_SLOTS:
   // Right result
   void testCase1_data( );
   void testCase1( );
 
   // Input string is empty
   void testCase2_data( );
   void testCase2( );
};
 
CubeFromBlenderTests::CubeFromBlenderTests( ) {
}
 
void CubeFromBlenderTests::testCase1_data( ) {
   QTest::addColumn<QString>("input");
   QTest::addColumn<QList<QVector3D> >("expected_points");
   QTest::addColumn<QList<QVector3D> >("expected_indexes");
   QTest::addColumn<bool>("isExpectedException");
 
   bool exception = true;
   bool no_exception = false;
 
   QString input = QString( "# Blender v2.68 (sub 0) OBJ File: ''\n"
           "# www.blender.org\n"
           "o Cube\n"
           "v 1.000000 1.000001 -0.999999\n"
           "v 1.000000 -0.999999 -1.000001\n"
           "v -1.000000 -0.999999 -1.000001\n"
           "v -1.000000 1.000001 -0.999999\n"
           "v 1.000000 0.999999 1.000001\n"
           "v 0.999999 -1.000001 0.999999\n"
           "v -1.000000 -1.000000 0.999999\n"
           "v -1.000000 0.999999 1.000001\n"
           "s off\n"
           "f 1 2 4\n"
           "f 5 8 6\n"
           "f 1 5 2\n"
           "f 2 6 3\n"
           "f 3 7 4\n"
           "f 5 1 8\n"
           "f 2 3 4\n"
           "f 8 7 6\n"
           "f 5 6 2\n"
           "f 6 7 3\n"
           "f 7 8 4\n"
           "f 1 4 8\n" );
   QList<QVector3D> expected_points;
   QVector3D point;
 
   // 1
   point.setX( 1.000000 );
   point.setY( 1.000001 );
   point.setZ( -0.999999 );
   expected_points.append( point );
 
   // 2
   point.setX( 1.000000 );
   point.setY( -0.999999 );
   point.setZ( -1.000001 );
   expected_points.append( point );
 
   // 3
   point.setX( -1.000000 );
   point.setY( -0.999999 );
   point.setZ( -1.000001 );
   expected_points.append( point );
 
   // 4
   point.setX( -1.000000 );
   point.setY( 1.000001 );
   point.setZ( -0.999999 );
   expected_points.append( point );
 
   // 5
   point.setX( 1.000000 );
   point.setY( 0.999999 );
   point.setZ( 1.000001 );
   expected_points.append( point );
 
   // 6
   point.setX( 0.999999 );
   point.setY( -1.000001 );
   point.setZ( 0.999999 );
   expected_points.append( point );
 
   // 7
   point.setX( -1.000000 );
   point.setY( -1.000000 );
   point.setZ( 0.999999 );
   expected_points.append( point );
 
   // 8
   point.setX( -1.000000 );
   point.setY( 0.999999 );
   point.setZ( 1.000001 );
   expected_points.append( point );
 
   QList<QVector3D> expected_indexes;
   QVector3D indexes;
 
   // 1
   indexes.setX( 1.0 );
   indexes.setY( 2.0 );
   indexes.setZ( 4.0 );
   expected_indexes.append( indexes );
 
   // 2
   indexes.setX( 5.0 );
   indexes.setY( 8.0 );
   indexes.setZ( 6.0 );
   expected_indexes.append( indexes );
 
   // 3
   indexes.setX( 1.0 );
   indexes.setY( 5.0 );
   indexes.setZ( 2.0 );
   expected_indexes.append( indexes );
 
   // 4
   indexes.setX( 2.0 );
   indexes.setY( 6.0 );
   indexes.setZ( 3.0 );
   expected_indexes.append( indexes );
 
   // 5
   indexes.setX( 3.0 );
   indexes.setY( 7.0 );
   indexes.setZ( 4.0 );
   expected_indexes.append( indexes );
 
   // 6
   indexes.setX( 5.0 );
   indexes.setY( 1.0 );
   indexes.setZ( 8.0 );
   expected_indexes.append( indexes );
 
   // 7
   indexes.setX( 2.0 );
   indexes.setY( 3.0 );
   indexes.setZ( 4.0 );
   expected_indexes.append( indexes );
 
   // 8
   indexes.setX( 8.0 );
   indexes.setY( 7.0 );
   indexes.setZ( 6.0 );
   expected_indexes.append( indexes );
 
   // 9
   indexes.setX( 5.0 );
   indexes.setY( 6.0 );
   indexes.setZ( 2.0 );
   expected_indexes.append( indexes );
 
   // 10
   indexes.setX( 6.0 );
   indexes.setY( 7.0 );
   indexes.setZ( 3.0 );
   expected_indexes.append( indexes );
 
   // 11
   indexes.setX( 7.0 );
   indexes.setY( 8.0 );
   indexes.setZ( 4.0 );
   expected_indexes.append( indexes );
 
   // 12
   indexes.setX( 1.0 );
   indexes.setY( 4.0 );
   indexes.setZ( 8.0 );
   expected_indexes.append( indexes );
 
   QTest::newRow( "parseData_01" ) << input << expected_points << expected_indexes << no_exception;
}
 
void CubeFromBlenderTests::testCase1( ) {
   QFETCH( QString, input );
   QFETCH( QList<QVector3D>, expected_points );
   QFETCH( QList<QVector3D>, expected_indexes );
   QFETCH( bool, isExpectedException );
 
   Parser parser;
   QList<QVector3D> points;
   QList<QVector3D> indexes;
 
   try {
       parser.parseData( input, points, indexes );
   } catch ( const LogicError& e ) {
       QVERIFY2( false, "Exception was occur." );
   } catch ( ... ) {
       QVERIFY2( false, "Uncaught exception." );
   }
 
   double delta = 0.0001;
   bool result = false;
   QString msg;
 
   // Check size of points and indexes
   QCOMPARE( points.size( ), expected_points.size( ) );
   QCOMPARE( indexes.size( ), expected_indexes.size( ) );
 
   // Check points
   for ( std::size_t i = 0; i < points.size( ); ++i ) {
       // Check x
       result = qFuzzyCompare( points[i].x( ), expected_points[i].x( ), delta );
       msg = QString( "\nActual: %1"
               "\nExpected: %2"
               "\nDelta: %3" ).arg( points[i].x( ) ).arg( expected_points[i].x( ) ).arg( delta );
       QVERIFY2( result, msg.toStdString( ).c_str( ) );
 
       // Check y
       result = qFuzzyCompare( points[i].y( ), expected_points[i].y( ), delta );
       msg = QString( "\nActual: %1"
               "\nExpected: %2"
               "\nDelta: %3" ).arg( points[i].y( ) ).arg( expected_points[i].y( ) ).arg( delta );
       QVERIFY2( result, msg.toStdString( ).c_str( ) );
 
       // Check z
       result = qFuzzyCompare( points[i].z( ), expected_points[i].z( ), delta );
       msg = QString( "\nActual: %1"
               "\nExpected: %2"
               "\nDelta: %3" ).arg( points[i].z( ) ).arg( expected_points[i].z( ) ).arg( delta );
       QVERIFY2( result, msg.toStdString( ).c_str( ) );
   }
 
   // Check indexes
   int actualIndex = 0;
   int expectedIndex = 0;
   for ( std::size_t i = 0; i < indexes.size( ); ++i ) {
       // 1
       actualIndex = (int) indexes[i].x( );
       expectedIndex = (int) indexes[i].x( );
       QCOMPARE( actualIndex, expectedIndex );
 
       // 2
       actualIndex = (int) indexes[i].y( );
       expectedIndex = (int) indexes[i].y( );
       QCOMPARE( actualIndex, expectedIndex );
 
       // 3
       actualIndex = (int) indexes[i].z( );
       expectedIndex = (int) indexes[i].z( );
       QCOMPARE( actualIndex, expectedIndex );
   }
}
 
void CubeFromBlenderTests::testCase2_data( ) {
   QTest::addColumn<QString>("input");
   QTest::addColumn<QList<QVector3D> >("expected_points");
   QTest::addColumn<QList<QVector3D> >("expected_indexes");
   QTest::addColumn<int>("exceptionType");
 
   QString input = QString( "" );
   QList<QVector3D> expected_points;
   QList<QVector3D> expected_indexes;
   ExceptionType exceptionType;
 
   exceptionType = emptyInput;
   QTest::newRow( "Empty input" ) << input << expected_points << expected_indexes << (int) exceptionType;
 
   input = QString( "# Blender v2.68 (sub 0) OBJ File: ''\n"
           "# www.blender.org\n"
           "o Cube\n"
           "v 1.000w000 1.000001 -0.999999\n"
           "v 1.000000 -0.999999 -1.000001\n"
           "v -1.000000 -0.999999 -1.000001\n"
           "v -1.000000 1.000001 -0.999999\n"
           "v 1.000000 0.999999 1.000001\n"
           "v 0.999999 -1.000001 0.999999\n"
           "v -1.000000 -1.000000 0.999999\n"
           "v -1.000000 0.999999 1.000001\n"
           "s off\n"
           "f 1 2 4\n"
           "f 5 8 6\n"
           "f 1 5 2\n"
           "f 2 6 3\n"
           "f 3 7 4\n"
           "f 5 1 8\n"
           "f 2 3 4\n"
           "f 8 7 6\n"
           "f 5 6 2\n"
           "f 6 7 3\n"
           "f 7 8 4\n"
           "f 1 4 8\n" );
   exceptionType = badLine;
   QTest::newRow( "Bad vertex" ) << input << expected_points << expected_indexes << (int) exceptionType;
 
   input = QString( "# Blender v2.68 (sub 0) OBJ File: ''\n"
               "# www.blender.org\n"
               "o Cube\n"
               "v 1.000000 1.000001 -0.999999\n"
               "v 1.000000 -0.999999 -1.000001\n"
               "v -1.000000 -0.999999 -1.000001\n"
               "v -1.000000 1.000001 -0.999999\n"
               "v 1.000000 0.999999 1.000001\n"
               "v 0.999999 -1.000001 0.999999\n"
               "v -1.000000 -1.000000 0.999999\n"
               "v -1.000000 0.999999 1.000001\n"
               "s off\n"
               "f 1w 2 4\n"
               "f 5 8 6\n"
               "f 1 5 2\n"
               "f 2 6 3\n"
               "f 3 7 4\n"
               "f 5 1 8\n"
               "f 2 3 4\n"
               "f 8 7 6\n"
               "f 5 6 2\n"
               "f 6 7 3\n"
               "f 7 8 4\n"
               "f 1 4 8\n" );
   exceptionType = badLine;
   QTest::newRow( "Bad index" ) << input << expected_points << expected_indexes << (int) exceptionType;
 
   input = QString( "# Blender v2.68 (sub 0) OBJ File: ''\n"
               "# www.blender.org\n"
               "o Cube\n"
               "v 1.000000 1.000001 -0.999999\n"
               "v -0.999999 -1.000001\n"
               "v -1.000000 -0.999999 -1.000001\n"
               "v -1.000000 1.000001 -0.999999\n"
               "v 1.000000 0.999999 1.000001\n"
               "v 0.999999 -1.000001 0.999999\n"
               "v -1.000000 -1.000000 0.999999\n"
               "v -1.000000 0.999999 1.000001\n"
               "s off\n"
               "f 1 2 4\n"
               "f 5 8 6\n"
               "f 1 5 2\n"
               "f 2 6 3\n"
               "f 3 7 4\n"
               "f 5 1 8\n"
               "f 2 3 4\n"
               "f 8 7 6\n"
               "f 5 6 2\n"
               "f 6 7 3\n"
               "f 7 8 4\n"
               "f 1 4 8\n" );
   exceptionType = badLine;
   QTest::newRow( "Deleted vertex" ) << input << expected_points << expected_indexes << (int) exceptionType;
 
   input = QString( "# Blender v2.68 (sub 0) OBJ File: ''\n"
               "# www.blender.org\n"
               "o Cube\n"
               "v 1.000000 1.000001 -0.999999\n"
               "v 1.000000 -0.999999 -1.000001\n"
               "v -1.000000 -0.999999 -1.000001\n"
               "v -1.000000 1.000001 -0.999999\n"
               "v 1.000000 0.999999 1.000001\n"
               "v 0.999999 -1.000001 0.999999\n"
               "v -1.000000 -1.000000 0.999999\n"
               "v -1.000000 0.999999 1.000001\n"
               "s off\n"
               "f 1 2 4\n"
               "f 8 6\n"
               "f 1 5 2\n"
               "f 2 6 3\n"
               "f 3 7 4\n"
               "f 5 1 8\n"
               "f 2 3 4\n"
               "f 8 7 6\n"
               "f 5 6 2\n"
               "f 6 7 3\n"
               "f 7 8 4\n"
               "f 1 4 8\n" );
   exceptionType = badLine;
   QTest::newRow( "Deleted index" ) << input << expected_points << expected_indexes << (int) exceptionType;
}
 
void CubeFromBlenderTests::testCase2( ) {
   QFETCH( QString, input );
   QFETCH( QList<QVector3D>, expected_points );
   QFETCH( QList<QVector3D>, expected_indexes );
   QFETCH( int, exceptionType );
 
   Parser parser;
   QList<QVector3D> points;
   QList<QVector3D> indexes;
 
   try {
       parser.parseData( input, points, indexes );
       if (exceptionType != noException) {
           QVERIFY2( false, "There is no exception." );
       } else {
           QVERIFY2( true, "" );
       }
   } catch ( const LogicError& e ) {
       switch( exceptionType ) {
       case noException:
           QVERIFY2( false, "Exception was occur." );
           break;
       case emptyInput:
           if ( std::string("Input argument is empty.") == std::string( e.what() ) ) {
               QVERIFY2( true, "" );
           } else {
               QVERIFY2( false, "We expecte EmptyInput exception." );
           }
           break;
       case badLine:
           if ( std::string("Error string \"v 1.000w000 1.000001 -0.999999\" at line 3") == std::string( e.what() ) ||
                std::string("Error string \"f 1w 2 4\" at line 12") == std::string( e.what() ) ||
                std::string("Error string \"v -0.999999 -1.000001\" at line 4") == std::string( e.what() ) ||
                std::string("Error string \"f 8 6\" at line 13") == std::string( e.what() ) ) {
               QVERIFY2( true, "" );
           } else {
               QVERIFY2( false, "We expecte BadLine exception." );
           }
           break;
       default:
           QVERIFY2( false, "We don't expecte this exception." );
           break;
       }
   } catch ( ... ) {
       QVERIFY2( false, "Uncaught exception." );
   }
}
 
QTEST_APPLESS_MAIN( CubeFromBlenderTests )
 
#include "tst_CubeFromBlenderTests.moc"
 

Так пользователь вызывает парсер:
Код
C++ (Qt)
   QList<QVector3D> points;
   QList<QVector3D> indexes;
   Parser parser;
 
   try {
       parser.parseData( all, points, indexes );
   } catch ( const LogicError &e ) {
       QMessageBox::information( this, tr( "Information" ), QString::fromUtf8( e.what() ) );
       return;
   } catch ( ... ) {
       QMessageBox::information( this, tr( "Information" ), tr( "Uncaught exception." ) );
       return;
   }
 

Вот классы исключений EmptyInput и BadLine:
EmptyInput.h
Код
C++ (Qt)
#ifndef EMPTYINPUT_H
#define EMPTYINPUT_H
 
#include "LogicError.h"
 
class EmptyInput : public LogicError {
public:
 
   EmptyInput( std::string argument ) : LogicError( argument ) {
       m_message = "Input argument is empty.";
   }
};
 
#endif // EMPTYINPUT_H
 

BadLine.h
Код
C++ (Qt)
#ifndef BADLINE_H
#define BADLINE_H
 
#include "LogicError.h"
#include <sstream>
 
class BadLine : public LogicError {
public:
 
   BadLine( const std::string &line, int lineNum ) :
       LogicError( line ), m_lineNum( lineNum ) {
       std::ostringstream ostr;
       ostr << "Error string \"" << line << "\" at line " << lineNum;
       m_message = ostr.str( );
   }
 
protected:
   int m_lineNum;
};
 
#endif // BADLINE_H
 

Вот сам парсер:
Parser.h
Код
C++ (Qt)
#ifndef PARSER_H
#define PARSER_H
 
#include <QList>
#include <QVector3D>
#include <QString>
#include "EmptyInput.h"
#include "BadLine.h"
 
class Parser {
public:
   void parseData( const QString &input, QList<QVector3D> &points, QList<QVector3D> &indexes )
   throw(EmptyInput, BadLine);
};
 
#endif // PARSER_H
 

Parser.cpp
Код
C++ (Qt)
#include "Parser.h"
#include <QStringList>
 
void Parser::parseData( const QString &input, QList<QVector3D> &points, QList<QVector3D> &indexes ) throw(EmptyInput, BadLine) {
 
   if ( input.isEmpty( ) ) {
       throw( EmptyInput( input.toStdString( ) ) );
   }
 
   QStringList list = input.split( "\n" );
 
   for ( std::size_t i = 0; i < list.size( ); ++i ) {
       // Poitns
       if ( list[i][0] == QChar( 'v' ) ) {
           QStringList listForPoints = list[i].split( " " );
           if ( listForPoints.size( ) == 4 ) {
               bool ok;
               float x = listForPoints[1].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               float y = listForPoints[2].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               float z = listForPoints[3].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               points.append( QVector3D( x, y, z ) );
           } else {
               throw( BadLine( list[i].toStdString(), i ) );
           }
       }
 
       // Indexes
       if ( list[i][0] == QChar( 'f' ) ) {
           QStringList listForIndexes = list[i].split( " " );
           if ( listForIndexes.size( ) == 4 ) {
               bool ok;
               float x = listForIndexes[1].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               float y = listForIndexes[2].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               float z = listForIndexes[3].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               indexes.append( QVector3D( x, y, z ) );
           } else {
               throw( BadLine( list[i].toStdString(), i ) );
           }
       }
   }
}
 
« Последнее редактирование: Апрель 19, 2014, 19:01 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #87 : Апрель 19, 2014, 19:03 »

Оказывается есть ограничение на количество символов в сообщении: 20000 символов Улыбающийся

Не уместился класс LogicError:

LogicError.h
Код
C++ (Qt)
#ifndef LOGICERROR_H
#define LOGICERROR_H
 
#include <stdexcept>
 
class LogicError : public std::logic_error {
public:
 
   LogicError( std::string argument ) : std::logic_error( "" ), m_argument( argument ) {
 
   }
 
   virtual const char *what( ) const throw () {
       return m_message.c_str( );
   }
 
   virtual ~LogicError( ) throw () {
 
   }
 
protected:
   std::string m_argument;
   std::string m_message;
};
 
#endif // LOGICERROR_H
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #88 : Апрель 20, 2014, 09:18 »

Код
C++ (Qt)
               bool ok;
               float x = listForPoints[1].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               float y = listForPoints[2].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               float z = listForPoints[3].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               points.append( QVector3D( x, y, z ) );
           } else {
               throw( BadLine( list[i].toStdString(), i ) );
           }
 
Почему ничего не доходит? Зачем нужны исключения если все равно проверяться на каждом чтении? Напрашивалось напр так
Код
C++ (Qt)
const QStringList & v = listForPoints;
points.append( QVector3D( Read1V(v[1], Read1V(v[2]), Read1V(v[3]) ) );
 
А метод Read1V уже выбрасывает исключение. Для индексов аналогично.

Вместо того чтобы заниматься делом, содержательной частью - время тратится на "систему тестирования" (хз чего)
Записан
8Observer8
Гость
« Ответ #89 : Апрель 23, 2014, 08:45 »

Не понял ни слова Улыбающийся

Почему ничего не доходит?
Что не доходит?

Зачем нужны исключения если все равно проверяться на каждом чтении?
Какая связь между чтением и исключениями?

Напрашивалось напр так
Код
C++ (Qt)
const QStringList & v = listForPoints;
points.append( QVector3D( Read1V(v[1], Read1V(v[2]), Read1V(v[3]) ) );
 
А метод Read1V уже выбрасывает исключение. Для индексов аналогично.
Здесь вообще ничего не понял.

Вместо того чтобы заниматься делом, содержательной частью - время тратится на "систему тестирования" (хз чего)
Я полностью реализовал содержательную часть. Задача была в загрузке объекта созданного в редакторе Blender.
Записан
Страниц: 1 ... 4 5 [6] 7   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.392 секунд. Запросов: 22.