続ソースコードの行数
続ソースコードの行数
またお世話になります。
プログラムの方を整理してみました。
以下テストファイルでテストしています。
総ステップ数 = 48, 実ステップ数 = 29, 処理ステップ数 = 18
になる予定ですが、
総ステップ数 = 48, 実ステップ数 = 31, 処理ステップ数 = 20
になってしまいます。
どの部分のコメント行がコメントとして認識されていないのか分かりません。
デバッグで追い切れなくて困っています。
お力を貸していただけないでしょうか?
よろしくお願いいたします。
/**/#include <stdio.h>#include <stdlib.h>/* --- */int a;
#define LOKI 123
#define IKOL 123
#
/**/#define AA 123/***/
//#define BB 456
#define CC 789 /*
#define DD 741
*/
void main()
{ //ask
int a,b ;/* bbb */
a=0;/* ccc */ /*
a\n
a */
/* ddd */ /* ooo
a\n
a */
a=0 ;/* eee */ /* */ /* */
//aaa
b=a ;//
b=a ; /* b */b=b;
printf( "\" " ) ;
b=1 ;
while(a!=b)
{ a=b ;
}
// printf( "%d\n",LOKI ) ;
/*/
int g;
*/
}
int main2()
{ int j;/*
*/ int i;/***//**//*
int bb;
*/
// int cc;
for (i = 9; i< 10; i++) {
/**/{/**/ printf("%d\n", i);
printf("#");
printf("}");
printf("{");
}} // aaaa
/**/}}
プログラムの方を整理してみました。
以下テストファイルでテストしています。
総ステップ数 = 48, 実ステップ数 = 29, 処理ステップ数 = 18
になる予定ですが、
総ステップ数 = 48, 実ステップ数 = 31, 処理ステップ数 = 20
になってしまいます。
どの部分のコメント行がコメントとして認識されていないのか分かりません。
デバッグで追い切れなくて困っています。
お力を貸していただけないでしょうか?
よろしくお願いいたします。
/**/#include <stdio.h>#include <stdlib.h>/* --- */int a;
#define LOKI 123
#define IKOL 123
#
/**/#define AA 123/***/
//#define BB 456
#define CC 789 /*
#define DD 741
*/
void main()
{ //ask
int a,b ;/* bbb */
a=0;/* ccc */ /*
a\n
a */
/* ddd */ /* ooo
a\n
a */
a=0 ;/* eee */ /* */ /* */
//aaa
b=a ;//
b=a ; /* b */b=b;
printf( "\" " ) ;
b=1 ;
while(a!=b)
{ a=b ;
}
// printf( "%d\n",LOKI ) ;
/*/
int g;
*/
}
int main2()
{ int j;/*
*/ int i;/***//**//*
int bb;
*/
// int cc;
for (i = 9; i< 10; i++) {
/**/{/**/ printf("%d\n", i);
printf("#");
printf("}");
printf("{");
}} // aaaa
/**/}}
Re:続ソースコードの行数
以下のようなテストファイルでもテストしたのですが
総ステップ数 = 10, 実ステップ数 = 3, 処理ステップ数 = 2
というふうに予定通り出るので違いがわかりません(泣
int a;
/* // komen
kome
meok
*/
int// dddddddddddddddddddint/*komu*/
/*komy
*/
//dse /*iny*/
}
総ステップ数 = 10, 実ステップ数 = 3, 処理ステップ数 = 2
というふうに予定通り出るので違いがわかりません(泣
int a;
/* // komen
kome
meok
*/
int// dddddddddddddddddddint/*komu*/
/*komy
*/
//dse /*iny*/
}
Re:続ソースコードの行数
printfデバッグしましょうと言っているのにやってくれない・・(泣
まあ、何をどうすればよいか分かっていなさそうなので代わりにやってみました。
1行の内容が表示された後、その時の総行数が表示されます。
また、その行がコメント又は空白行、プリプロセッサ行、中括弧だけの行のいずれかに
該当する場合はそれも出力されます。
アルゴリズム自体には手を入れていませんが、未初期化のallStepをいきなり
使用していたので0で初期化しておきました。
問題があるのは赤字の部分のようですね。
その前の行で間違って1行コメントと判断してしまっているような予感がします。
int main2()
{ int j;/*
*/ int i;/***//**//*
int bb;
*/
// int cc;
付け足したデバッグ用の出力(Dというマクロ)は「#define DEBUG」の行を
コメントアウトするとコンパイル時に消滅します。
デバッグが終わって、いらなければDという文字で検索して消して下さい。
まあ、何をどうすればよいか分かっていなさそうなので代わりにやってみました。
1行の内容が表示された後、その時の総行数が表示されます。
また、その行がコメント又は空白行、プリプロセッサ行、中括弧だけの行のいずれかに
該当する場合はそれも出力されます。
アルゴリズム自体には手を入れていませんが、未初期化のallStepをいきなり
使用していたので0で初期化しておきました。
問題があるのは赤字の部分のようですね。
その前の行で間違って1行コメントと判断してしまっているような予感がします。
int main2()
{ int j;/*
*/ int i;/***//**//*
int bb;
*/
// int cc;
付け足したデバッグ用の出力(Dというマクロ)は「#define DEBUG」の行を
コメントアウトするとコンパイル時に消滅します。
デバッグが終わって、いらなければDという文字で検索して消して下さい。
Re:続ソースコードの行数
ありがとうございます。
>printfデバッグしましょうと言っているのにやってくれない・・(泣
すいません。いろいろやってみたんですが、わからなくて消してしまいました。。
これは取っておいた方が良いのでしょうか?
>何をどうすればよいか分かっていなさそうなので
そうですね(汗
どうすればいいかすぐ浮かんでこないです(T_T)
訓練しないと駄目ですよね。。
今からコンパイルして確認してみます!
>printfデバッグしましょうと言っているのにやってくれない・・(泣
すいません。いろいろやってみたんですが、わからなくて消してしまいました。。
これは取っておいた方が良いのでしょうか?
>何をどうすればよいか分かっていなさそうなので
そうですね(汗
どうすればいいかすぐ浮かんでこないです(T_T)
訓練しないと駄目ですよね。。
今からコンパイルして確認してみます!
Re:続ソースコードの行数
こういうデバッグ方法もあるのですね。
ありがとうございます!
動いちゃった感が満載です。。。他のファイルでテストしてみても上手くいったのですが、
どうも心配です(泣
これでいいのでしょうか?
ありがとうございます!
// 非コメント状態で1行コメントの開始文字が来た場合 if (commentFlg == 0 && currentChar == '/' && backChar == '/') { commentFlg = 1; } // ココを追加 if (commentFlg == -1 && currentChar == '*' && backChar == '/') { commentFlg = 2; } // 非コメント状態で複数行コメントの開始文字が来た場合 else if (commentFlg == 0 && currentChar == '*' && backChar == '/') { commentFlg = 2; skipOneCharFlg = 2; } // /*から1文字読み飛ばした後で複数行コメントの終了文字が来た場合 else if (commentFlg == 2 && skipOneCharFlg == 0 && currentChar == '/' && backChar == '*') { commentFlg = -1; skipTwoCharFlg = 2; }やはり1行コメントとして扱われていたので、上記文を入れてみて上手くはいったのですが、
動いちゃった感が満載です。。。他のファイルでテストしてみても上手くいったのですが、
どうも心配です(泣
これでいいのでしょうか?
Re:続ソースコードの行数
今日の4時が何なのか分かりませんが(前スレをよく読めば分かるのかな?)、
何が目的なのでしょうか?
4時がレポートの提出期限だとしたら、
一応動くプログラムなら及第点は取れるでしょう。
完璧なものが欲しいならば、締め切りなど意識せずに、
好きなだけテストして、自分で解決できない不具合を発見したら
あらためて質問すればよいでしょう。
何が目的なのでしょうか?
4時がレポートの提出期限だとしたら、
一応動くプログラムなら及第点は取れるでしょう。
完璧なものが欲しいならば、締め切りなど意識せずに、
好きなだけテストして、自分で解決できない不具合を発見したら
あらためて質問すればよいでしょう。
Re:続ソースコードの行数
自分でも処理の流れがわかりにくくなりそうだなぁと感じ出したら
フローチャートを使ってプログラムを組むのも手です
http://homepage1.nifty.com/Iruka/nifty/ ... page2.html
って、4時までだったら無理ですね
フローチャートを使ってプログラムを組むのも手です
http://homepage1.nifty.com/Iruka/nifty/ ... page2.html
って、4時までだったら無理ですね
Re:続ソースコードの行数
取りあえず提出は終えました。皆様ありがとうございました。
しかしバグがあるので直したいと思います!
/**/#include <stdio.h>#include <stdlib.h>/* --- */int a;
#define LOKI 123
#define IKOL 123
#
/**/#define AA 123/***/
//#define BB 456
#define CC 789 /*
#define DD 741
*/
void main()
{ //ask
int a,b ;/* bbb */
a=0;/* ccc */ /*
a\n
a */
/* ddd */ /* ooo
a\n
a */
a=0 ;/* eee */ /* */ /* */
//aaa
b=a ;//
b=a ; /* b */b=b;
printf( "\" " ) ;
b=1 ;
while(a!=b)
{ a=b ;
}
// printf( "%d\n",LOKI ) ;
/*/
int g;
*/
}
int main2()
{ int j;/*
*/ int i;/***//**//*
int bb;
*/
// int cc;
for (i = 9; i< 10; i++) {
/**/{/**/ printf("%d\n", i);
}} // aaaa
/**/}}
以上のファイルの37行目が1行コメントとみなされてしまっています。
これはどうやってなおせばいいのでしょうか?
しかしバグがあるので直したいと思います!
/**/#include <stdio.h>#include <stdlib.h>/* --- */int a;
#define LOKI 123
#define IKOL 123
#
/**/#define AA 123/***/
//#define BB 456
#define CC 789 /*
#define DD 741
*/
void main()
{ //ask
int a,b ;/* bbb */
a=0;/* ccc */ /*
a\n
a */
/* ddd */ /* ooo
a\n
a */
a=0 ;/* eee */ /* */ /* */
//aaa
b=a ;//
b=a ; /* b */b=b;
printf( "\" " ) ;
b=1 ;
while(a!=b)
{ a=b ;
}
// printf( "%d\n",LOKI ) ;
/*/
int g;
*/
}
int main2()
{ int j;/*
*/ int i;/***//**//*
int bb;
*/
// int cc;
for (i = 9; i< 10; i++) {
/**/{/**/ printf("%d\n", i);
}} // aaaa
/**/}}
以上のファイルの37行目が1行コメントとみなされてしまっています。
これはどうやってなおせばいいのでしょうか?
Re:続ソースコードの行数
> これはどうやってなおせばいいのでしょうか?
1.質問の仕方
まず回答者に自分の抱えている問題を説明しましょう。
「プログラムがデータを処理して結果を得る」が期待と違う。
↓
実行したプログラム・処理したデータ・得られた結果・期待する結果を
伝えなくてはいけません。
2.デバッグの方法(1)
44行のデータを処理してバグを検出できる。
↓
もっと小さいデータでバグを検出できるようにする。
テストデータの内でバグ発生と関連なさそうな部分を削除して、
バグが再現するかどうかを確認しましょう。
最終的には1~2行のデータでバグを発生させられるかもしれません。
これだけでも大きな進展です。
3.デバッグの方法(2)
データを小さくした次は、プログラムを小さくします。
コメントの行数にバグがあるならば、それと関係ない部分を
削除します。前スレも含めたやり取りを流し読みしただけですが、
コメント行数と関係ない機能もあると思います。
今回はコメント行数のバグさえ再現すればよいので、
それ以外のフラグなども削除してしまいましょう。
削除しすぎてバグが発生しなくなってしまったら、
元に戻します。
データとプログラムが小さくなれば、それだけデバッグは楽になります。
1.質問の仕方
まず回答者に自分の抱えている問題を説明しましょう。
「プログラムがデータを処理して結果を得る」が期待と違う。
↓
実行したプログラム・処理したデータ・得られた結果・期待する結果を
伝えなくてはいけません。
2.デバッグの方法(1)
44行のデータを処理してバグを検出できる。
↓
もっと小さいデータでバグを検出できるようにする。
テストデータの内でバグ発生と関連なさそうな部分を削除して、
バグが再現するかどうかを確認しましょう。
最終的には1~2行のデータでバグを発生させられるかもしれません。
これだけでも大きな進展です。
3.デバッグの方法(2)
データを小さくした次は、プログラムを小さくします。
コメントの行数にバグがあるならば、それと関係ない部分を
削除します。前スレも含めたやり取りを流し読みしただけですが、
コメント行数と関係ない機能もあると思います。
今回はコメント行数のバグさえ再現すればよいので、
それ以外のフラグなども削除してしまいましょう。
削除しすぎてバグが発生しなくなってしまったら、
元に戻します。
データとプログラムが小さくなれば、それだけデバッグは楽になります。
Re:続ソースコードの行数
int i;/***//**//*
int bb;
*/
取りあえず
/***//**//*の部分が1行コメントとして扱われています。
ただ修正方法がわからないため困っています。
プログラムを小さくですか。。。難しいです(T_T)
int bb;
*/
取りあえず
/***//**//*の部分が1行コメントとして扱われています。
ただ修正方法がわからないため困っています。
プログラムを小さくですか。。。難しいです(T_T)
Re:続ソースコードの行数
ぱっと見ただけだから間違ってるかもしれないけど
「/*」「*/」を判定した後囲みコメントの最後の「/」と次の「/」があるせいで以降が「//」扱いになってるんじゃない?
「*/」の後はbackCharにダミーの文字でも詰めておくと上手くいくかもね。
「/*」「*/」を判定した後囲みコメントの最後の「/」と次の「/」があるせいで以降が「//」扱いになってるんじゃない?
「*/」の後はbackCharにダミーの文字でも詰めておくと上手くいくかもね。
Re:続ソースコードの行数
「/*」「*/」を判定した後囲みコメントの最後の「/」と次の「/」があるせいで以降が「//」扱いになってるんじゃない?
その通りなんですよね。
ただダミーに詰めるというのはもう一度fgetcを使うということでしょうか?
その通りなんですよね。
ただダミーに詰めるというのはもう一度fgetcを使うということでしょうか?
Re:続ソースコードの行数
何の本からかは忘れましたが
私のメモによると
プログラムを作成するにあたって
① 正しい問題を考えよ
② いろいろな解法を比較検討せよ
③ データをよく見よ
④ 封筒の裏の計算を使え
⑤ 「対称性」を利用せよ
⑥ コンポーネント(部品)を考えてデザインせよ
⑦ 試作品を作れ
⑧ 必要なら妥協せよ
⑨ プログラムを複雑にしてはいけない
⑩ エレガントに
ということです
私のメモによると
プログラムを作成するにあたって
① 正しい問題を考えよ
② いろいろな解法を比較検討せよ
③ データをよく見よ
④ 封筒の裏の計算を使え
⑤ 「対称性」を利用せよ
⑥ コンポーネント(部品)を考えてデザインせよ
⑦ 試作品を作れ
⑧ 必要なら妥協せよ
⑨ プログラムを複雑にしてはいけない
⑩ エレガントに
ということです
Re:続ソースコードの行数
>「*/」の後はbackCharにダミーの文字でも詰めておくと上手くいくかもね。
入れてみたんですが結果は変わらずでした。
難しいですね。。。
方法が思いつかないんですよね(泣)
入れてみたんですが結果は変わらずでした。
難しいですね。。。
方法が思いつかないんですよね(泣)
Re:続ソースコードの行数
この問題を解くにはオートマン記法で解いた方がわかりやすいですね
オートマン記法に関する情報です
http://f29.aaa.livedoor.jp/~snaka/PukiW ... 3%A4%C8BNF
時間あったので解いてみました
ただ、ステップというのが 何を意味しているのか分からないので
コメントの数しか数えれてないです
オートマン記法に関する情報です
http://f29.aaa.livedoor.jp/~snaka/PukiW ... 3%A4%C8BNF
時間あったので解いてみました
#include <stdio.h> #include <stdlib.h> #include <string.h> static char g_szText[256][1024]; static int g_iMode = 0; static int g_iComment = 0; // 一行コメントの数 static int g_iComment2 = 0; // 複数行コメントの数 static int g_iStep = 0; // ステップ(?)行数の数 //--------------------------------------------- void Step3() { printf( "g_iComment: %d\n", g_iComment ); printf( "g_iComment2:%d\n", g_iComment2); printf( "g_iStep: %d\n", g_iStep ); } //--------------------------------------------- void Step2() { int i; for( i=0; strlen(g_szText)>0; i++ ) { int j; for( j=0; j<strlen(g_szText); j++ ) { if( g_szText[j] == '\n' ) g_iStep++; switch( g_iMode ) { case 0: if( g_szText[j] == '/' ) { g_iMode = 1; } break; case 1: if( g_szText[j] == '/' ) { g_iMode = 2; // //一行コメントの開始 } if( g_szText[j] == '*' ) { g_iMode = 3; // /* の開始 } break; case 2: if( g_szText[j] == '\n' ) { g_iMode = 0; g_iComment++; } break; case 3: if( g_szText[j] == '*' ) { g_iMode = 4; } break; case 4: if( g_szText[j] == '/' ) { g_iMode = 0; g_iComment2++; } break; } } } } //--------------------------------------------- // hoge.cpp の読み込み void Step1() { // hoge.cpp で埋め込み込み FILE *file = fopen( "hoge.cpp", "rt" ); if( file == NULL ) { printf( "hoge.cpp が見つからない\n" ); return; } char buf[1024]; memset( g_szText, 0, sizeof(g_szText) ); int p = 0; while( !feof(file) ) { memset( buf, 0, sizeof(buf) ); fgets( buf, sizeof(buf), file ); strcpy( g_szText[p++], buf ); } fclose( file ); file = 0; } //--------------------------------------------- int main() { Step1(); Step2(); Step3(); return 0; }
ただ、ステップというのが 何を意味しているのか分からないので
コメントの数しか数えれてないです
Re:続ソースコードの行数
ありがとうございます。
何か基本情報の試験で聞いたことがあるくらいです(笑
何やら難しそうですね(汗
違う方法として後で見てみます。
ご提示ありがとうございました!
ただ今はとりあえず提示している
ソースでやりたいと思います。
何か基本情報の試験で聞いたことがあるくらいです(笑
何やら難しそうですね(汗
違う方法として後で見てみます。
ご提示ありがとうございました!
ただ今はとりあえず提示している
ソースでやりたいと思います。
Re:続ソースコードの行数
何やら添削された後返ってきたんですがバグを指摘されてしまいました。
<test1.c>
/*/*/
a[EOF]
<test2.c>
{
}[EOF]
<test3.c>
{
/*/*/}
<test4.c>
/**//**//**/[EOF]
AllStep RealStep LogicStep
test1.c 2 0 0
test2.c 2 1 0
test3.c 2 1 0
test4.c 1 1 1
となりますが、正しくは
AllStep RealStep LogicStep
test1.c 2 1 1
test2.c 2 2 0
test3.c 2 2 0
test4.c 1 0 0
以上のようにならないといけない部分を指摘されました(泣
フラグ等の絡みが多すぎて、
デバッグして原因がわかっても直せる自信が無いです。。。(泣
何処をどう直せばいいのでしょうか?
ご教授お願い致します。
<test1.c>
/*/*/
a[EOF]
<test2.c>
{
}[EOF]
<test3.c>
{
/*/*/}
<test4.c>
/**//**//**/[EOF]
AllStep RealStep LogicStep
test1.c 2 0 0
test2.c 2 1 0
test3.c 2 1 0
test4.c 1 1 1
となりますが、正しくは
AllStep RealStep LogicStep
test1.c 2 1 1
test2.c 2 2 0
test3.c 2 2 0
test4.c 1 0 0
以上のようにならないといけない部分を指摘されました(泣
フラグ等の絡みが多すぎて、
デバッグして原因がわかっても直せる自信が無いです。。。(泣
何処をどう直せばいいのでしょうか?
ご教授お願い致します。
Re:続ソースコードの行数
> 元のソースに戻ってにらめっこばかりです
私の経験上、あまり経験が無い人がソースを眺めてバグを見つけるのは難しいです。
修正→実行→修正を繰り返すほうがよっぽど早いと思います。
printfデバッグを行えばどの段階で、期待した結果が得られていないかはすぐにわかるはずです。
その上で、どこが間違っているか(推測でもいいです)を考えてみてください。
あと、一度自分がCPUになったつもりで手作業で実行トレースしてみるのもいいかもしれませんね。
> 何処をどう直せばいいのでしょうか?
> どうすればよいのでしょうか?
努力はしているのでしょうけどこちらには結果が見えませんから、これでは丸投げしているの大して変わらないですよ。
ここがおかしいと思ってこう直してみたけどダメだった、とか書いてるならもっと答えも付きやすいと思いますよ。
私の経験上、あまり経験が無い人がソースを眺めてバグを見つけるのは難しいです。
修正→実行→修正を繰り返すほうがよっぽど早いと思います。
printfデバッグを行えばどの段階で、期待した結果が得られていないかはすぐにわかるはずです。
その上で、どこが間違っているか(推測でもいいです)を考えてみてください。
あと、一度自分がCPUになったつもりで手作業で実行トレースしてみるのもいいかもしれませんね。
> 何処をどう直せばいいのでしょうか?
> どうすればよいのでしょうか?
努力はしているのでしょうけどこちらには結果が見えませんから、これでは丸投げしているの大して変わらないですよ。
ここがおかしいと思ってこう直してみたけどダメだった、とか書いてるならもっと答えも付きやすいと思いますよ。
Re:続ソースコードの行数
> 私の経験上、あまり経験が無い人がソースを眺めてバグを見つけるのは難しいです。
これができるのは、一字一句にいたるまで、自分が理解できないコードを書いていない場合だけですね。
これができるのは、一字一句にいたるまで、自分が理解できないコードを書いていない場合だけですね。
Re:続ソースコードの行数
う~ん。このプログラムだと、EOF行に1文字しか存在しない場合
必ずspaceFlgが0のままなので、空白行と判断されてしまいます。
それを修正しようとしたのですが、方法が分からず適当にやっていたら
コードが動かなくなり、最初に戻るという永久パターンに(泣
上記テストファイルで行った結果を適正な結果にするためには
根本的に見直さないといけないんでしょうか?
必ずspaceFlgが0のままなので、空白行と判断されてしまいます。
それを修正しようとしたのですが、方法が分からず適当にやっていたら
コードが動かなくなり、最初に戻るという永久パターンに(泣
上記テストファイルで行った結果を適正な結果にするためには
根本的に見直さないといけないんでしょうか?
Re:続ソースコードの行数
途中から入ってきたので、全部は読んでませんが、原因が分かっているのならばそれを解決する方法を継ぎ足せばよいだけではないでしょうか?
>>EOF行に1文字しか存在しない場合
不具合の原因は突き止めているんですよね?
>>EOF行に1文字しか存在しない場合
不具合の原因は突き止めているんですよね?
Re:続ソースコードの行数
> AllStep RealStep LogicStep
時間ができたらデバッグしてみるから、これらの定義を書いてちょうだい。
それとNo.44664のtest1.c~test4.cの他にファイルがあるなら、
ファイルの内容と期待される結果も。
私はいつまでにできるという約束はできないので、年明けになるかもしれないけど、
必要な事を書いておいたら、他の回答者がもっと早く答えてくれるかもしれない。
前スレまで丁寧に読み直して、仕様を読み取るよう努力をする回答者は少ないと思うよ。
前スレでも、後から後から機能が追加されたような気がするので、
最終的な仕様をまとめてみて下さい。
もしかしてmiiさんも把握できてないんじゃない?
時間ができたらデバッグしてみるから、これらの定義を書いてちょうだい。
それとNo.44664のtest1.c~test4.cの他にファイルがあるなら、
ファイルの内容と期待される結果も。
私はいつまでにできるという約束はできないので、年明けになるかもしれないけど、
必要な事を書いておいたら、他の回答者がもっと早く答えてくれるかもしれない。
前スレまで丁寧に読み直して、仕様を読み取るよう努力をする回答者は少ないと思うよ。
前スレでも、後から後から機能が追加されたような気がするので、
最終的な仕様をまとめてみて下さい。
もしかしてmiiさんも把握できてないんじゃない?
Re:続ソースコードの行数
バグさん初めまして
>>EOF行に1文字しか存在しない場合
そうなんですが、どうやったらいいのか思いつきません(泣
皆さんどうしてそんなに早く思いつくんでしょうか?
たいちうさん
レスありがとうございます。
期限が月曜の午前中までとなってしまったので取りあえず頑張ります(T_T)
他のファイルについては手元にないので明日研究室につき次第添付します!
仕様としましては、
file_path で指定された複数のファイルに対して、ステップ数の算出を行う。
file_path が指定されない場合、エラーメッセージ1を表示し、プログラムを終了する。
file_path が存在しない場合、エラーメッセージ2を出力し、次のファイルの処理
に進む。
各ファイルごとにステップ数を算出し、結果を表示する(結果例参照)。
算出するステップ数は、以下のとおりである。
1.総ステップ数 (すべての行数)
2.実ステップ数 (コメント行および空白行を除いた行数)
3.ロジックステップ数 (実ステップ数のうち、プリプロセッサ行・
中カッコのみの行を除いたステップ数)
という風になっています。
総ステップはEOFまでの行です。EOFだけの場合は総ステップに含めず、何か1文字でもあれば総ステップとします。
実ステップはコメントと空白行を除いた数になります。今回はコメント行と空白行を一緒にカウントして総ステップから
引くことで実ステップを算出するようにしています。コメントについてはネスト有りの場合でも正確にカウントできるように
しなければなりません。尚、出来ればダブルコーテーション内の文字列についてはカウントしないといったこともするんですが、
それは次の課題になりそうです。
ロジックステップのプリプロセッサ行はシャープが来たらカウントするようにします。
中カッコのみの行は}}など2個続いても中カッコだけならカウントします(中カッコ以外にスペース以外の文字があった場合はカウントしない)
後は、コンパイルが通るファイルというのが条件のようです。
たとえば
int a;
とあれば本来int main(void) {}
の中に書かれなけばいけないですが、それが書かれていると見なして上記テストファイルのようにint a;だけでカウント出来るようにしなければなりません。
ただ例として##defineなどはコンパイル不可なので動きは不定で構わないことなります。
不明点などありましたらこちらから連絡していただければありがたいです。
よろしくお願いします。
>>EOF行に1文字しか存在しない場合
そうなんですが、どうやったらいいのか思いつきません(泣
皆さんどうしてそんなに早く思いつくんでしょうか?
たいちうさん
レスありがとうございます。
期限が月曜の午前中までとなってしまったので取りあえず頑張ります(T_T)
他のファイルについては手元にないので明日研究室につき次第添付します!
仕様としましては、
file_path で指定された複数のファイルに対して、ステップ数の算出を行う。
file_path が指定されない場合、エラーメッセージ1を表示し、プログラムを終了する。
file_path が存在しない場合、エラーメッセージ2を出力し、次のファイルの処理
に進む。
各ファイルごとにステップ数を算出し、結果を表示する(結果例参照)。
算出するステップ数は、以下のとおりである。
1.総ステップ数 (すべての行数)
2.実ステップ数 (コメント行および空白行を除いた行数)
3.ロジックステップ数 (実ステップ数のうち、プリプロセッサ行・
中カッコのみの行を除いたステップ数)
という風になっています。
総ステップはEOFまでの行です。EOFだけの場合は総ステップに含めず、何か1文字でもあれば総ステップとします。
実ステップはコメントと空白行を除いた数になります。今回はコメント行と空白行を一緒にカウントして総ステップから
引くことで実ステップを算出するようにしています。コメントについてはネスト有りの場合でも正確にカウントできるように
しなければなりません。尚、出来ればダブルコーテーション内の文字列についてはカウントしないといったこともするんですが、
それは次の課題になりそうです。
ロジックステップのプリプロセッサ行はシャープが来たらカウントするようにします。
中カッコのみの行は}}など2個続いても中カッコだけならカウントします(中カッコ以外にスペース以外の文字があった場合はカウントしない)
後は、コンパイルが通るファイルというのが条件のようです。
たとえば
int a;
とあれば本来int main(void) {}
の中に書かれなけばいけないですが、それが書かれていると見なして上記テストファイルのようにint a;だけでカウント出来るようにしなければなりません。
ただ例として##defineなどはコンパイル不可なので動きは不定で構わないことなります。
不明点などありましたらこちらから連絡していただければありがたいです。
よろしくお願いします。
Re:続ソースコードの行数
バグ解析なんて慣れです。ここ居る人達は少なくとも数年プログラムに携わってるから色々な手法でバグの原因を見つける術を見つけ、実行しています。
現在の状況はバグ原因の解析難ではなく修正対応が分からないという事なので、
もし現状で「自分でもワケが分からない」というのなら一度設計を再考してみてはどうでしょうか?
確認ですが、現在は「提出は終わったが、出来れば自分の納得出来る精度まで上げたい」という意思で取り組んでいるのですよね?
そうだとした前提として、提案ですがごちゃごちゃする原因はコメント等によるフラグ管理だと思うので
まずはコメント等をはずした文字列バッファをカウント処理前に作成するようにしてみてはどうでしょうか?
また、総ステップは実質ひたすら「\n」を調べるという力技でも出せますので別途計算する等
「一度に全部しようとして出来ないのであれば処理を小分けする」というのはどうでしょう。
現在の状況はバグ原因の解析難ではなく修正対応が分からないという事なので、
もし現状で「自分でもワケが分からない」というのなら一度設計を再考してみてはどうでしょうか?
確認ですが、現在は「提出は終わったが、出来れば自分の納得出来る精度まで上げたい」という意思で取り組んでいるのですよね?
そうだとした前提として、提案ですがごちゃごちゃする原因はコメント等によるフラグ管理だと思うので
まずはコメント等をはずした文字列バッファをカウント処理前に作成するようにしてみてはどうでしょうか?
また、総ステップは実質ひたすら「\n」を調べるという力技でも出せますので別途計算する等
「一度に全部しようとして出来ないのであれば処理を小分けする」というのはどうでしょう。
Re:続ソースコードの行数
ねこさんレスありがとうございます。
>バグ解析なんて慣れです。ここ居る人達は少なくとも数年プログラムに携わってるから
色々な手法でバグの原因を見つける術を見つけ、実行しています。
皆さん凄いです。。。自分はこれまでまともにプログラミングしなかったツケが。。。(汗
>現在は「提出は終わったが、出来れば自分の納得出来る精度まで上げたい」
一度提出した後上記バグを指摘されまして、それを直して提出する期限が
月曜の午前中になってしまいました。。。orz
ですので、設計を見直すのはそれを提出した後、どんな方法がいいのか考えてみたいと思います。
取りあえず提出日が近いので今のコードを元にやりたいと思っています。
>提案ですがごちゃごちゃする原因はコメント等によるフラグ管理だと思うので
これはnonさんに教えていただいたこともあり、こちらの方法で取りあえず完成させたいと思います。
というかプログラムって設計が大事なことに気付きました^^;
コーディングはやりたいことをコードにしてるだけですもんね。。。
来年はもっと頑張らないと(笑
>バグ解析なんて慣れです。ここ居る人達は少なくとも数年プログラムに携わってるから
色々な手法でバグの原因を見つける術を見つけ、実行しています。
皆さん凄いです。。。自分はこれまでまともにプログラミングしなかったツケが。。。(汗
>現在は「提出は終わったが、出来れば自分の納得出来る精度まで上げたい」
一度提出した後上記バグを指摘されまして、それを直して提出する期限が
月曜の午前中になってしまいました。。。orz
ですので、設計を見直すのはそれを提出した後、どんな方法がいいのか考えてみたいと思います。
取りあえず提出日が近いので今のコードを元にやりたいと思っています。
>提案ですがごちゃごちゃする原因はコメント等によるフラグ管理だと思うので
これはnonさんに教えていただいたこともあり、こちらの方法で取りあえず完成させたいと思います。
というかプログラムって設計が大事なことに気付きました^^;
コーディングはやりたいことをコードにしてるだけですもんね。。。
来年はもっと頑張らないと(笑
Re:続ソースコードの行数
なるほどあんまり改修すると再提出後にもバグると。
じゃあwhile直後に総ステップカウント、及びコメント関連をスキップする処理を加えるとか
※デバッグはしてません。
完全にコメント系を上部に集約する分直す手間は楽になると思います。使う使わないはご自由に。
nonさんが最初に提示してた3の処理をwhile内で無理矢理作っただけなので
その後の経緯でこれじゃまずいって事があるなら
もう1ループごとにフラグ全部printfして紙に書いてアルゴリズムフロー書いて直すしかないですね。
じゃあwhile直後に総ステップカウント、及びコメント関連をスキップする処理を加えるとか
※デバッグはしてません。
int imode = 0; // 現在の処理モード。0:通常モード 1:単行コメント処理中 2:範囲コメント処理中 int kaigyo = 0; // 改行数( 総ステップ数。1文字取得後にチェックして「\n」だったら1加算 int moji = 0; // 改行間の文字数。EOFが有効行の後ろに付いていたら改行数が1少なくなるのでwhile抜けた後「moji>0」ならkaigyoを1加算する int enmark = 0; // 単行コメントの半角「¥」対応用 while( ( currentChar = fgetc( fp ) ) != EOF ) { // 総ステップ数 if( currentChar == '\n' ) { kaigyo++; moji = 0; } else { moji++; } switch( imode ) { case 0: // 1行コメントの開始文字が来た場合 if( currentChar == '/' && backChar == '/' ) { // 1行コメントモードへ imode = 1; // 前回文字を保持して次ループ処理へ backChar = currentChar; continue; } // 範囲コメントの開始文字が来た場合 if( currentChar == '*' && backChar == '/' ) { // 範囲コメントモードへ imode = 2; // 前回文字を保持して次ループ処理へ backChar = currentChar; continue; } break; case 1: if( currentChar == '\n' ) { if( enmark == 0) imode = 0; else enmark--; } else if( currentChar == '\\' ) enmark++; // 前回文字を保持して次ループ処理へ backChar = currentChar; continue; break; case 2: if( backChar == '*' && CurrentChar == '/' ) { imode = 0; backChar = 0; // 次のループ処理で「//」や「/*」の判定にならないようにbackCharをクリア continue; } // 前回文字を保持して次ループ処理へ backChar = currentChar; continue; break; } // 既存処理( 色々調整は必要だと思う ) }こんな風にしてコメント系をステップ処理からは無視して、既存処理って書いてるところからコメント関係以外の処理を記述していくと混乱しなくて済むかもしれません。
完全にコメント系を上部に集約する分直す手間は楽になると思います。使う使わないはご自由に。
nonさんが最初に提示してた3の処理をwhile内で無理矢理作っただけなので
その後の経緯でこれじゃまずいって事があるなら
もう1ループごとにフラグ全部printfして紙に書いてアルゴリズムフロー書いて直すしかないですね。
Re:続ソースコードの行数
case 1: if( currentChar == '\n' ) { if( enmark == 0) imode = 0; else enmark--; } else if( currentChar == '\\' ) enmark++; // 前回文字を保持して次ループ処理へ backChar = currentChar; continue; break; case 2: if( backChar == '*' && CurrentChar == '/' ) { imode = 0; backChar = 0; // 次のループ処理で「//」や「/*」の判定にならないようbackCharをクリア continue; } // 前回文字を保持して次ループ処理へ backChar = currentChar; continue; break;ここのcontinue文以下なんですが、これだとbreakが実行されないと思います。
これはbreak文の上の分をelse句にいれてやればいいんでしょうか?
Re:続ソースコードの行数
組み込んでみたんですが、希望通り動かずグダグダです(T_T)
自分の応用力とセンスのなさにガッカリです。。。
せっかく教えていただいたのにすみません。
自分の応用力とセンスのなさにガッカリです。。。
せっかく教えていただいたのにすみません。
Re:続ソースコードの行数
miiさんの望む形とは違うと思うけど、
直接関係ない部分は遠慮なく削除して、
test1.c~test4.cをパスするようにはしました。
No:44632で私が書いた、プログラムを小さくする方法の例です。
説明を2つ。
ステップ数のカウントのタイミングは、改行とEOFの2つある。
カウントの処理は関数にするべき。
元のプログラムは、backChar == '\n'等の判定が多く無理があったため
currentCharを全ての判定の基準とした。
これによってskipOneCharFlgとskipTwoCharFlgも不要に。
プリプロセッサ行や文字列をカウントできないのは当然として、
コメントの処理についてもバグはまだあるかもしれない。ていうかありそう。
積極的にテストをするつもりは全くないので、
miiさんに取れないバグがあったら、再現できる最小限のデータファイルを
載せてください。いつまで、という約束はできないけど。
直接関係ない部分は遠慮なく削除して、
test1.c~test4.cをパスするようにはしました。
No:44632で私が書いた、プログラムを小さくする方法の例です。
説明を2つ。
ステップ数のカウントのタイミングは、改行とEOFの2つある。
カウントの処理は関数にするべき。
元のプログラムは、backChar == '\n'等の判定が多く無理があったため
currentCharを全ての判定の基準とした。
これによってskipOneCharFlgとskipTwoCharFlgも不要に。
プリプロセッサ行や文字列をカウントできないのは当然として、
コメントの処理についてもバグはまだあるかもしれない。ていうかありそう。
積極的にテストをするつもりは全くないので、
miiさんに取れないバグがあったら、再現できる最小限のデータファイルを
載せてください。いつまで、という約束はできないけど。
Re:続ソースコードの行数
たいちうさん返信遅れてすみません。
2日間寝込んでました(T_T)
教授に相談したら年始でもいいよということなんで少しホッとしました。
今から動きを検証してみます!
2日間寝込んでました(T_T)
教授に相談したら年始でもいいよということなんで少しホッとしました。
今から動きを検証してみます!
Re:続ソースコードの行数
難しいですね^^;
え~っと具体的に修正する部分なんですが、
何処に書いていいのかわからず。。。(汗
取りあえずいろいろいじってみたんですが、
当然バグりまくりですw
テストファイルは以下ファイルで試しました。
<test1>
/*+*/#include <stdio.h>#include <stdlib.h>/* -++*/
#define LOKI 123 / 1
#define IKOL 123
#
void main()
{ //ask
int a,b ;/* bbb */
a=0;/* ccc */ /*
a\n____________________123____________________0123456789*9876543210
a */
/* ddd */ /* ooo
a\n
a */
a=0 ;/* eee */ /* */ /* */
//1aaaaaaaaaaaaaaaaaaaaaaaaa123aaaaaaaaaaaaaaaaaaaa0123456789*bb
b=a ;//
b=a ; /* b */b=b;
printf( "\ " ) ;
b=1 ;
while(a!=b)
/**/{ a=b ;
( abs
);
/**/}/* */
// printf( "%d\n",LOKI ) ;
/* */ /*/ abc;*/
/* このようになればOKです!:31 実:20 ロジ:13 */ //a
//int g;
;
}
<test2>
/**/#include <stdio.h>#include <stdlib.h>/* --- */
#define LOKI 123
#define IKOL 123
#
/**/#define AA 123/***/
//#define BB 456
#define CC 789 /*
#define DD 741
*/
void func2();
void main()
{ //ask
int a,b ;/* bbb */
a=0;/* ccc */ /*
a\n
a */
/* ddd */ /* ooo
a\n
a */
a=0 ;/* eee */ /* */ /* */
//aaa
b=a ;//
b=a ; /* b */b=b;
printf( " " ) ;
b=1 ;
while(a!=b)
{ a=b ;
}
// printf( "%d\n",LOKI ) ;
/*/
int g;
*/
func2();
}
void func2()
{ int j;/*
*/ int i;/***//**//*
int bb;
int *k;
*/char c = 'A';
// int cc;
for (i = 9
;
i < 10
;
i++)
/**/{/**/
/**/for (j = 0; j < 5; j++)
/**/{/**///123 /*
printf("AAAAA");
printf("/ * * /");
*k = 1;
}//aaaaaaaaaa */
//}
/*######################*/
//###########
/******************結果はこのようになればOKですAll:64 / Real:40 / Logic:26*************************/
//************************************************************************//*
printf("%d\n", i);
} // aaaa
/**/}
とりあえずもう少しいじったら(あまり変わってないですが)
ソースのほう載せるのでアドバイス等いただけたらと思います。
え~っと具体的に修正する部分なんですが、
何処に書いていいのかわからず。。。(汗
取りあえずいろいろいじってみたんですが、
当然バグりまくりですw
テストファイルは以下ファイルで試しました。
<test1>
/*+*/#include <stdio.h>#include <stdlib.h>/* -++*/
#define LOKI 123 / 1
#define IKOL 123
#
void main()
{ //ask
int a,b ;/* bbb */
a=0;/* ccc */ /*
a\n____________________123____________________0123456789*9876543210
a */
/* ddd */ /* ooo
a\n
a */
a=0 ;/* eee */ /* */ /* */
//1aaaaaaaaaaaaaaaaaaaaaaaaa123aaaaaaaaaaaaaaaaaaaa0123456789*bb
b=a ;//
b=a ; /* b */b=b;
printf( "\ " ) ;
b=1 ;
while(a!=b)
/**/{ a=b ;
( abs
);
/**/}/* */
// printf( "%d\n",LOKI ) ;
/* */ /*/ abc;*/
/* このようになればOKです!:31 実:20 ロジ:13 */ //a
//int g;
;
}
<test2>
/**/#include <stdio.h>#include <stdlib.h>/* --- */
#define LOKI 123
#define IKOL 123
#
/**/#define AA 123/***/
//#define BB 456
#define CC 789 /*
#define DD 741
*/
void func2();
void main()
{ //ask
int a,b ;/* bbb */
a=0;/* ccc */ /*
a\n
a */
/* ddd */ /* ooo
a\n
a */
a=0 ;/* eee */ /* */ /* */
//aaa
b=a ;//
b=a ; /* b */b=b;
printf( " " ) ;
b=1 ;
while(a!=b)
{ a=b ;
}
// printf( "%d\n",LOKI ) ;
/*/
int g;
*/
func2();
}
void func2()
{ int j;/*
*/ int i;/***//**//*
int bb;
int *k;
*/char c = 'A';
// int cc;
for (i = 9
;
i < 10
;
i++)
/**/{/**/
/**/for (j = 0; j < 5; j++)
/**/{/**///123 /*
printf("AAAAA");
printf("/ * * /");
*k = 1;
}//aaaaaaaaaa */
//}
/*######################*/
//###########
/******************結果はこのようになればOKですAll:64 / Real:40 / Logic:26*************************/
//************************************************************************//*
printf("%d\n", i);
} // aaaa
/**/}
とりあえずもう少しいじったら(あまり変わってないですが)
ソースのほう載せるのでアドバイス等いただけたらと思います。