#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:2 Changed 4 years ago by
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
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 3.0 |
Обновление #758
Я всё доделал, теперь всё должно быть чики-пуки, доп задание не успел допилить. Тесты сделал нормально, но тест на ничью я так и не смог придумать, мозг взорвался. В остальном теперь это выглядит как хороший расширябельный проект в стиле MVC.
comment:4 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
... а если бы он ставил ходы в те клетки, которые просят -- цены бы ему не было:
{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
UPD:
View.h:10. Зачем-то хранится board во View, а не в контроллере.
Как только я разберусь с мэйкфайлом, так сразу сделаю все остальные пункты, просто пихать CMake я не хотел, потому что он ещё более кривой был и дико всё засорял. Буду очень рад, если вы мне поможете с Makefile'ом.