精華區beta EE_DSnP 關於我們 聯絡資訊
※ 引述《ric2k1 (Ric)》之銘言: 就整理在這邊吧... 如有新加 (希望不會 XD), 會用 repost... ==== post 119 ==== 1. In top-level Makefile Comment out "@strip bin/$(EXEC)" ==> # @strip bin/$(EXEC) 2. In src/Makefile.in Swap the comments for CFLAGS ==> #CFLAGS = -O3 -Wall $(PKGFLAG) CFLAGS = -g -Wall $(PKGFLAG) ==== post 120 ==== There is an typo in file "calcCmd.cpp" --- [Compilation error message] calcCmd.cpp:65: error: 'getValue' is not a member of 'ModNum' Please change it to: if (!ModNum::getStrVal(options[1], v)) ==== post 130 ==== ModNum::ModNum(const string& str); 的定義是 "從 ModNum::_varMap 中擷取 varname = str 的變數的值, 如果沒有找到, 就 assign ModNum 的 default constructor." 不果如果你將它定義成 "將string parse成ModNum", 只要是不會影響整個作業要求的 commands 的 behavior, 應該也是沒有關係的. ==== post 131 ==== mcalc> msub x 3 5 x(5) = 3 + 5 應為 --- x(5) = 3 - 5 ==== post 145 ==== "cmdParser.cpp" 有一個 typo, 請修正 --- 370 bool 371 CmdExec::lexOptions 372 (const string& option, vector<string>& tokens, size_t nOpts) const 373 { ...... 381 if (tokens.size() > nOpts) { 382 errorOption(CMD_OPT_EXTRA, tokens[2]); 383 return false; 384 } 385 } 382 行應改為 --- 381 if (tokens.size() > nOpts) { 382 errorOption(CMD_OPT_EXTRA, tokens[nOpts]); 383 return false; 384 } ==== post 152 ==== If we define "ModNum::_num" as unsigned, there may be problems in constructing ModNum from negative integer. An easy way to solve this is to change "ModNum::_num" to "int" type. Please change the "unsigned" in the following code to "int", or download hw3.tgz again... calc/calcModNum.h:19: ModNum(unsigned i = 0); calc/calcModNum.h:27: static void setModulus(unsigned m) { _modulus = m; } calc/calcModNum.h:28: static unsigned getModulus() { return _modulus; } calc/calcModNum.h:56: unsigned _num; calc/calcModNum.h:58: static unsigned _modulus; calc/calcCmd.cpp:27: if (ModNum::getModulus() != unsigned(m)) { ==== post 152 ==== In "myStrNCmp(const string& s1, const string& s2, unsigned n)", the comparison will be wrong if the string s2 is a superset of s1. For example, s1 = "HELp", s2 = "HELpkk", n = 3 --- we will see the comparison result = 0 (i.e. equivalent), which is NOT correct. We should return a negative integer (i.e. s1 < s2). ============= int myStrNCmp(const string& s1, const string& s2, unsigned n) { assert(n > 0); if (s2.size() == 0) return -1; unsigned l = s1.size(); assert(l >= n); for (unsigned i = 0; i < l; ++i) { if (!s2[i]) return (i < n)? 1 : 0; char ch1 = (isupper(s1[i]))? tolower(s1[i]) : s1[i]; char ch2 = (isupper(s2[i]))? tolower(s2[i]) : s2[i]; if (ch1 != ch2) return (ch1 - ch2); } return (l - s2.size()); } ====== The red lines are modified. ==== post 160 ==== calcCmd.cpp 應做修正--- 23 int m; 24 if (!myStr2Int(token, m) || (m <= 0)) 25 return CmdExec::errorOption(CMD_OPT_ILLEGAL, token); 綠色的部份為新增的 code... ==== post 169 ==== 在calcCmd.cpp的MvarCmd::exec(const string& option)裡面 請改成 --- if (!CmdExec::lexOptions(option, options, 2)) return CMD_EXEC_ERROR; ==== post 180 ==== In cmdParser.cpp --- bool CmdExec::lexSingleOption (const string& option, string& token, bool optional) const { size_t n = myStrGetTok(option, token); if (!optional) { if (token.size() == 0) { errorOption(CMD_OPT_MISSING, ""); return false; } else if (n != string::npos) { errorOption(CMD_OPT_EXTRA, option.substr(n)); return false; } // 這個括弧放錯了.... orz } return true; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.133.66
ric2k1:呵 拍謝 還真多 11/19 05:04
ric2k1:請確認你交上來的 code 有包含以上的更正!! 11/19 05:05
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.242