Opened 4 years ago

Closed 4 years ago

#714 closed ожидаются исправления (задача сдана)

HW #2

Reported by: gabitov.daniil Owned by: Артур Гулецкий (huletski)
Component: HW #2 (X0) Version: 2.0
Keywords: Cc:

Description

Не совсем разобрался со static методами и переменными в классе Test. Из-за того, что тесты необходимо запускать из test.cpp, а не Test.cpp, происходит ошибка линковки: компилятор не видит static методы. Есть предположение, что я идейно чего-то не понимаю, поэтому реализовал все в одной единице трансляции Test.cpp. Help.

+ еще есть пару вопросов, закоменченных в коде.

Change History (4)

comment:1 Changed 4 years ago by Артур Гулецкий (huletski)

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

Решение не собирается:

{hw_02}[2052]$ pwd
/home/hfx/dvl/cpp19/gabitov.daniil/hw_02
{hw_02}[2053]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/gabitov.daniil/hw_02
Updating '.':
At revision 2754.
{hw_02}[2054]$ make
mkdir -p obj
g++ -c -o obj/main.out -std=c++17 -Wall -Werror -Wextra -g -fsanitize=address -Iinclude  src/main.cpp
g++ -c -o obj/Board.out -std=c++17 -Wall -Werror -Wextra -g -fsanitize=address -Iinclude  src/Board.cpp
g++ -c -o  obj/StdioBoardView.out -std=c++17 -Wall -Werror -Wextra -g -fsanitize=address -Iinclude  src/StdioBoardView.cpp 
g++ -o  hw_02 obj/main.out obj/Board.out obj/StdioBoardView.out -lasan
make: *** No rule to make target 'test/BoardTest.cpp', needed by 'obj/BoardTest.out'.  Stop.

Не совсем разобрался со static методами и переменными в классе Test. Из-за того, что тесты необходимо запускать из test.cpp, а не Test.cpp, происходит ошибка линковки: компилятор не видит static методы. Есть предположение, что я идейно чего-то не понимаю, поэтому реализовал все в одной единице трансляции Test.cpp. Help.

Не хватает лога сборки с сообщением об ошибке. Я попробовал воспроизвести ошибку, изменив минимально код тестов и починив сборку, но проблема не воспроизвелась:

{hw_02}[2062]$ svn status
M       Makefile
M       Test/Test.cpp
?       Test/test.cpp
{hw_02}[2063]$ svn diff
Index: Makefile
===================================================================
--- Makefile	(revision 2754)
+++ Makefile	(working copy)
@@ -18,14 +18,13 @@
 	g++ -c -o  obj/StdioBoardView.out $(CFLAGS) src/StdioBoardView.cpp 
 
 test_hw_02: obj  obj/BoardTest.out obj/Board.out obj/Test.out
-	g++ -o  test_hw_02 obj/Test.out obj/BoardTest.out obj/Board.out -lasan
+	g++ Test/test.cpp -Iinclude -o  test_hw_02 obj/Test.out obj/BoardTest.out obj/Board.out -lasan
 
-obj/Test.out:test/Test.cpp include/Test.h include/BoardTest.h| obj
-	g++ -c -o obj/Test.out $(CFLAGS) test/Test.cpp
+obj/Test.out:Test/Test.cpp include/Test.h include/BoardTest.h| obj
+	g++ -c -o obj/Test.out $(CFLAGS) Test/Test.cpp
 
-obj/BoardTest.out: test/BoardTest.cpp include/BoardTest.h include/Board.h include/Test.h include/StdioBoardView.h | obj
-	g++ -c -o obj/BoardTest.out $(CFLAGS) test/BoardTest.cpp
+obj/BoardTest.out: Test/BoardTest.cpp include/BoardTest.h include/Board.h include/Test.h include/StdioBoardView.h | obj
+	g++ -c -o obj/BoardTest.out $(CFLAGS) Test/BoardTest.cpp
 
-	
 clean:
-	rm  -rf hw_02 obj test_hw_02
\ No newline at end of file
+	rm  -rf hw_02 obj test_hw_02
Index: Test/Test.cpp
===================================================================
--- Test/Test.cpp	(revision 2754)
+++ Test/Test.cpp	(working copy)
@@ -25,9 +25,3 @@
 int Test::failedNum = 0;
 int Test::totalNum = 0;
 
-int main() {
-    BoardTest bt;
-    bt.runAllTests();
-    return BoardTest::showFinalResult();
-}
-
{hw_02}[2064]$ cat Test/test.cpp 
#include "BoardTest.h"

int main() {
    BoardTest bt;
    bt.runAllTests();
    return BoardTest::showFinalResult();
}
{hw_02}[2065]$ make
mkdir -p obj
g++ -c -o obj/main.out -std=c++17 -Wall -Werror -Wextra -g -fsanitize=address -Iinclude  src/main.cpp
g++ -c -o obj/Board.out -std=c++17 -Wall -Werror -Wextra -g -fsanitize=address -Iinclude  src/Board.cpp
g++ -c -o  obj/StdioBoardView.out -std=c++17 -Wall -Werror -Wextra -g -fsanitize=address -Iinclude  src/StdioBoardView.cpp 
g++ -o  hw_02 obj/main.out obj/Board.out obj/StdioBoardView.out -lasan
g++ -c -o obj/BoardTest.out -std=c++17 -Wall -Werror -Wextra -g -fsanitize=address -Iinclude  Test/BoardTest.cpp
g++ -c -o obj/Test.out -std=c++17 -Wall -Werror -Wextra -g -fsanitize=address -Iinclude  Test/Test.cpp
g++ Test/test.cpp -Iinclude -o  test_hw_02 obj/Test.out obj/BoardTest.out obj/Board.out -lasan

К слову, папка с кодом тестов должна называться "test", а не "Test"; странно видеть объектные файлы с расширением "out".

+ еще есть пару вопросов, закоменченных в коде.

  • Board.h:16. О каких константах речь идет неясно; зачем они нужны?
  • Board.h:23. С checker в качестве имени метода есть проблема - это существительное, я бы ожидал увидеть такое имя у класса, а не у метода (или подумал, что метод возвращает объект-"проверяльщик" какой-то). Методы лучше называть глаголами в самом общем случае. Не понимаю, чем вам check не угодил, но не настаиваю, если checker больше нравится (но со стороны такое имя выглядит неожиданно).

Корректность

Недочеты, которые увидел:

  • ввод/вывод нужно делать, используя cstdio, a не iostreams;
  • нолики по условию (см. пример) должны ходить первыми (FYI: что-то не так в дизайне: для исправления этого недочета мне пришлось править код в двух местах (Board::Board, StdioBoardView::runGame));
  • мелкие недочеты в форматировании вывода - протестируйте решение на примере из задания;
  • valgrind иногда находит ошибки;
  • если ввести -1 -1 в качестве хода, программа не завершается.

Стиль

Посмотрел по диагонали, так как код будет дописываться:

  • Board.h:14. Лишние проблемы в концах строк незначительно ухудшают читабельность (если редактор отображает пробелы);
  • Board.h:17. Поля должны быть приватными;
  • BoardTest?.h. Представьте, что тест упал, какое сообщение об ошибке вы увидите? "В строке X в файле Y сломался тест canMove2" Это неинформативно. Называйте test case'ы основываясь на тестовом случае, который проверяете (e.g. canMove2 -> can_move_O_free_cell). Если тест сломается, из лога (без сверки с кодом) будет очевидно, что обнаружена проблема "нолик нельзя поставить в пустую клетку".
  • main.cpp:9. Более user-friendly usage печатать; возвращать EXIT_FAILURE или что-то другое ненулевое;
  • main.cpp:12, 13. Зачем if? Инициализируйте переменную условием, в которые неплохо было бы добавить проверку на то, что второй аргумент таки silent для большей автономности этой части кода;
  • Board.cpp:28. Списки инициализации;
  • Board.cpp:25. memset чем не подошел?
  • Board.cpp:35. Лучше местами поменять условия: x < 0 || 10 <= x - из записи визуально понятно, что x вне [0, 10);
  • Board.cpp:49. Наверное, реализация метода работает; узнаем на следующей итерации. На всякий случай вопрос, который, возможно, подскажет как можно упростить логику: а нужно ли Board каждый раз сканировать всю доску по всем направлениям (это же происходит ниже?), чтобы определить кто победил после очередного хода?
  • StdioBoardView?.cpp:10. printBoard было бы чуть точнее;
  • StdioBoardView?.cpp:29. форматирование, не хватает отступов. Например:
    std::cout << blah << blah
              << blah << blah;
    

