Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

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

#HW_02

Reported by: Kreslavski Kirill Owned by: Артур Гулецкий (huletski)
Component: HW #2 (X0) Version: 3.0
Keywords: Cc:

Description

У меня ничего не заработало т.к. я не смог сделать нормальный Makefile, когда я компилил только игру (без тестов) она работала, но с отклонениями от формата вывода, я знаю, как это пофиксить, но у меня не хватило на это времени. Я 3 часа потратил на то, чтобы устранить баги в Makefile, но в итоге у меня ничего не получилось. Я понимаю, что это не проходит по критериям, но мне очень обидно, что я из всего времени, потраченного на это дз половину потратил впустую на Makefile, ничего с этого не получив, а не потратил его на написание более правильного кода игры или тестов.

Change History (5)

comment:1 Changed 4 years ago by Kreslavski Kirill

Как только я разберусь с мэйкфайлом, так сразу сделаю все остальные пункты, просто пихать CMake я не хотел, потому что он ещё более кривой был и дико всё засорял. Буду очень рад, если вы мне поможете с Makefile'ом.

Last edited 4 years ago by Kreslavski Kirill (previous) (diff)

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

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

Буду очень рад, если вы мне поможете с Makefile'ом.

Действительно, не собирается:

{hw_02}[2341]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02
Updating '.':
At revision 2943.
{hw_02}[2342]$ make
mkdir -p obj/src
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/View.o src/View.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/Board.o src/Board.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/main.o src/main.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/StdioBoardView.o src/StdioBoardView.cpp
g++ obj/src/View.o obj/src/Board.o obj/src/main.o obj/src/StdioBoardView.o -o hw_02 
mkdir -p obj/test
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/BoardTest.o test/BoardTest.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/Test.o test/Test.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/test.o test/test.cpp
g++ obj/test/BoardTest.o obj/test/Test.o obj/test/test.o -o test_hw_02 
obj/test/BoardTest.o: In function `testIsWin()':
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:7: undefined reference to `Board::Board()'
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:8: undefined reference to `Board::make_turn(int, int)'
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:9: undefined reference to `Board::make_turn(int, int)'
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:10: undefined reference to `Board::make_turn(int, int)'
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:11: undefined reference to `Board::make_turn(int, int)'
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:12: undefined reference to `Board::make_turn(int, int)'
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:7: undefined reference to `Board::~Board()'
obj/test/BoardTest.o: In function `testMove1()':
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:17: undefined reference to `Board::Board()'
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:18: undefined reference to `Board::make_turn(int, int)'
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:17: undefined reference to `Board::~Board()'
obj/test/BoardTest.o: In function `testIsWin()':
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:7: undefined reference to `Board::~Board()'
obj/test/BoardTest.o: In function `testMove1()':
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/BoardTest.cpp:17: undefined reference to `Board::~Board()'
obj/test/Test.o: In function `Test::showFinalResult()':
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02/test/Test.cpp:5: undefined reference to `Test::failedNum'
collect2: error: ld returned 1 exit status
Makefile:27: recipe for target 'test_hw_02' failed
make: *** [test_hw_02] Error 1

A few moments later

