- 締切済み
処理ルーチンに・・
以前ステップカウントツールを作成する時に質問した者ですが、~/*までの処理と同じ処理を繰り返したい時に、どうすればよいでしょうか? */~以降の判定に使いたいんで、お願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- RAPTsong
- ベストアンサー率42% (74/175)
C++のコードをCに書き換えたので、ちょっとおかしいかもしれませんが、考え方を示すために書きました。 このような感じで、あとは必要に応じて行数カウントをする処理を付け加えてみてはいかがでしょうか。 void FindEnd(const char** lpText__, const char chEndChar) { size_t newline = 0; const char* lpText = *lpText__; const char* lpBegin = *lpText__; for(++lpText; *lpText && *lpText != chEndChar; ++lpText){ if(*lpText == '\\'){ ++lpText; } } } void Check(const char* lpText) { const char* lp = lpText; char szPre = 0; /* 最後に読み込んだ文字 */ BOOL bInBlockComment = FALSE; /* ブロックコメント内のときTRUE */ for( ; *lp; szPre = *lp++){ if( *lp == '\'' || *lp == '\"' ){ /* 対応する次のクォーテーションまで無視 */ FindEnd(&lp, *lp); continue; } if( bInBlockComment == FALSE && szPre == '/' && *lp == '*' ){ /* '/'+'*'で始まり、コメント中でなければ、開始位置を保存 */ bInBlockComment = TRUE; szPre = 0; continue; } if( bInBlockComment != FALSE && szPre == '*' && *lp == '/' ){ /* コメント中に'*'+'/'があれば、そこまでをコメントとする */ bInBlockComment = FALSE; szPre = 0; continue; } } }
- qKAZp
- ベストアンサー率47% (71/148)
なるべく、共通処理は別関数に切り出すようにしましょう。 /* */ の前とか後ろとかにとらわれず、1行の処理は同じことをしているはずですので、そのたびに処理関数を呼び出してやればいいんでは。 ちょっと思いつきですが。 /* */ は数行にまたがることもありますので、 安易に1行ごとに判定しているとつじつまが合わなくなる心配があります。"/*"があったら、"*/"がでるまで、読み飛ばすようにした方がいいかもしれません。 1行内でのトークンの切り出しと判定は1つの関数にまとめられると思いますよ。 ただし、1行 = 1ステップではないですから、注意が必要でしょう。「簡易」という逃げで、この辺をごまかす手もありますが・・・
- RAPTsong
- ベストアンサー率42% (74/175)
??? 意味が通じません。 ブロックコメント/* ... */があって? ブロックコメント開始 "/*" までの処理と同じ処理とは? "*/" 以降の判定に使いたい… よくわからないけど、コメントと空行を除いた実効行をカウントしたいってこと? どんなソースを書きましたか? 開発環境は? 1.基本的に改行を数える。 2.行頭の空白文字をスキップし、リテラル内を除いた位置にコメント文字があれば、それ以降、コメント終端まではカウントしない。 3.行頭の空白文字をスキップし、改行文字までの長さが1以上の場合、有効行としてカウントする。 4.行末に '\\' があったら、次行に続くのでカウントしない。 こんな感じ? それともC言語だから、セミコロンを数えるの?
補足
分かりづらくてすみません(;^^ 開発環境はC言語です。 実行行とコメント行をカウントしたいのです。 1.基本的に改行を数えます。 2."/*"までに空白文字以外の文字があれば実行行、なければコメント行。 3."*/"までが複数行にまたがっていれば、複数行コメント行。 4."*/"以降にも"/*"があればコメント開始 こんな感じです。お願いします。
補足
補足じゃないかもしれませんが、さらに質問していいでしょうか? 共通関数を切り出して、呼び出すのはどのようにすればいいでしょうか?甘え過ぎかもしれないんですが、教えてください。 /**/が数行にまたがる場合は"\n"しかカウントしないように作りました。