Баллы: корректность 3, стиль 4. Нужно доделывать.

comment:2 Changed 4 years ago by gabitov.daniil

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

comment:3 Changed 4 years ago by Артур Гулецкий (huletski)

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

Корректность

  • Доску при неверном ходе выводить не нужно.
    {hw_02}[2197]$ pwd && svn up && svn status
    /home/hfx/dvl/cpp19/gabitov.daniil/hw_02
    Updating '.':
    At revision 2931.
    {hw_02}[2198]$ make
    mkdir -p obj
    g++ -c -o obj/main.o -std=c++11 -Wall -Werror -Wextra -Iinclude  src/main.cpp
    g++ -c -o obj/Board.o -std=c++11 -Wall -Werror -Wextra -Iinclude  src/Board.cpp
    g++ -c -o  obj/StdioBoardView.o -std=c++11 -Wall -Werror -Wextra -Iinclude  src/StdioBoardView.cpp 
    g++ -o  hw_02 obj/main.o obj/Board.o obj/StdioBoardView.o
    g++ -c -o obj/test.o -std=c++11 -Wall -Werror -Wextra -Iinclude  test/test.cpp
    g++ -c -o obj/BoardTest.o -std=c++11 -Wall -Werror -Wextra -Iinclude  test/BoardTest.cpp
    g++ -c -o obj/Test.o -std=c++11 -Wall -Werror -Wextra -Iinclude  test/Test.cpp
    g++ -o  test_hw_02 obj/test.o obj/BoardTest.o obj/Board.o obj/Test.o
    {hw_02}[2199]$ ./hw_02 
    
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    O move: 0 0
    
    O.........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    X move: 0 0
    Bad move!
    
    O.........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    X move: 
    
  • ход, состоящего из одной координаты, должен считаться некорректным + valgrind находит утечки памяти при некорректном вводе;
    {hw_02}[2207]$ ./hw_02 
    
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    O move: 0
    ^C
    
  • есть баг в определении статуса партии (доска заполнена, последним ходом крестики выигрывают, но программа говорит, что ничья).

Стиль

Board

.h

  • не соблюдается единый стиль именования методов и полей;

24: не только переименовать, еще const добавить или даже static и, главное, перенести во view.

.cpp

33: (фатальное) сообщение об ошибке лучше печатать в stderr (стандартный поток для вывода ошибок, без буферизации);
55: имя не очень удачное: глядя на него кажется, что функция возвращает победителя, тогда как она его "устанавливает" в значении "сохраняет в поле объекта";
59: в check логика дублируется, попробуйте от этого избавиться (корректность работы метода из-за дублирования и имен перемeнных неочевидна);
60: а вот и баг;
64, 65: row_i[ndex], col_i[ndex] типа std::size_t;
78: имя слишком общее. Глядя на него неясно, что в x нового (с тем же успехом могли назвать x_minus_diff, императивно). Глядя на имя, в идеале должно быть понятно зачем diff из x вычитали (бтв, diff тоже так себе название в данном контексте);
119+: пусты строки зачем-то.

StdioBoardView?.cpp

10: со свичом было бы компактнее и более последовательно кмк

  const char *msg = nullptr;
  switch (board.getState()) {
  case GameStatus::Continues: msg = "..."; break;
  ...
  }
  assert(msg);
  puts(msg);

40: кажется, что имя set_next_player лучше отражает происходящее в функции;

Misc

Test.cpp:18. return !failedNum;


Баллы

Корректность: 15;
Стиль: 6.

comment:4 Changed 4 years ago by Артур Гулецкий (huletski)

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

Дедлайн

Note: See TracTickets for help on using tickets.