続ソースコードの行数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mii

続ソースコードの行数

#1

投稿記事 by mii » 15年前

またお世話になります。
プログラムの方を整理してみました。
以下テストファイルでテストしています。
総ステップ数 = 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
/**/}}

mii

Re:続ソースコードの行数

#2

投稿記事 by mii » 15年前

以下のようなテストファイルでもテストしたのですが
総ステップ数 = 10, 実ステップ数 = 3, 処理ステップ数 = 2
というふうに予定通り出るので違いがわかりません(泣

int a;
/* // komen
kome
meok
*/
int// dddddddddddddddddddint/*komu*/
/*komy
*/
//dse /*iny*/
}

ドラ

Re:続ソースコードの行数

#3

投稿記事 by ドラ » 15年前

printfデバッグしましょうと言っているのにやってくれない・・(泣
まあ、何をどうすればよいか分かっていなさそうなので代わりにやってみました。
1行の内容が表示された後、その時の総行数が表示されます。
また、その行がコメント又は空白行、プリプロセッサ行、中括弧だけの行のいずれかに
該当する場合はそれも出力されます。

アルゴリズム自体には手を入れていませんが、未初期化のallStepをいきなり
使用していたので0で初期化しておきました。

問題があるのは赤字の部分のようですね。
その前の行で間違って1行コメントと判断してしまっているような予感がします。

int main2()
{ int j;/*
*/ int i;/***//**//*
int bb;
*/

// int cc;


付け足したデバッグ用の出力(Dというマクロ)は「#define DEBUG」の行を
コメントアウトするとコンパイル時に消滅します。
デバッグが終わって、いらなければDという文字で検索して消して下さい。

mii

Re:続ソースコードの行数

#4

投稿記事 by mii » 15年前

ありがとうございます。

>printfデバッグしましょうと言っているのにやってくれない・・(泣
すいません。いろいろやってみたんですが、わからなくて消してしまいました。。
これは取っておいた方が良いのでしょうか?

>何をどうすればよいか分かっていなさそうなので
そうですね(汗
どうすればいいかすぐ浮かんでこないです(T_T)
訓練しないと駄目ですよね。。

今からコンパイルして確認してみます!

mii

Re:続ソースコードの行数

#5

投稿記事 by mii » 15年前

こういうデバッグ方法もあるのですね。
ありがとうございます!
// 非コメント状態で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行コメントとして扱われていたので、上記文を入れてみて上手くはいったのですが、
動いちゃった感が満載です。。。他のファイルでテストしてみても上手くいったのですが、
どうも心配です(泣

これでいいのでしょうか?

mii

Re:続ソースコードの行数

#6

投稿記事 by mii » 15年前

今日の4時までなので何とかしたいです。。。(泣
お願いします(T_T)

上記コードだとどこがいけないでしょうか?

たいちう

Re:続ソースコードの行数

#7

投稿記事 by たいちう » 15年前

今日の4時が何なのか分かりませんが(前スレをよく読めば分かるのかな?)、
何が目的なのでしょうか?

4時がレポートの提出期限だとしたら、
一応動くプログラムなら及第点は取れるでしょう。
完璧なものが欲しいならば、締め切りなど意識せずに、
好きなだけテストして、自分で解決できない不具合を発見したら
あらためて質問すればよいでしょう。

dic

Re:続ソースコードの行数

#8

投稿記事 by dic » 15年前

自分でも処理の流れがわかりにくくなりそうだなぁと感じ出したら
フローチャートを使ってプログラムを組むのも手です
http://homepage1.nifty.com/Iruka/nifty/ ... page2.html

って、4時までだったら無理ですね

mii

Re:続ソースコードの行数

#9

投稿記事 by mii » 15年前

たいちろうさんdicさんありがとうございました。

mii

Re:続ソースコードの行数

#10

投稿記事 by mii » 15年前

取りあえず提出は終えました。皆様ありがとうございました。
しかしバグがあるので直したいと思います!

/**/#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:続ソースコードの行数

#11

投稿記事 by たいちう » 15年前

> これはどうやってなおせばいいのでしょうか?

1.質問の仕方

まず回答者に自分の抱えている問題を説明しましょう。

「プログラムがデータを処理して結果を得る」が期待と違う。

実行したプログラム・処理したデータ・得られた結果・期待する結果を
伝えなくてはいけません。



2.デバッグの方法(1)

44行のデータを処理してバグを検出できる。

もっと小さいデータでバグを検出できるようにする。

テストデータの内でバグ発生と関連なさそうな部分を削除して、
バグが再現するかどうかを確認しましょう。
最終的には1~2行のデータでバグを発生させられるかもしれません。
これだけでも大きな進展です。


3.デバッグの方法(2)

データを小さくした次は、プログラムを小さくします。
コメントの行数にバグがあるならば、それと関係ない部分を
削除します。前スレも含めたやり取りを流し読みしただけですが、
コメント行数と関係ない機能もあると思います。
今回はコメント行数のバグさえ再現すればよいので、
それ以外のフラグなども削除してしまいましょう。
削除しすぎてバグが発生しなくなってしまったら、
元に戻します。


データとプログラムが小さくなれば、それだけデバッグは楽になります。

mii

Re:続ソースコードの行数

#12

投稿記事 by mii » 15年前

int i;/***//**//*
int bb;
*/

取りあえず
/***//**//*の部分が1行コメントとして扱われています。

ただ修正方法がわからないため困っています。

プログラムを小さくですか。。。難しいです(T_T)

ねこ

Re:続ソースコードの行数

#13

投稿記事 by ねこ » 15年前

ぱっと見ただけだから間違ってるかもしれないけど
「/*」「*/」を判定した後囲みコメントの最後の「/」と次の「/」があるせいで以降が「//」扱いになってるんじゃない?
「*/」の後はbackCharにダミーの文字でも詰めておくと上手くいくかもね。

mii

Re:続ソースコードの行数

#14

投稿記事 by mii » 15年前

「/*」「*/」を判定した後囲みコメントの最後の「/」と次の「/」があるせいで以降が「//」扱いになってるんじゃない?

その通りなんですよね。
ただダミーに詰めるというのはもう一度fgetcを使うということでしょうか?

dic

Re:続ソースコードの行数

#15

投稿記事 by dic » 15年前

何の本からかは忘れましたが
私のメモによると



プログラムを作成するにあたって

① 正しい問題を考えよ
② いろいろな解法を比較検討せよ
③ データをよく見よ
④ 封筒の裏の計算を使え
⑤ 「対称性」を利用せよ
⑥ コンポーネント(部品)を考えてデザインせよ
⑦ 試作品を作れ
⑧ 必要なら妥協せよ
⑨ プログラムを複雑にしてはいけない
⑩ エレガントに

ということです

mii

Re:続ソースコードの行数

#16

投稿記事 by mii » 15年前

>「*/」の後はbackCharにダミーの文字でも詰めておくと上手くいくかもね。
入れてみたんですが結果は変わらずでした。

難しいですね。。。
方法が思いつかないんですよね(泣)

dic

Re:続ソースコードの行数

#17

投稿記事 by dic » 15年前

この問題を解くにはオートマン記法で解いた方がわかりやすいですね
オートマン記法に関する情報です
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;
}



ただ、ステップというのが 何を意味しているのか分からないので
コメントの数しか数えれてないです

mii

Re:続ソースコードの行数

#18

投稿記事 by mii » 15年前

ありがとうございます。
何か基本情報の試験で聞いたことがあるくらいです(笑
何やら難しそうですね(汗

違う方法として後で見てみます。
ご提示ありがとうございました!

ただ今はとりあえず提示している
ソースでやりたいと思います。

mii

Re:続ソースコードの行数

#19

投稿記事 by mii » 15年前

何やら添削された後返ってきたんですがバグを指摘されてしまいました。

<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

以上のようにならないといけない部分を指摘されました(泣

フラグ等の絡みが多すぎて、
デバッグして原因がわかっても直せる自信が無いです。。。(泣

何処をどう直せばいいのでしょうか?

ご教授お願い致します。

mii

Re:続ソースコードの行数

#20

投稿記事 by mii » 15年前

う~ん。。。中々できずに、元のソースに戻ってにらめっこばかりです(泣
どうすればよいのでしょうか?

よろしくお願いいたします(T_T)

Mist

Re:続ソースコードの行数

#21

投稿記事 by Mist » 15年前

> 元のソースに戻ってにらめっこばかりです

私の経験上、あまり経験が無い人がソースを眺めてバグを見つけるのは難しいです。
修正→実行→修正を繰り返すほうがよっぽど早いと思います。
printfデバッグを行えばどの段階で、期待した結果が得られていないかはすぐにわかるはずです。
その上で、どこが間違っているか(推測でもいいです)を考えてみてください。
あと、一度自分がCPUになったつもりで手作業で実行トレースしてみるのもいいかもしれませんね。


> 何処をどう直せばいいのでしょうか?
> どうすればよいのでしょうか?

努力はしているのでしょうけどこちらには結果が見えませんから、これでは丸投げしているの大して変わらないですよ。
ここがおかしいと思ってこう直してみたけどダメだった、とか書いてるならもっと答えも付きやすいと思いますよ。

たかぎ

Re:続ソースコードの行数

#22

投稿記事 by たかぎ » 15年前

> 私の経験上、あまり経験が無い人がソースを眺めてバグを見つけるのは難しいです。

これができるのは、一字一句にいたるまで、自分が理解できないコードを書いていない場合だけですね。

mii

Re:続ソースコードの行数

#23

投稿記事 by mii » 15年前

う~ん。このプログラムだと、EOF行に1文字しか存在しない場合
必ずspaceFlgが0のままなので、空白行と判断されてしまいます。

それを修正しようとしたのですが、方法が分からず適当にやっていたら
コードが動かなくなり、最初に戻るという永久パターンに(泣

上記テストファイルで行った結果を適正な結果にするためには
根本的に見直さないといけないんでしょうか?

バグ

Re:続ソースコードの行数

#24

投稿記事 by バグ » 15年前

途中から入ってきたので、全部は読んでませんが、原因が分かっているのならばそれを解決する方法を継ぎ足せばよいだけではないでしょうか?

>>EOF行に1文字しか存在しない場合

不具合の原因は突き止めているんですよね?

たいちう

Re:続ソースコードの行数

#25

投稿記事 by たいちう » 15年前

> AllStep RealStep LogicStep

時間ができたらデバッグしてみるから、これらの定義を書いてちょうだい。
それとNo.44664のtest1.c~test4.cの他にファイルがあるなら、
ファイルの内容と期待される結果も。

私はいつまでにできるという約束はできないので、年明けになるかもしれないけど、
必要な事を書いておいたら、他の回答者がもっと早く答えてくれるかもしれない。
前スレまで丁寧に読み直して、仕様を読み取るよう努力をする回答者は少ないと思うよ。
前スレでも、後から後から機能が追加されたような気がするので、
最終的な仕様をまとめてみて下さい。
もしかしてmiiさんも把握できてないんじゃない?

mii

Re:続ソースコードの行数

#26

投稿記事 by mii » 15年前

バグさん初めまして
>>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:続ソースコードの行数

#27

投稿記事 by ねこ » 15年前

バグ解析なんて慣れです。ここ居る人達は少なくとも数年プログラムに携わってるから色々な手法でバグの原因を見つける術を見つけ、実行しています。

現在の状況はバグ原因の解析難ではなく修正対応が分からないという事なので、
もし現状で「自分でもワケが分からない」というのなら一度設計を再考してみてはどうでしょうか?
確認ですが、現在は「提出は終わったが、出来れば自分の納得出来る精度まで上げたい」という意思で取り組んでいるのですよね?

そうだとした前提として、提案ですがごちゃごちゃする原因はコメント等によるフラグ管理だと思うので
まずはコメント等をはずした文字列バッファをカウント処理前に作成するようにしてみてはどうでしょうか?
また、総ステップは実質ひたすら「\n」を調べるという力技でも出せますので別途計算する等

「一度に全部しようとして出来ないのであれば処理を小分けする」というのはどうでしょう。

mii

Re:続ソースコードの行数

#28

投稿記事 by mii » 15年前

ねこさんレスありがとうございます。

>バグ解析なんて慣れです。ここ居る人達は少なくとも数年プログラムに携わってるから
色々な手法でバグの原因を見つける術を見つけ、実行しています。
皆さん凄いです。。。自分はこれまでまともにプログラミングしなかったツケが。。。(汗

>現在は「提出は終わったが、出来れば自分の納得出来る精度まで上げたい」
一度提出した後上記バグを指摘されまして、それを直して提出する期限が
月曜の午前中になってしまいました。。。orz

ですので、設計を見直すのはそれを提出した後、どんな方法がいいのか考えてみたいと思います。

取りあえず提出日が近いので今のコードを元にやりたいと思っています。

>提案ですがごちゃごちゃする原因はコメント等によるフラグ管理だと思うので
これはnonさんに教えていただいたこともあり、こちらの方法で取りあえず完成させたいと思います。

というかプログラムって設計が大事なことに気付きました^^;
コーディングはやりたいことをコードにしてるだけですもんね。。。
来年はもっと頑張らないと(笑

ねこ

Re:続ソースコードの行数

#29

投稿記事 by ねこ » 15年前

なるほどあんまり改修すると再提出後にもバグると。

じゃあ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して紙に書いてアルゴリズムフロー書いて直すしかないですね。

mii

Re:続ソースコードの行数

#30

投稿記事 by mii » 15年前

細かくコメントいただきありがとうございます。

ちょっと動かして追ってみることにします!

mii

Re:続ソースコードの行数

#31

投稿記事 by mii » 15年前

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句にいれてやればいいんでしょうか?

mii

Re:続ソースコードの行数

#32

投稿記事 by mii » 15年前

組み込んでみたんですが、希望通り動かずグダグダです(T_T)
自分の応用力とセンスのなさにガッカリです。。。

せっかく教えていただいたのにすみません。

たいちう

Re:続ソースコードの行数

#33

投稿記事 by たいちう » 15年前

miiさんの望む形とは違うと思うけど、
直接関係ない部分は遠慮なく削除して、
test1.c~test4.cをパスするようにはしました。
No:44632で私が書いた、プログラムを小さくする方法の例です。

説明を2つ。

ステップ数のカウントのタイミングは、改行とEOFの2つある。
カウントの処理は関数にするべき。

元のプログラムは、backChar == '\n'等の判定が多く無理があったため
currentCharを全ての判定の基準とした。
これによってskipOneCharFlgとskipTwoCharFlgも不要に。


プリプロセッサ行や文字列をカウントできないのは当然として、
コメントの処理についてもバグはまだあるかもしれない。ていうかありそう。
積極的にテストをするつもりは全くないので、
miiさんに取れないバグがあったら、再現できる最小限のデータファイルを
載せてください。いつまで、という約束はできないけど。

mii

Re:続ソースコードの行数

#34

投稿記事 by mii » 15年前

たいちうさん返信遅れてすみません。
2日間寝込んでました(T_T)

教授に相談したら年始でもいいよということなんで少しホッとしました。
今から動きを検証してみます!

mii

Re:続ソースコードの行数

#35

投稿記事 by mii » 15年前

難しいですね^^;

え~っと具体的に修正する部分なんですが、
何処に書いていいのかわからず。。。(汗

取りあえずいろいろいじってみたんですが、
当然バグりまくりです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
/**/}

とりあえずもう少しいじったら(あまり変わってないですが)
ソースのほう載せるのでアドバイス等いただけたらと思います。

Tororo

Re:続ソースコードの行数

#36

投稿記事 by Tororo » 15年前

とりあえず、プレタグは使いましょう♪

mii

Re:続ソースコードの行数

#37

投稿記事 by mii » 15年前

あっテストファイルをそのまま使えるようにプレタグ使ってませんでした。
わかりにくくてすみません。

閉鎖

“C言語何でも質問掲示板” へ戻る