{hw_02}[2357]$ pwd && svn up && svn status && svn diff
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02
Updating '.':
At revision 2943.
M       Makefile
M       test/Test.cpp
Index: Makefile
===================================================================
--- Makefile	(revision 2943)
+++ Makefile	(working copy)
@@ -10,6 +10,7 @@
 TST_SRCDIR = test
 
 OBJECTS_E = $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR_SRC)/%.o,$(wildcard $(SRCDIR)/*.cpp))
+LIB_OBJS = $(filter-out $(OBJDIR_SRC)/main.o, $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR_SRC)/%.o,$(wildcard $(SRCDIR)/*.cpp)))
 
 OBJECTS_TST = $(patsubst $(TST_SRCDIR)/%.cpp,$(OBJDIR_TST)/%.o,$(wildcard $(TST_SRCDIR)/*.cpp))
 
@@ -17,15 +18,15 @@
 
 $(EXE): $(OBJECTS_E)
 	$(CXX) $(OBJECTS_E) -o $(EXE) $(LDFLAGS)
-	
+
 $(OBJDIR_SRC)/%.o: $(SRCDIR)/%.cpp | $(OBJDIR_SRC)
 	$(CXX) $(CXXFLAGS) -c -MMD -o $@ $<
 
 include $(wildcard $(OBJDIR_SRC)/*.d)
 
-$(TST_EXE): $(OBJECTS_TST)
-	$(CXX) $(OBJECTS_TST) -o $(TST_EXE) $(LDFLAGS)
-	
+$(TST_EXE): $(OBJECTS_TST) $(LIB_OBJS)
+	$(CXX) $(OBJECTS_TST) $(LIB_OBJS) -o $(TST_EXE) $(LDFLAGS)
+
 $(OBJDIR_TST)/%.o: $(TST_SRCDIR)/%.cpp | $(OBJDIR_TST)
 	$(CXX) $(CXXFLAGS) -c -MMD -o $@ $<
 
@@ -38,7 +39,7 @@
 	mkdir -p $(OBJDIR_TST)
 
 clean:
-	rm -rf $(OBJDIR_TST) $(OBJDIR_SRC) $(EXE) $(TST_EXE)
+	rm -rf $(OBJDIR_TST) $(OBJDIR_SRC) $(EXE) $(TST_EXE) obj
 
 .PHONY: clean all
 
Index: test/Test.cpp
===================================================================
--- test/Test.cpp	(revision 2943)
+++ test/Test.cpp	(working copy)
@@ -1,6 +1,9 @@
 #include "Test.h"
 #include <stdio.h>
 
+int Test::failedNum = 0;
+int Test::totalNum = 0;
+
 bool Test::showFinalResult(){
 	if (failedNum == 0) {
 		return true;
@@ -19,4 +22,4 @@
 	} else {
 		printf("FAILED: in file %s in function %s at line %d", filename, func, lineNum);
 	}
-}
\ No newline at end of file
+}
{hw_02}[2358]$ make
mkdir -p obj/src
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/View.o src/View.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/Board.o src/Board.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/main.o src/main.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/StdioBoardView.o src/StdioBoardView.cpp
g++ obj/src/View.o obj/src/Board.o obj/src/main.o obj/src/StdioBoardView.o -o hw_02 
mkdir -p obj/test
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/BoardTest.o test/BoardTest.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/Test.o test/Test.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/test.o test/test.cpp
g++ obj/test/BoardTest.o obj/test/Test.o obj/test/test.o obj/src/View.o obj/src/Board.o obj/src/StdioBoardView.o -o test_hw_02 
{hw_02}[2359]$

Не хватало включения объектных файлов игры в тесты, определения статических перемeнных, удаления папки obj в цели clean.

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

Некоторые недочеты:

  • недочеты в поведении view (например: не печатается "Bad turn!" при попытке хода на занятую клетку, не печатается поле в случае победы);
  • баги в коде определения победы. Например, победа определяется того, когда ее нет:
    XX..OXXOOO
    .OXOXO..O.
    X.OO.XO..X
    X.OX.XXXO.
    OXX.X.XOOX
    .OXOXOX..O
    OO.XOX.XXO
    .O..OX.O.X
    X.O..XXOO.
    X wins!
    

Так же замечены случаи, когда программа вылетает по исключению.

  • нет работающих тестов.

Стиль

Смотрел по диагонали, т.к. код будет меняться.

Board.h

  • const у методов не проставлен;
  • используйте enum classы;

22: 10 нужно вынести в константу;

Board.cpp

3: списки инициализации, информацию о том, кто ходит первым, можно передавать в качестве аргумента;
5: memset;
38: путано, код дублируется, какие-то hardcoded значения (надо заменить константами) -> нужно упрощать;
101: вложенность можно уменьшить:

if (!can_move(...)) { return 4; }
// method body

108: кажется, что с тернарным оператором было бы проще

View.h

  • виртуальный деструктор не нужен?

StdioBoardView?.cpp

27: странно, что метод ask_turn поле меняет: судя по названию, он должен только ход узнавать;

main.cpp

9, 25: код похожий, почему бы его не вынести в StdioBoardView? и не хранить поле is_silent. Если он установлен - не рисовать промежуточные поля.


Баллы

Корректность: 4;
Стиль: 3 (код будет меняться).

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

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

Обновление #758

Я всё доделал, теперь всё должно быть чики-пуки, доп задание не успел допилить. Тесты сделал нормально, но тест на ничью я так и не смог придумать, мозг взорвался. В остальном теперь это выглядит как хороший расширябельный проект в стиле MVC.

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

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

... а если бы он ставил ходы в те клетки, которые просят -- цены бы ему не было:

{hw_02}[2025]$ pwd && svn up && svn status && make
/home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02
Updating '.':
At revision 3073.
mkdir -p obj/src
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/Controller.o src/Controller.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/View.o src/View.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/Board.o src/Board.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/main.o src/main.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/StdioBoardView.o src/StdioBoardView.cpp
g++ obj/src/Controller.o obj/src/View.o obj/src/Board.o obj/src/main.o obj/src/StdioBoardView.o -o hw_02 
mkdir -p obj/test
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/BoardTest.o test/BoardTest.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/Test.o test/Test.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/test.o test/test.cpp
g++ obj/test/BoardTest.o obj/test/Test.o obj/test/test.o obj/src/Controller.o obj/src/View.o obj/src/Board.o obj/src/StdioBoardView.o -o test_hw_02 
{hw_02}[2026]$ ./hw_02 

..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
O move: 1 0

.O........
..........
..........
..........
..........
..........
..........
..........
..........
..........
  • при победе не печатается доска;
  • "2 0 5" считается валидным ходом;
  • есть баги в логике определения победы, например:
    XX..OXXOOO
    .OXOXO..O.
    X.OO.XO..X
    X.OX.XXXO.
    OXX.X.XOOX
    .O.OXOX...
    OO..OX.X..
    .O..OX.O.X
    X.O..XXOO.
    O wins!
    
  • тесты не все проходят:
    {hw_02}[2038]$ pwd && svn up && svn status && make
    /home/hfx/dvl/cpp19/kreslavskiy.kirill/hw_02
    Updating '.':
    At revision 3075.
    mkdir -p obj/src
    g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/Controller.o src/Controller.cpp
    g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/View.o src/View.cpp
    g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/Board.o src/Board.cpp
    g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/main.o src/main.cpp
    g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/src/StdioBoardView.o src/StdioBoardView.cpp
    g++ obj/src/Controller.o obj/src/View.o obj/src/Board.o obj/src/main.o obj/src/StdioBoardView.o -o hw_02 
    mkdir -p obj/test
    g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/BoardTest.o test/BoardTest.cpp
    g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/Test.o test/Test.cpp
    g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/test/test.o test/test.cpp
    g++ obj/test/BoardTest.o obj/test/Test.o obj/test/test.o obj/src/Controller.o obj/src/View.o obj/src/Board.o obj/src/StdioBoardView.o -o test_hw_02 
    {hw_02}[2039]$ ./test_hw_02 
    testNotFinished completed successfully
    testIsFilled completed successfully
    testIsEmpty completed successfully
    testX_WIN completed successfully
    testO_WIN completed successfully
    FAILED: in file test/BoardTest.cpp in function testDraw at line 63
    Total amount of tests        : 6
    Total amount of failed tests : 1
    Succes percentage            : 0.833333
    Testing not passed
    

Стиль

Board.h

4: лучше сделать константой класса:

class Board {
  static constexpr std::size_t Board_Sz = 10;
...
};
  • const у методов так и не появились

Controller.h

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

Board.cpp

132: не очень хорошо, так как если поменять коды значений enum classa логика сломается -> код более "хрупкий", чем мог бы быть: возле enum class'a не хватает коммента а-ля "DO NOT CHANGE THESE VALUES! EVER!" -> необходимость в таком комментарии намекает на проблемы в коде;
134: код неочевиден -> сложно поддерживать/понимать; субъективно лучше явный if.

Controller.cpp

8: списки инициализации, избыточный if, почему silent_flag не передавать bool'ом?

+ все неисправленные замечания из комментария к прошлой попытке.

Баллы

Корректность: 15.5;
Стиль: 5.75.

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

UPD:
View.h:10. Зачем-то хранится board во View, а не в контроллере.

Note: See TracTickets for help on using tickets.