![]() |
|
![]() |
●過去の更新履歴
Word.cの更新履歴です。
|
●Word.c 更新状況 2001/12/22 16:00 == Word.c version 0.08改訂版
|
|
●Word.c 更新状況 2001/12/22 03:00 == Word.c version 0.08
□このソースに対する239氏のコメント
コンパイル通らんぞ(藁。
word008.c: In function `main':
word008.c:78: `j' undeclared (first use in this function)
word008.c:78: (Each undeclared identifier is reported only once
word008.c:78: for each function it appears in.)
while ((c=getchar())!=EOF)に関してはここを読め。
http://www.catnet.ne.jp/kouno/c_faq/c12.html#1
> else if (i==0){/*英文字でなく、なおかつ以前も英文字でなかった時*/
> ;
> }
ふつーこういうのは条件を逆にするだろ。
> else{ /*英文字でなく、なおかつ前が英文字であった時*/
コメントが分かりづらい。要するに単語の終り?
何をやってるかとか直接の条件なんてのは、コードを読めば分かることだから、
コメントにはコードの意図を書いたほうがいい。
feof()してからfgetc()してるのは…うーん、これのおかげで英字で終ってる
ファイルでも正しく扱えてるんだが、そこまで考えてる?
あとはまぁ、tempのオーバーフローのチェックとか、Node::wordを可変長にす
るとか、argvからファイル名を取るようにするとか、そんなとこかな。
|
|
●Word.c 更新状況 2001/12/22 00:00 == Word.c version 0.07 改訂版
□私から239氏のコメント
>> Node root={"\0",0, NULL, NULL};
>空の単語も全部これにカウントすることになるが、それは意図的なもの?
>Node *root = NULL;でnodeは要らないはず。
addNode()で返ってきたものを逐一Nodeに再代入して使っているので、
ルートの位置を保存しておく(あとでTraverseNode()で使う)ためにnodeを宣言していました。
だからnodeをなくすとルートの位置が保存できなくなると思うのですが。
>> while ((c=fgetc(fp))!=EOF || j<=MAXWORD){
>charとEOFの比較はうまくいかないし、jがMAXWORDにいっても終らん。
これは…いままでおもいっきり while ((c=getchar())!=EOF) なんていう式を使っていたので
それに倣っていました。でもEOFは0か1を返すのでcharと比較しても大丈夫なような…。
>> ptr[j]=(char *)malloc(sizeof(char)*i); /*単語を格納するための場所確保*/
>> strcpy((char *)*ptr[j], temp); /*確保した場所に単語を格納*/
>ターミネータの分を忘れてる。このptr自体不要だと思うが。
>二分木に貯め込むってのに、別に配列に取っておく必要はないだろう。
ターミネータ('¥0'ですよね?)は忘れていました。
ptrは…。ちょっと理解するのが難しいのでじっくり考えます。ノードのなかにポインタがあるから、
それを使えば他のノードも指せるということですよね。(ptrを使わなくても)
□私のレスに対する239氏のコメント > addNode()で返ってきたものを逐一Nodeに再代入して使っているので、 > ルートの位置を保存しておく(あとでTraverseNode()で使う)ためにnodeを宣言していました。 > だからnodeをなくすとルートの位置が保存できなくなると思うのですが。 addNode()が返してるもの自体がルートだろ? > これは…いままでおもいっきり while ((c=getchar())!=EOF) なんていう式を使っていたので > それに倣っていました。 fgetc()やgetchar()の戻り値をなぜcharに代入しちゃいけないかは、 はっきりいってFAQなので>>1にあるリンクを読んでくれ。 > でもEOFは0か1を返すのでcharと比較しても大丈夫なような…。 それと、EOFとfeof()かなにかを混同してないか。 > ptrは…。ちょっと理解するのが難しいのでじっくり考えます。ノードのなかにポインタがあるから、 > それを使えば他のノードも指せるということですよね。(ptrを使わなくても) 「読み込んだ単語は全部ツリーにコピーされてるわけだから、 それと別に保存しておく意味はないだろ」ということをいってるんだが、 伝わってるかな。 |
|
●Word.c 更新状況 2001/12/20 20:00 == Word.c version 0.07
□このソースへの239氏のコメント
> Node root={"\0",0, NULL, NULL};
空の単語も全部これにカウントすることになるが、それは意図的なもの?
Node *root = NULL;でnodeは要らないはず。
> while ((c=fgetc(fp))!=EOF || j<=MAXWORD){
charとEOFの比較はうまくいかないし、jがMAXWORDにいっても終らん。
> ptr[j]=(char *)malloc(sizeof(char)*i); /*単語を格納するための場所確保*/
> strcpy((char *)*ptr[j], temp); /*確保した場所に単語を格納*/
ターミネータの分を忘れてる。このptr自体不要だと思うが。
二分木に貯め込むってのに、別に配列に取っておく必要はないだろう。
以前も書いたが、英字以外が連続したときのことを考えていない。
iが何を意味しているか考えればできるはず。
whileの中の条件の順序を変えた方がいいと思う。
|
|
●Word.c 更新状況 2001/12/18 21:00 == Word.c version 0.06
□このソースへの239氏のコメント
ツッコミどころ満載だが、細かいところから。
> int GetWord(const char* str, int i, char **word){
> char c;
> for (l=0; (c=str[l])!='\n' && (c=str[l])!=EOF ;l++){
文字列の終端はEOFじゃないし、charをEOFと比較してはダメ。
> tolower(c); /*大文字→小文字*/
tolower()は副作用を持たない。
> if (!isalpha(c) && c=='\''){ /*cが英文字の時*/
これじゃc=='\''のときしか成立しない。
次main()。
> while ((c=fgets(str,512,fp))!=NULL);
ループの中が空だし、WORDMAXしかないstrに512も読んじゃいかん。
> i=getword(str, i, word);
配列とポインタは違う。多重配列の場合、もっとも上位(宣言のときの左側)の
配列だけはポインタに暗黙のうちに変換されるが、その下は一致しないとまず
い。
> for (i=0; *word[i]<=len ; i++)
この条件は何を意図してる?
> root=addNode(&root, *word[i]);
rootはNode*じゃないからこの代入はできない。
addNode()に関してはいろいろいわれて混乱してるのかも知れんが、
少なくとも0.04のは正しい(はず。残してないからよく分からんが)。
getword()に関しては、0.06の仕様よりも前の0.05改訂版の方がいいと思う。
fpを渡す必要はあると思うが。
0.06のGetWord()は複雑なわりにメリットがない。というかデメリットばかり。
|
|
●Word.c 更新状況 2001/12/18 00:00 == Word.c version 0.05 改訂版
|
|
●Word.c 更新状況 2001/12/17 22:00 == Word.c version stop.
|
|
●Word.c 更新状況 2001/12/17 01:00 == Word.c ver0.05
|