Opened 8 years ago

Closed 7 years ago

Last modified 7 years ago

#16 closed ожидается проверка (задача сдана)

HA-1

Reported by: Волков Даниил Owned by: Vladimir Rutsky
Priority: проверка Milestone:
Component: HA#1 matrices Version: 1.0
Keywords: ha-1, matrices Cc: volkov12@…

Description

Please check my homework

Change History (7)

comment:1 Changed 8 years ago by Vladimir Rutsky

Milestone: ha1-milestone1ha1-milestone2
Type: ожидается проверкаожидаются исправления

Замечания:

  1. В заголовочном файле отсутствует страж включения.
  1. Заголовочный файл должен быть самодостаточным, например, в matrices.hpp используется std::string, но <string> не включается.
  1. Зачем вы используете метки?
	if (!fin.is_open())
	{
		clean:
		eraseMatrix_(prevResult);
		eraseStr_(s);
		assert(fin.is_open());
	}
  1. Почему вы называете функции с подчеркиванием на конце (inputStr_, printMatrix_, calculate_)? Приватные функции/переменные для единицы трансляции необходимо пометить как static, либо поместить в анонимную область видимости, но здесь не тот случай. В целом, в C++ для приватных функций/переменных есть специальный синтаксис (в отличие, например, от условно приватных атрибутов в языках программирования с полной интроспекцией, вроде Python).
  1. Почему вы дописываете в конец пустой строки, а не перезаписываете её здесь?
	std::string* s;
	s = new std::string[argc];
	for (size_t i = 0; i < argc; ++i)
	{
		s[i] += argv[i]; // s[i] = argv[i];
	}
  1. Не включайте лишние файлы, например <cassert> в main.cpp.
  1. assert(0); это плохой способ обрабатывать ошибки. Невыполнение assert приводит к ненормальному, "мгновенному", завершению программы, при этом не будет раскручен стек и вызваны деструкторы объектов, что недопустимо в C++.

assert стоит использовать для проверки внутренних инвариантов, нарушение которых является неожиданным и критическим, и когда продолжение программы бессмысленно. Плюс падание через assert отличается от обычного завершения с кодом ошибки (возвращение ненулевого кода в main()): обычно делается дамп памяти и ОС может логировать такие ошибки и предлагать отправить "отчет об ошибке".

В данный задаче некорректный размер входных матриц это один из ожидаемых вариантов входа, который должен быть аккуратно обработан.

Такого рода ошибки стоит обрабатывать либо используя механизм исключений (что не требуется в данной задаче), либо передавая из функции код ошибки.
Добавив код ошибки в matadd_, matmul_ также позволит не передавать внутрь const std::string *s (что сейчас выглядит странным: почему функция перемножения матриц должна делать какую-то дополнительную работу, кроме перемножения матриц?)


  1. При запуске без аргументов программа падает.
  1. При запуске ./matrices 5.txt --a 2.txt программа падает с assert-ом Assertion fin.is_open()' failed.`

comment:2 Changed 8 years ago by Волков Даниил

Cc: volkov12@… added
Type: ожидаются исправленияожидается проверка

Доброго времени суток!
Замечания 1-9 пофиксил.

comment:3 Changed 8 years ago by Vladimir Rutsky

Milestone: ha1-milestone2ha1-deadline
Type: ожидается проверкаожидаются исправления

Замечания:

  1. prevResult в readMatrix не используется.
matbool readMatrix (const std::string &nameFile, double* prevResult)
  1. Данная строка выглядит подозрительно:
matbool result = readMatrix(s[0], result.first.p_Matrix); 

вы в инициализации используете поле переменной, которую инициализируете.

  1. Было бы разумней убрать из printMatrix обработку ошибок и освобождение памяти для матрицы: пусть эта функция только выводит на экран матрицу, не меняя её. Это расширит способы её использования.
  1. В случае возникновения ошибки вы в некоторых случаях вызываете eraseMatrix от неинициализированной матрицы, что приводит к undefined behavior. Например, при вызове ./matrices A_3x7.txt --add B_7x13.txt.

comment:4 Changed 8 years ago by Волков Даниил

Type: ожидаются исправленияожидается проверка

comment:5 Changed 8 years ago by Волков Даниил

Доброго времени суток!
Поправил код согласно замечаниям 1-4.

comment:6 Changed 7 years ago by Vladimir Rutsky

Resolution: задача сдана
Status: newclosed

Решение зачтено.

comment:7 Changed 7 years ago by Vladimir Rutsky

Milestone: ha1-deadline

Milestone ha1-deadline deleted

Note: See TracTickets for help on using tickets.