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

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

Страниц: 1 ... 9 10 [11] 12   Вниз
  Печать  
Автор Тема: Тренировка навыков быстрого программирования  (Прочитано 76619 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #150 : Март 18, 2014, 12:39 »

Часто это ничем особенным не грозит
Как правило любые ошибки в программах ничем особенным не грозят. Улыбающийся

А вот скажем, если в enum находятся режимы работы, то его использование в качестве параметра, может избавить от проверки входных параметров.
« Последнее редактирование: Март 18, 2014, 12:49 от Old » Записан
8Observer8
Гость
« Ответ #151 : Март 18, 2014, 12:54 »

Я имел ввиду, как понять без комментариев, что означает: errDataNoFormat. На самом деле, что это означает?

Лучше комментарии писать. А doxygen позволит сгенерировать документацию:
Код
C++ (Qt)
//! Коды ошибок
enum ErrorType {
   //! Нет ошибок
   errNone = 0,
 
   //! Ошибка открытия файла
   errFileOpen = -1000,
 
   //! Ошибка записи в файл
   errFileWrite = -1001,
 
   //! Некорректные данные в файле
   errDataBad = -5000
};
 

Всё же я соглашусь с OKTA, что нужно сразу возвращать, чтобы видно было, что программа дальше не будет выполняться:
Код
C++ (Qt)
int readData(const QString &fileName, QString &data ) {
   QFile iFile(fileName);
   if ( !iFile.open( QIODevice::ReadOnly ) ) {
       return ErrorType::errFileOpen;
   } else {
       data = iFile.readAll();
       iFile.close();
       return ErrorType::errNone;
   }
}
 

Код
C++ (Qt)
int showError(int errorCode, const char * fileName = 0);
int showError(int errorCode, const char * msg1 = 0, const char * msg2 = 0);
 
Здесь придется чуть повозиться (просто так fileName не напечатать), но возможностей больше. И, строго говоря, "Error: cannot open the file " не есть хорошо, строки-константы должны грузиться из ресурсов

Что значит просто так не напечатать? А как строку в ресурсах создать?

Код
C++ (Qt)
int showError(const QString & fileName, ErrorType errorCode) {
   switch (errorCode) {
   case ErrorType::errFileOpen:
       std::cerr << "Error: cannot open the file " << fileName.toStdString() << std::endl;
       break;
   case ErrorType::errFileWrite:
       std::cerr << "Error: cannot write to the file " << fileName.toStdString() << std::endl;
       break;
   case ErrorType::errDataBad:
       std::cerr << "Error: incorrect data in the file " << fileName.toStdString() << std::endl;
       break;
   default:
       std::cerr << "Error code: " << errorCode << "; file name: " << fileName.toStdString() << std::endl;
       break;
   }
 
   return errorCode;
}
 
« Последнее редактирование: Март 18, 2014, 12:58 от 8Observer8 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #152 : Март 18, 2014, 12:56 »

Всё же я соглашусь с OKTA, что нужно сразу возвращать, чтобы видно было, что праграмма дальше не будет выполняться:
Лучше после возврата не использовать else, это избыточно:

Код
C++ (Qt)
int readData(const QString &fileName, QString &data ) {
   QFile iFile(fileName);
   if ( !iFile.open( QIODevice::ReadOnly ) )
       return ErrorType::errFileOpen;
 
   data = iFile.readAll();
   return ErrorType::errNone;
}
 
Записан
8Observer8
Гость
« Ответ #153 : Март 18, 2014, 12:59 »

Да, Вы правы! Спасибо! Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #154 : Март 18, 2014, 13:04 »

Да, Вы правы! Спасибо! Улыбающийся
И как правило, в компаниях используется свой стиль обязательный к использованию, поэтому все рекомендации в этой тебе вам могут не пригодиться. Подмигивающий
Записан
8Observer8
Гость
« Ответ #155 : Март 18, 2014, 13:10 »

Сейчас вот так переписал:

Код
C++ (Qt)
//! Коды ошибок
enum ErrorType {
   //! Нет ошибок
   errNone = 0,
 
   //! Ошибка открытия файла
   errFileOpen = -1000,
 
   //! Ошибка записи в файл
   errFileWrite = -1001,
 
   //! Некорректные данные в файле
   errDataBad = -5000
};
 
ErrorType readData( const QString &fileName, QString &data );
ErrorType writeResult( const QString &fileName, QString &data );
void showData( const QString &data );
ErrorType showError( const QString &fileName, ErrorType errorCode );
 
Записан
8Observer8
Гость
« Ответ #156 : Март 18, 2014, 14:03 »

Я думаю, что тут уже нечего усложнять Улыбающийся Единственное, что... есть мысль сделать через исключения, но пока без них. Запись в файл:

Код
C++ (Qt)
/*!
* Записываем данные в файл
* \param fileName Имя файла, в который будем записывать
* \param data Данные, которые будут записаны в файл
* \return Код ошибки
*/

ErrorType writeResult( const QString &fileName, QString &data ) {
   QFile file(fileName);
 
   if ( !file.open( QIODevice::WriteOnly ) )
       return ErrorType::errFileOpen;
 
   QTextStream stream(&file);
   stream << data;
   file.close();
 
   if (stream.status() != QTextStream::Ok)
       return ErrorType::errFileWrite;
 
   return ErrorType::errNone;
}
 
« Последнее редактирование: Март 18, 2014, 14:09 от 8Observer8 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #157 : Март 18, 2014, 14:10 »

Я имел ввиду, как понять без комментариев, что означает: errDataNoFormat. На самом деле, что это означает?
"Ошибка данные не форматированы"  Улыбающийся Это я просто привел для примера. Как и предыдущая, начинается с errData, так что какое-то представление читающий сразу получает: ошибка в данных. Дальше (что за NoFormat) уже по задаче. А комментарии... полагаю скоро Вам надоест их рисовать
Код
C++ (Qt)
errDataBad,  // wrong (invalid) data
"Масло масляное", такой комментарий ничего не проясняет, он просто не нужен т.к. имя говорит само за себя.

И не надо строить наполеновских планов с Doxygen и.т.п. До этого еще дистанция такого огромного размера  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #158 : Март 18, 2014, 14:21 »

И не надо строить наполеновских планов с Doxygen и.т.п. До этого еще дистанция такого огромного размера  Улыбающийся
До чего "этого" эта дистанция?
Doxygen простой и удобный инструмент, который можно использовать всегда и везде, а не ждать программу своей жизни. Улыбающийся
Записан
8Observer8
Гость
« Ответ #159 : Март 18, 2014, 16:10 »

Следующий оператор if не выполняется в случае: (errorCode != 0). Почему?

Код
C++ (Qt)
//! Error codes
enum ErrorType {
   //! None errors
   errNone = 0,
 
   //! Error of the opening of a file
   errFileOpen = -1000,
 
   //! Error of the writing of a file
   errFileWrite = -1001,
 
   //! Wrong data
   errDataBad = -5000
};
 
int main( int argc, char *argv[] ) {
   // ...
   ErrorType errorCode = ErrorType::errNone;
 
   // Read data from a file
   QString iFileName = QString( "input.txt" );
   errorCode = readData( iFileName, data );
   if ( !errorCode ) {
       showError( iFileName, errorCode );
   }
 
   // ...
}
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #160 : Март 18, 2014, 16:17 »

Сейчас в примере написано: если нет ошибки (errorCode == 0), напечатать сообщение о ошибке.

Что значит не работает errorCode != 0?
Записан
8Observer8
Гость
« Ответ #161 : Март 18, 2014, 16:22 »

Тело оператора if не выполняется в случае отсутствия файла:
Код
C++ (Qt)
if ( !errorCode ) {
   showError( iFileName, errorCode );
}
 

И ещё вопрос. У меня функция main() возвращает: return a.exec( );

Могу ли я так написать (то есть вернуть ErrorType::errFileOpen):
Код
C++ (Qt)
int main( int argc, char *argv[] ) {
   QCoreApplication a( argc, argv );
   // ...
 
   if ( errorCode != ErrorType::errNone ) {
       return showError( iFileName, errorCode );
   }
 
   // ...
 
   return a.exec( );
}
 
« Последнее редактирование: Март 18, 2014, 16:26 от 8Observer8 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #162 : Март 18, 2014, 16:25 »

Тело оператора if не выполняется в случае отсутствия файла:
Конечно, потому что оно будет выполняться при отсутствии ошибок (если errorCode == 0).

Могу ли я так написать (то есть вернуть ErrorType::errFileOpen):
Можете.
Записан
8Observer8
Гость
« Ответ #163 : Март 18, 2014, 16:32 »

Закружился с этим выражением: !errorCode Улыбающийся Понял. Спасибо!

Чтобы было понятнее, вот так написал:
Код
C++ (Qt)
if ( errorCode != ErrorType::errNone ) {
   return showError( iFileName, errorCode );
}
 
Записан
OKTA
Гость
« Ответ #164 : Март 18, 2014, 16:38 »

Напиши просто if(errorCode) - читаться будет "если ошибка" грубо говоря, а if(!errorCode) - если не ошибка  Улыбающийся
Записан
Страниц: 1 ... 9 10 [11] 12   Вверх
  Печать  
 
Перейти в:  


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