ソースステップ数
ソースステップ数
あけましておめでとうございます。
今だにやってました(汗
締切が金曜なので取りあえず今週の木曜を目標にやりたいと思います。
仕様としましては以下になります。
各ファイルごとにステップ数を算出し、結果を表示する(結果例参照)。
算出するステップ数は、以下のとおりである。
1.総ステップ数 (すべての行数)
2.実ステップ数 (コメント行および空白行を除いた行数)
3.ロジックステップ数 (実ステップ数のうち、プリプロセッサ行・
中カッコのみの行を除いたステップ数)
という風になっています。
総ステップはEOFまでの行です。EOFだけの場合は総ステップに含めず、何か1文字でもあれば総ステップとします。
実ステップはコメントと空白行を除いた数になります。今回はコメント行と空白行を一緒にカウントして総ステップから
引くことで実ステップを算出するようにしています。コメントについてはネスト有りの場合でも正確にカウントできるように
しなければなりません。
ロジックステップのプリプロセッサ行はシャープが来たらカウントするようにします。
中カッコのみの行は}}など2個続いても中カッコだけならカウントします(中カッコ以外にスペース以外の文字があった場合はカウントしない)
後は、コンパイルが通るファイルというのが条件のようです。
たとえば
int a;
とあれば本来int main(void) {}
の中に書かれなけばいけないですが、それが書かれていると見なして上記テストファイルのようにint a;だけでカウント出来るようにしなければなりません。
ただ例として##defineなどはコンパイル不可なので動きは不定で構わないことなります。
過去ログになってしまいましたのでもう一度立ててしまいました。すみません(汗
分からない部分がありましたら質問させていただきますのでよろしくお願いいたします。
今だにやってました(汗
締切が金曜なので取りあえず今週の木曜を目標にやりたいと思います。
仕様としましては以下になります。
各ファイルごとにステップ数を算出し、結果を表示する(結果例参照)。
算出するステップ数は、以下のとおりである。
1.総ステップ数 (すべての行数)
2.実ステップ数 (コメント行および空白行を除いた行数)
3.ロジックステップ数 (実ステップ数のうち、プリプロセッサ行・
中カッコのみの行を除いたステップ数)
という風になっています。
総ステップはEOFまでの行です。EOFだけの場合は総ステップに含めず、何か1文字でもあれば総ステップとします。
実ステップはコメントと空白行を除いた数になります。今回はコメント行と空白行を一緒にカウントして総ステップから
引くことで実ステップを算出するようにしています。コメントについてはネスト有りの場合でも正確にカウントできるように
しなければなりません。
ロジックステップのプリプロセッサ行はシャープが来たらカウントするようにします。
中カッコのみの行は}}など2個続いても中カッコだけならカウントします(中カッコ以外にスペース以外の文字があった場合はカウントしない)
後は、コンパイルが通るファイルというのが条件のようです。
たとえば
int a;
とあれば本来int main(void) {}
の中に書かれなけばいけないですが、それが書かれていると見なして上記テストファイルのようにint a;だけでカウント出来るようにしなければなりません。
ただ例として##defineなどはコンパイル不可なので動きは不定で構わないことなります。
過去ログになってしまいましたのでもう一度立ててしまいました。すみません(汗
分からない部分がありましたら質問させていただきますのでよろしくお願いいたします。
Re:ソースステップ数
>コメントについてはネスト有りの場合でも正確にカウントできるようにしなければなりません。
やっぱり、そうきたか。
すると、文字列リテラルの中も考えなきゃいけないね。こりゃ大変だ。
最初の頃のツーパスで操作する方法の方がわかりやすくていいかもね。
やっぱり、そうきたか。
すると、文字列リテラルの中も考えなきゃいけないね。こりゃ大変だ。
最初の頃のツーパスで操作する方法の方がわかりやすくていいかもね。
Re:ソースステップ数
お疲れ様です。今は質問は無いのね。
質問する場合は、前スレで指摘したように、
このスレで完結した質問になるように注意してください。
さらに、前スレやその前のすれへのリンクも張ってくれるとベターです。
質問する場合は、前スレで指摘したように、
このスレで完結した質問になるように注意してください。
さらに、前スレやその前のすれへのリンクも張ってくれるとベターです。
Re:ソースステップ数
http://www.play21.jp/board/formz.cgi?ac ... &rln=45074
http://www.play21.jp/board/formz.cgi?ac ... &rln=44494
ご指摘ありがとうございました。
>nonさん
何かどんどん訳わからん状態に。。。
取りあえず完璧は無理なので教授を欺けるくらにはしたいですw
>たいちうさん
>今は質問は無いのね。
ありすぎるのでもう少し絞りたいと思いまして(泣
ご指摘ありがとうございました。
http://www.play21.jp/board/formz.cgi?ac ... &rln=44494
ご指摘ありがとうございました。
>nonさん
何かどんどん訳わからん状態に。。。
取りあえず完璧は無理なので教授を欺けるくらにはしたいですw
>たいちうさん
>今は質問は無いのね。
ありすぎるのでもう少し絞りたいと思いまして(泣
ご指摘ありがとうございました。

Re:ソースステップ数
> ありすぎるのでもう少し絞りたいと思いまして(泣
割と面倒なのが、テストデータの作成です。
前スレで、test1.c~test4.cがあったと思いますが、
もしかしてtest1~20位までが用意されているのでしょうか?
私が問題を出す立場ならば、採点用に必ず用意しますし、
場合によっては出題時に配布します。
また、私が仕事で作るならば必ずテストファーストで作ります。
あるなら、その分楽ができますし、
無いのならば、自分で作るのが近道でしょう。
現在、test1~4までが正しくカウントできるならば、
test5をカウントできるようにするのが次の目標です。
難しいテストデータはとりあえず飛ばしても良いですが、
今まで正しくカウントできたデータについては、
成績を下げないことが肝心です。
行き詰ってしまい最初から作り直し、という事もあるでしょう。
上級者はある程度先の見通しを立ててから作り始めることができますし、
上手にリファクタリングをすることもできます。
この課題を通して勉強中なのだから、作り直すことを覚悟しないと、
一歩も進めなくなります。
今、どのような状態なのかわかりませんが、
前スレからあまり変わっていないのならば、
nonさんの書くようにツーパスにしたり、
前スレで私が書いたソースを元にしたりする方が良いかもしれません。
割と面倒なのが、テストデータの作成です。
前スレで、test1.c~test4.cがあったと思いますが、
もしかしてtest1~20位までが用意されているのでしょうか?
私が問題を出す立場ならば、採点用に必ず用意しますし、
場合によっては出題時に配布します。
また、私が仕事で作るならば必ずテストファーストで作ります。
あるなら、その分楽ができますし、
無いのならば、自分で作るのが近道でしょう。
現在、test1~4までが正しくカウントできるならば、
test5をカウントできるようにするのが次の目標です。
難しいテストデータはとりあえず飛ばしても良いですが、
今まで正しくカウントできたデータについては、
成績を下げないことが肝心です。
行き詰ってしまい最初から作り直し、という事もあるでしょう。
上級者はある程度先の見通しを立ててから作り始めることができますし、
上手にリファクタリングをすることもできます。
この課題を通して勉強中なのだから、作り直すことを覚悟しないと、
一歩も進めなくなります。
今、どのような状態なのかわかりませんが、
前スレからあまり変わっていないのならば、
nonさんの書くようにツーパスにしたり、
前スレで私が書いたソースを元にしたりする方が良いかもしれません。
Re:ソースステップ数
>nonさんの書くようにツーパスにしたり
ツーパスというのはどういった処理なのでしょうか?
調べたのですがわからなかったです。。。orz
>前スレで私が書いたソースを元に
取りあえず今たいちうさんのソースを元にやっています。
ツーパスというのはどういった処理なのでしょうか?
調べたのですがわからなかったです。。。orz
>前スレで私が書いたソースを元に
取りあえず今たいちうさんのソースを元にやっています。
Re:ソースステップ数
A 1度目のファイル読み込みで
総行数のみを数える。他のことは何もしない。
B 同じファイルを再度読み込み、コメントと空白行を削除して、別名1でファイルに
書き込む。ここで、完全にコメントが削除できたかチェックできる。
C 別名1で保存したファイルを読み込み、プリプロセッサを削除したファイルをさらに
別名2で保存する。
D さらに別名2のファイルを読み込み、括弧のみ行を削除し、ファイルに保存する。
このように、何度もファイルを読み込みながら条件を絞ります。
いろんな処理が一度に出てこないので、わかりやすいプログラムになります。
AとBを一度に、CとDを一度に行うと、ファイルを読み込むのが2度で済みます。
このように中間ファイルを出力して処理を行うコンパイラがツーパスコンパイラです。
なお、一度で行うのがワンパスコンパイラといいます。
総行数のみを数える。他のことは何もしない。
B 同じファイルを再度読み込み、コメントと空白行を削除して、別名1でファイルに
書き込む。ここで、完全にコメントが削除できたかチェックできる。
C 別名1で保存したファイルを読み込み、プリプロセッサを削除したファイルをさらに
別名2で保存する。
D さらに別名2のファイルを読み込み、括弧のみ行を削除し、ファイルに保存する。
このように、何度もファイルを読み込みながら条件を絞ります。
いろんな処理が一度に出てこないので、わかりやすいプログラムになります。
AとBを一度に、CとDを一度に行うと、ファイルを読み込むのが2度で済みます。
このように中間ファイルを出力して処理を行うコンパイラがツーパスコンパイラです。
なお、一度で行うのがワンパスコンパイラといいます。
Re:ソースステップ数
なるほど。。。
初めて知りました!いろいろ勉強になります。
以前nonさんに教えていただいた方法がツーパスなんですね。
木曜日までって考えると自分には早いですね。
仕事の納期を考えるといかに大変か思い知らされました。
初めて知りました!いろいろ勉強になります。
以前nonさんに教えていただいた方法がツーパスなんですね。
木曜日までって考えると自分には早いですね。
仕事の納期を考えるといかに大変か思い知らされました。
Re:ソースステップ数
本コードとは関係ないのですが、
D(printf("表示"));
という文がある場合
#define DEBUGが定義されていれば
表示という文字が出力されると思うのですが、
なぜ#ifdefの文の下が#define D(x)ではいけないのでしょうか?
D(printf("表示"));というのが引数になると思ったのですが、
なぜ#define D(x) (x)と引数が2つ必要なのでしょうか?
#define DEBUG #ifdef DEBUG #define D(x) (x) #else #define D(x) #endifとなっていて例えば
D(printf("表示"));
という文がある場合
#define DEBUGが定義されていれば
表示という文字が出力されると思うのですが、
なぜ#ifdefの文の下が#define D(x)ではいけないのでしょうか?
D(printf("表示"));というのが引数になると思ったのですが、
なぜ#define D(x) (x)と引数が2つ必要なのでしょうか?
Re:ソースステップ数
プリプロセス時と実行時の2つの段階を混同しているようです。
ソースコードをコンパイルすると実行ファイルができます。
printfが実際に出力するのは、もちろん実行時です。
そしてマクロが動作するのは、コンパイルの前段階のプリプロセス時です。
#define A B
と書かれていた場合、ソースコード中のAを、
文法を無視してBに置換してから、コンパイルが行われます。
#define N 100
と書かれているのを見たことがあると思いますが、
コンパイル前に機械的にNが100に置き換わっています。
for (i = 0; i < N; i++)
↓
for (i = 0; i < 100; i++)
#define D(X) (X)
この場合は、ソースコード中のD(X)を(X)に置換します。
先の例と違い、Xは任意の文字列です。
D(printf("表示"));
↓
(printf("表示"));
出力したくない場合は、次のようにdefineされ、
#define D(X)
D(printf("表示"));
↓
;
という置換がされるので、これをコンパイルして作られた実行ファイルは
何も出力しません。
ソースコードをコンパイルすると実行ファイルができます。
printfが実際に出力するのは、もちろん実行時です。
そしてマクロが動作するのは、コンパイルの前段階のプリプロセス時です。
#define A B
と書かれていた場合、ソースコード中のAを、
文法を無視してBに置換してから、コンパイルが行われます。
#define N 100
と書かれているのを見たことがあると思いますが、
コンパイル前に機械的にNが100に置き換わっています。
for (i = 0; i < N; i++)
↓
for (i = 0; i < 100; i++)
#define D(X) (X)
この場合は、ソースコード中のD(X)を(X)に置換します。
先の例と違い、Xは任意の文字列です。
D(printf("表示"));
↓
(printf("表示"));
出力したくない場合は、次のようにdefineされ、
#define D(X)
D(printf("表示"));
↓
;
という置換がされるので、これをコンパイルして作られた実行ファイルは
何も出力しません。
Re:ソースステップ数
今テスト中でして以下ファイルの際に問題があったのでご教授お願いします。
総ステップ3、実ステップ3、処理ステップ3になってしまいます。
一体どの部分が悪いのでしょうか?
int i;/***//**//* int bb; int *k;総ステップ3、実ステップ1、処理ステップ1になる予定ですが
総ステップ3、実ステップ3、処理ステップ3になってしまいます。
一体どの部分が悪いのでしょうか?
Re:ソースステップ数
連レスすみません。
総ステップ4、実行ステップ3、処理ステップ3となってしまいます。
これは行中にコメントと空白を除き'/'だけの場合スペースフラグが0のままのため
空白又はコメント行とみなされ上手くカウントされません。
これはどうやってなおしたらよいでしょうか?
(3 + 2) / // 5 /*/*//*/*/12このテストの場合
総ステップ4、実行ステップ3、処理ステップ3となってしまいます。
これは行中にコメントと空白を除き'/'だけの場合スペースフラグが0のままのため
空白又はコメント行とみなされ上手くカウントされません。
これはどうやってなおしたらよいでしょうか?
Re:ソースステップ数
わかりにくくてすみません。
コメントとみなすわけではないです。
サンプルが曖昧ですね。。。申し訳ありません。
(3 + 2) / // 5 /*/*//*/*/12この3行目の最初のスラッシュは四則演算の÷の意味で使っていまして、
コメントとみなすわけではないです。
サンプルが曖昧ですね。。。申し訳ありません。
Re:ソースステップ数
> この3行目の最初のスラッシュは四則演算の÷の意味で使っていまして、
> コメントとみなすわけではないです。
私のNo:45757の指摘は、No:45753 に対してのものです。
それと2行目の間違いですよね?
No:45756 のデータについては、先日の私のプログラムでは 4 2 2 になりました。
4 4 4になるのが期待されていると思いますので、私のプログラムについては
手が空いたら修正して投稿します。
(期待する結果も必ず書いて下さい)
> コメントとみなすわけではないです。
私のNo:45757の指摘は、No:45753 に対してのものです。
それと2行目の間違いですよね?
No:45756 のデータについては、先日の私のプログラムでは 4 2 2 になりました。
4 4 4になるのが期待されていると思いますので、私のプログラムについては
手が空いたら修正して投稿します。
(期待する結果も必ず書いて下さい)
Re:ソースステップ数
>私のNo:45757の指摘は、No:45753 に対してのものです。
>それと2行目の間違いですよね?
その通りです。すみません。
期待する結果を書きもらしてしまいました。
こちらもすいませんでした。
>それと2行目の間違いですよね?
その通りです。すみません。
期待する結果を書きもらしてしまいました。
こちらもすいませんでした。
Re:ソースステップ数
一応確認ですが、私のサンプルを見るだけではなく、
実行して動きを追いかけてもらっているのですよね?
UpdateStepで期待通りにステップがカウントされているか、
期待と違うとしたら、その時点でのフラグはどうなっているか、
どの文字の処理が間違っていたから、行末でフラグが違ってしまっているのか。
ちゃんと動くようにしたい自分のプログラムでデバッグ実行するのは当然ですが、
(比較的)ちゃんと動いている私のプログラムもデバッグ実行し、
フラグの動きなどを追ってみるのも有効だと思います。
往々にして勘違いをしているものですから。
少なくとも私が主張するような結果がmiiさんの環境でも得られることは
確認してください。得られないならば、重要な前提条件に誤解等がある
可能性があります。
実行して動きを追いかけてもらっているのですよね?
UpdateStepで期待通りにステップがカウントされているか、
期待と違うとしたら、その時点でのフラグはどうなっているか、
どの文字の処理が間違っていたから、行末でフラグが違ってしまっているのか。
ちゃんと動くようにしたい自分のプログラムでデバッグ実行するのは当然ですが、
(比較的)ちゃんと動いている私のプログラムもデバッグ実行し、
フラグの動きなどを追ってみるのも有効だと思います。
往々にして勘違いをしているものですから。
少なくとも私が主張するような結果がmiiさんの環境でも得られることは
確認してください。得られないならば、重要な前提条件に誤解等がある
可能性があります。
Re:ソースステップ数
とりあえず原因はわかったのですが、
その部分を変えると大幅に結果が変わってきてしまいまして。。。orz
時間も無いので何とか組み込みたいと思いまして。
何か良い方法が無いかと探しています。
取りあえずプログラム添付します!
その部分を変えると大幅に結果が変わってきてしまいまして。。。orz
時間も無いので何とか組み込みたいと思いまして。
何か良い方法が無いかと探しています。
取りあえずプログラム添付します!
Re:ソースステップ数
やはり駄目でした。。。
他のテストケースは大丈夫なのですが、行中に'/'だけの場合
どうしても空白又はコメント行になってしまいます。
いい方法ないでしょうか?
他のテストケースは大丈夫なのですが、行中に'/'だけの場合
どうしても空白又はコメント行になってしまいます。
いい方法ないでしょうか?
Re:ソースステップ数
> 他のテストケースは大丈夫なのですが、行中に'/'だけの場合
> どうしても空白又はコメント行になってしまいます。
私のプログラムでもダメでしたね。
UpdateStepを次のように変更したらOKでした。
> どうしても空白又はコメント行になってしまいます。
私のプログラムでもダメでしたね。
UpdateStepを次のように変更したらOKでした。
void UpdateStep(Steps *steps, Flags *flags) { if (flags->commentFlg == 0 && flags->backChar == '/') flags->spaceFlg = 1; steps->allStep++; ...
Re:ソースステップ数
提示ありがとうございます。
取りあえずそれ自分もやってみたんですが、/の後に空白とかが入ると
やはり空白又はコメント行として扱われてしまいます。
極端な話
/△/としても空白又はコメント行になってしまいます(△は半角スペースです)
コメント以外の/を処理として判定するのがわかりません。
これはどうしようもないんでしょうか?
取りあえずそれ自分もやってみたんですが、/の後に空白とかが入ると
やはり空白又はコメント行として扱われてしまいます。
極端な話
/△/としても空白又はコメント行になってしまいます(△は半角スペースです)
コメント以外の/を処理として判定するのがわかりません。
これはどうしようもないんでしょうか?
Re:ソースステップ数
たいちうさんの先ほどのコードを
flags.backChar = flags.currentChar;
の上に書いたところ上手く動きました。
今のところ問題がなさそうなのでこのままテストを続けてみます。
flags.backChar = flags.currentChar;
の上に書いたところ上手く動きました。
今のところ問題がなさそうなのでこのままテストを続けてみます。
Re:ソースステップ数
やはり微妙にバグ出ました(笑
ただ教授がもう少し伸ばしてくれるそうなのでちょっと安心しました。
わからなかったらまたレスしますのでよろしくお願いします(たぶんすぐかもしれないです。。。orz)
ただ教授がもう少し伸ばしてくれるそうなのでちょっと安心しました。
わからなかったらまたレスしますのでよろしくお願いします(たぶんすぐかもしれないです。。。orz)
Re:ソースステップ数
> 極端な話
> /△/としても空白又はコメント行になってしまいます(△は半角スペースです)
>
> コメント以外の/を処理として判定するのがわかりません。
> これはどうしようもないんでしょうか?
プログラムで悩んでいるのは理解できますが、
この質問の仕方ではアドバイスできる人はいないでしょう。
私のプログラムでは/を正しく判定しているので、
参考にしてください、としか言いようがない。
あなたの現状のプログラムが判らないので、
デバッグする気になった人がいたとしても何もできません。
掲示板は愚痴を書いたり進捗を報告したりする場ではないはずです。
そのような投稿にならないように、1つ1つの質問を完全なものにしてください。
自分が何を知りたいか、答えを得るために何を相手に伝えるかを、よく考えます。
特に前者について、うまく説明できるように問題をまとめるうちに、
自力で解決できることも多いですし、教えてもらった後では、
自分に何が足りなかったのかに気付きやすくなります。
> /△/としても空白又はコメント行になってしまいます(△は半角スペースです)
>
> コメント以外の/を処理として判定するのがわかりません。
> これはどうしようもないんでしょうか?
プログラムで悩んでいるのは理解できますが、
この質問の仕方ではアドバイスできる人はいないでしょう。
私のプログラムでは/を正しく判定しているので、
参考にしてください、としか言いようがない。
あなたの現状のプログラムが判らないので、
デバッグする気になった人がいたとしても何もできません。
掲示板は愚痴を書いたり進捗を報告したりする場ではないはずです。
そのような投稿にならないように、1つ1つの質問を完全なものにしてください。
自分が何を知りたいか、答えを得るために何を相手に伝えるかを、よく考えます。
特に前者について、うまく説明できるように問題をまとめるうちに、
自力で解決できることも多いですし、教えてもらった後では、
自分に何が足りなかったのかに気付きやすくなります。