作者ric2k1 (Ric)
看板EE_DSnP
標題Re: [情報/整理] HW#3 reference code 更正
時間Wed Nov 22 11:03:51 2006
※ 引述《ric2k1 (Ric)》之銘言:
※ 引述《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 & 188 ====
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;
}
}
// No matter it is optional or not, n should be the end
if (n != string::npos) {
errorOption(CMD_OPT_EXTRA, option.substr(n));
return false;
}
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
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.21.240