掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27915

夏休みの宿題で。
投稿者---るぅ(2006/08/14 05:23:57)


たくさんプログラミングが出たのですが、正常に動作するものとしないものが出来ます。
正常に動作しないものに関して、どうすれば正常に動作するか聞きたいです。お願いします。

まず2分探索を行うプログラムです。
自分が考えたソースは以下の通りです。


#include<stdio.h>


/*--------------------------------------------------------
    プロトタイプ宣言
--------------------------------------------------------*/
const int* search( const int buff[], int len, int num);


/*--------------------------------------------------------
    main関数
--------------------------------------------------------*/
int main( void )
{
    int str[] = {1, 2, 5, 9, 11, 20, 31, 40, 50, 56, 60, 90, 100 };  /* 探される配列 */
    int no;                /* 探す値 */


    /* 探す値の入力 */
    printf( "探す値:" );
    scanf( "%d", &no );
    /* 探索結果を表示 */
    printf( "格納先ポインタは%pです。", search( str, 13, no ) );


    return 0;
}


/*--------------------------------------------------------
[内容]
    配列 buff の中から num の値を探し、発見した格納先のポインタを帰す
    int型専用とする
    buff[]に渡される配列の要素は昇順にソートされているものとする
[仮引数]
    int buff[]    :値を探す対象となる配列
    int len   :buffの要素数
    int num   :探す値
[戻り値]
    値が見つかった時            :格納先ポインタ
    値が見つからなかったとき    :NULL
--------------------------------------------------------*/
const int* search( const int buff[], int len, int num)
{
    int min = 0;                /* 下限 */
    int max = len - 1;      /* 上限 */
    int middle;     /* 中点 */


    /* 中点の位置決め */
    middle = (min + max) / 2;
    /* 探索 */
    while( middle != num || min < max ){
        if( num < buff[middle] ){
            /* 上限の移動 */
            max = middle - 1;
        }
        else{
            /* 下限の移動 */
            min = middle + 1;
        }
        middle = (min + max) / 2;
    }
    if( min > max ){
        return NULL;
    }
    else{
        return &buff[middle];
    }
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:夏休みの宿題で。 27916 るぅ 2006/08/14 05:31:34
<子記事> Re:夏休みの宿題で。 27917 επιστημη 2006/08/14 06:20:50
<子記事> Re:夏休みの宿題で。 27919 ruby 2006/08/14 10:03:40


No.27916

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/14 05:31:34)


次に、文字列から該当する文字列を探し、置換する。
戻り値は、置換を行った回数を返す関数です。

ソースは以下の通りです。


#include<stdio.h>
/*--------------------------------------------------------
    プロトタイプ宣言
--------------------------------------------------------*/
int strrep( char* p_str1, const char* p_str2, const char* p_str3 );


/*--------------------------------------------------------
    main関数
--------------------------------------------------------*/
int main( void )
{
    char list_1[ 10 ] = "test";
    char list_2[] = "es";
    char list_3[] = "abc";
    int cnt;


    cnt = strrep( list_1, list_2, list_3 );

    printf( "%d", cnt ); 


    return 0;
}


/*--------------------------------------------------------
[内容]
    p_str1の文字列内からp_str2の文字列を探し出し、全てをp_str3の文字列に置換する。
    p_str1の文字列は置換後の文字列を格納するのに十分なサイズが確保されているものとする。
[仮引数]
    char* p_str1            :置換を行う文字列へのポインタ
    const char* p_str2    :置換対象となる文字列へのポインタ
    const char* p_str3    :置換する文字列へのポインタ
[戻り値]
    置換した数
--------------------------------------------------------*/
int strrep( char* p_str1, const char* p_str2, const char* p_str3 )
{
    int str_01[ 10 ];            /* p_strのコピー */
    int n = 0, i, j, x;    /* 添え字 */
    int count = 0;          /* 置換を行った回数 */


    /* p_str1のコピーを作成 */
    for( i = 0; i <= 10; i++ ){
        str_01[ i ] = p_str1[ i ];
    }

    i = 0;
    while( p_str1[ i ] != '\0' ){
        j = x = 0;
        /*** p_str1の中からp_str2を探す ***/
        while( p_str1[ n ] != '\0' ){
            /* n文字目とj文字目が一致した場合 */
            if( p_str1[ n ] == p_str2[ j ] ){
                /* 一致している間 */
                while( (p_str2[ j ] != '\0') || (p_str1[ n ] == p_str2[ j ]) ){
                    n++;
                    j++;
                }
            }
            /* 一致しなかった場合 */
            else{
                i++;
                n++;
            }
        }
        /* 完全に一致した時 */
        if( p_str2[ j ] == '\0' ){
            /*** 置換する ***/
            /* p_str3と置き換える */
            while( p_str3[ x ] != '\0' ){
                p_str1[ i ] = p_str3[ x ];
                x++;
                i++;
            }
            /* 置き換えた文字の後ろの文字をずらす */
            while( p_str1[ n ] != '\0' ){
                p_str1[ i ] = str_01[ n ];
                i++;
                n++;
            }
            p_str1[ i ] = '\0';
        }
    }


    return count;
}



この投稿にコメントする

削除パスワード

No.27918

Re:夏休みの宿題で。
投稿者---επιστημη(2006/08/14 06:27:21)


>次に、文字列から該当する文字列を探し、置換する。

こちらも同様、"なにが/どのようにマズいか"書きましょう。

>ソースは以下の通りです。
>...

- まず、該当する文字列の検索はちゃんとできていますか?
- 置換文字列が置換対象文字列より 短いとき/長いとき/同じとき
- 置換対象が 0個/1個/2個以上 のそれぞれで確認すべし。
- "abc" を "abcabc" に置換できますか?

※ "デバッグの仕方"を身に着けましょう。



この投稿にコメントする

削除パスワード

No.27920

Re:夏休みの宿題で。
投稿者---ruby(2006/08/14 10:16:25)


>次に、文字列から該当する文字列を探し、置換する。
>戻り値は、置換を行った回数を返す関数です。

中身を細かく見たわけではありませんが、
ざっと見ただけでもstrrep関数にいくつか疑問点があります。

1)str_01のサイズが固定であるため、汎用的でない。
2)str_01を初期化する際、定義した範囲を超えている。
3)countは初期化しただけで、値が変わっていない。


この投稿にコメントする

削除パスワード

No.27921

Re:夏休みの宿題で。
投稿者---ruby(2006/08/14 14:20:34)


>次に、文字列から該当する文字列を探し、置換する。
>戻り値は、置換を行った回数を返す関数です。

「標準ライブラリーの関数を使わずに、
すべてのロジックを書き下ろす」という制約はありますか?
もし、そういう制約がなければ、strrep関数は、
標準ライブラリーに備わっている文字列処理関数の
どれかをうまく組み合わせればできそうです。



この投稿にコメントする

削除パスワード

No.27922

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/14 15:32:47)


>「標準ライブラリーの関数を使わずに、 >すべてのロジックを書き下ろす」という制約はありますか?  ありません。 >標準ライブラリーに備わっている文字列処理関数の >どれかをうまく組み合わせればできそうです。  文字列処理関数とは何のことを指すのですか?


この投稿にコメントする

削除パスワード

No.27923

Re:夏休みの宿題で。
投稿者---επιστημη(2006/08/14 15:45:11)


> 文字列処理関数とは何のことを指すのですか?

<string.h> に定義されてる文字列処理関係。
strchr とか strncpy とか strstr とか。



この投稿にコメントする

削除パスワード

No.27924

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/14 18:29:58)


><string.h> に定義されてる文字列処理関係。 >strchr とか strncpy とか strstr とか。  すみません。  まだ習っていないので使うことが出来ません。


この投稿にコメントする

削除パスワード

No.27925

Re:夏休みの宿題で。
投稿者---ruby(2006/08/14 21:15:35)


>まだ習っていないので使うことが出来ません。

strrep関数は、大きく分けて2つの機能からできていることは
おわかりだと思います。探索と置換です。

いったん、置換のことは脇へ置いておき、
探索のロジックを完成させてみましょう。
strrep関数の下請けとしての、探索関数を作ってみると
よいかもしれません。
strrep関数の第1・第2引数を探索関数に渡して、
第1引数の文字列の中に第2引数の文字列が
−ない場合
−1個以上見つかる場合(第1引数の何文字目に見つかったかを管理する必要あり)
の各々について考えてみるといかがでしょう。

なお、もっといい考え方があるかもしれません。
私の意見にとらわれすぎることなく、
独自のロジックを組み立ててみることも勉強になるでしょう。

# 文字列関連の標準関数が使えれば、strrep関数は十数行くらいで完成するのですが…。


この投稿にコメントする

削除パスワード

No.27926

Re:夏休みの宿題で。
投稿者---ruby(2006/08/14 21:20:57)


>いったん、置換のことは脇へ置いておき、
>探索のロジックを完成させてみましょう。

No.27916で提示されたコードを見直してもいいですし、
それをいったんチャラにしてはじめから考え直す、
という手もあります。


この投稿にコメントする

削除パスワード

No.27929

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 13:07:59)


宿題が終わらないのは本当に洒落にならないので、 上のソースを書き換えて正常に動作するソースを作ってもらえませんか? 見比べてどこが悪くてなぜ動作しなかったかを確認したいので。 よろしくお願いします。


この投稿にコメントする

削除パスワード

No.27930

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 13:14:37)


>上のソースを書き換えて正常に動作するソースを作ってもらえませんか?

残念ながら、ご期待に添うことはできません。
宿題が完成するかしないかは、あなたご自身の話です。


この投稿にコメントする

削除パスワード

No.27931

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 13:34:29)


>残念ながら、ご期待に添うことはできません。
無理を言ってすみませんでした・・。

2分探索の方を、以下のように訂正してみました。
正常に動かない点としては、
・格納していないはずの「3」などもポインタが表示される。
 その際他の数値のポインタと被る。
・100(100以上)を入れると、無限ループになる。

以上が自分で確認できた不具合です。
なお、main関数は以前書き込んだもののままです。

const int* search( const int buff[], int len, int num)
{
    int min = 0;                                /* 下限 */
    int max = len - 1;              /* 上限 */
    int middle = (min + max + 1) / 2;         /* 中点 */


    /* 探索 */
    while( (middle != min) || (middle != max) || (min < max) ){
        /* 確認用 */
        printf( "%d %d %d\n", min, middle, max );
        if( num < buff[ middle ] ){
            /* 上限の移動 */
            max = middle - 1;
        }
        else{
            /* 下限の移動 */
            min = middle + 1;
        }
        middle = (min + max + 1) / 2;
    }
    if( min > max ){
        printf( "NULL\n" );
        return NULL;
    }
    if( (middle == min) || (middle == max) ){
        printf( "正常\n" );
        return &buff[ middle ];
    }
}



この投稿にコメントする

削除パスワード

No.27932

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 13:55:58)


>2分探索の方を、以下のように訂正してみました。

正直なところ、前の27915のwhile文だけを
一部修正すればよかったはずなのです。
middleの計算で+1する必要性もないはずですし。

27919で、私が「while文に誤りがある」と申し上げたのは、下記の点です。
・配列の添字(middle)と探索する値(num)とを比較している
・minとmaxとが等しい場合について意識していない(これは重要です)


この投稿にコメントする

削除パスワード

No.27933

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 14:06:44)


>27919で、私が「while文に誤りがある」と申し上げたのは、下記の点です。

もう1つありました。
・while文を継続するための条件が、本当にOR条件でいいのかどうか。
OR条件だと、配列にない値を探索しようとしただけで無限ループに陥るのではないか。


この投稿にコメントする

削除パスワード

No.27936

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 14:54:07)


>OR条件だと、配列にない値を探索しようとしただけで無限ループに陥るのではないか。
ORだけだと、何故無限ループになるのですか?
よく分からないのですが・・。
「ORだけだと、両方の条件を満たさなくなるまでループするから。」
ということでいいのでしょうか?


この投稿にコメントする

削除パスワード

No.27937

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 15:08:25)


>ORだけだと、何故無限ループになるのですか?

今回の二分探索のプログラムにおけるwhile文の構造は
    while (条件1 || 条件2) {
        /* 何らかの処理 */
        ...;
    }

となっています。

つまり、条件1と条件2の少なくとも一方を満たしている間、
「何らかの処理」を実行し続けます。
ここで、条件1が「探索したい値(num)が配列にない」であるとします。
すると、どうなるでしょうか。

条件1は常に真ですので、条件2の真偽に関係なくwhile文を実行するための
条件を満たします。
今回のプログラムでは、「何らかの処理」にループから抜けるための
制御文(break文やgoto文)がありませんので、
結果として無限ループを構成します。


この投稿にコメントする

削除パスワード

No.27938

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 15:15:21)


while文を抜けるための条件から逆算して、while文を継続する条件を
考えることができます。

今回の場合でいうと、
探索したい値が配列の中にあるか、または、下限が上限を超えてしまったら、
while文を抜ければよいのです。

ということは、もうおわかりですね。
while文を継続するための条件は、
探索したい値が配列の中になく、かつ、下限が上限を超えていない
です。
これをC言語で表現してください。


この投稿にコメントする

削除パスワード

No.27939

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 15:30:12)


>探索したい値が配列の中になく、かつ、下限が上限を超えていない
>です。
>これをC言語で表現してください。
while( (buff[ middle ] != num) && (min < max) ){
でいいのですか?
でも、こうしても、「3」を入力してもNULLにはなりません。
ということは、間違っているということですか?


この投稿にコメントする

削除パスワード

No.27940

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 15:36:38)


>>探索したい値が配列の中になく、かつ、下限が上限を超えていない
>>です。
>>これをC言語で表現してください。
><pre>while( (buff[ middle ] != num) && (min < max) ){</pre>
違いますね。
『超えていない』だから、
<pre>while( (buff[ middle ] != num) &amp;&amp; (min &lt;= max) ){</pre>
ですね。


この投稿にコメントする

削除パスワード

No.27941

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 15:45:33)


それでよいはずです。
後は、くだんの配列中の値を正しく探索できるかどうか、
また、配列にない値は見つからないという結果を得られるかどうか、
十分にテストしてください。


この投稿にコメントする

削除パスワード

No.27942

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 15:52:12)


>後は、くだんの配列中の値を正しく探索できるかどうか、
>また、配列にない値は見つからないという結果を得られるかどうか、
>十分にテストしてください。
いろいろ試した結果、異常はないようです。
ありがとうございました。。



この投稿にコメントする

削除パスワード

No.27934

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 14:13:29)


>正直なところ、前の27915のwhile文だけを
>一部修正すればよかったはずなのです。
そうだったのですか。

>27919で、私が「while文に誤りがある」と申し上げたのは、下記の点です。
>・配列の添字(middle)と探索する値(num)とを比較している
その点に関しては、見直したらすぐに分かりました。
あと、論理OR演算子を使っているのに、左右のオペランドの優先順位を上げていないことにも気づきました。

>・minとmaxとが等しい場合について意識していない(これは重要です)
どういう意味ですか? 下限と上限が等しい・・・?



この投稿にコメントする

削除パスワード

No.27935

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 14:44:53)


>>・minとmaxとが等しい場合について意識していない(これは重要です)
>どういう意味ですか? 下限と上限が等しい・・・?

一例として、くだんの配列から51を探索するケースについて考えます。
1)min=0, max=12, middle=6
2)51>buff[6]なので、下限を移動。min=7, max=12, middle=9
3)51<buff[9]なので、上限を移動。min=7, max=8, middle=7
4)51>buff[7]なので、下限を移動。min=8, max=8, middle=8
ここで、上限と下限が等しくなります。
めざす51はまだ見つかっていないので、さらに探索を続けます。
5)51>buff[8]なので、下限を移動。min=9, max=8, middle=8
ここで、minがmaxより大きくなりましたので、while文から抜けます。

50を探索する場合は、上記5)で50==buff[8]となり、
めざす値が見つかったのでwhile文から抜けます。


この投稿にコメントする

削除パスワード

No.27943

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 16:32:46)


この置換のプログラム、考え方は間違っていないでしょうか?

1. 置換対象を探す
2. 置換する
3. 置換対象の後ろの文字を置換後の文字の後ろにつける
4. 置換対象が他にもあるか探す

です。


この投稿にコメントする

削除パスワード

No.27944

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 17:04:38)


>1. 置換対象を探す
>2. 置換する
>3. 置換対象の後ろの文字を置換後の文字の後ろにつける
>4. 置換対象が他にもあるか探す

4.は1.と事実上同じ意味で、1.〜3.をぐるぐる繰り返す、
ということになるのでしょう。

繰り返すための(あるいは、繰り返しをやめるための)条件や、
1.〜3.の各処理のロジックについて考えてみてください。


この投稿にコメントする

削除パスワード

No.27945

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 17:20:17)


>>1. 置換対象を探す
>>2. 置換する
>>3. 置換対象の後ろの文字を置換後の文字の後ろにつける
>>4. 置換対象が他にもあるか探す
>
>4.は1.と事実上同じ意味で、1.〜3.をぐるぐる繰り返す、
>ということになるのでしょう。
そうですね。すみません。。

>繰り返すための(あるいは、繰り返しをやめるための)条件や、
>1.〜3.の各処理のロジックについて考えてみてください。
3.を行うためには、探される文字列と同じ文字列が1つ必要ですよね?


この投稿にコメントする

削除パスワード

No.27946

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 17:52:15)


>3.を行うためには、探される文字列と同じ文字列が1つ必要ですよね?

う〜ん、どうでしょうね。
もしかしたら、必要ないようなロジックが組めるのかもしれませんが、
さしあたり、そういうワーク的な文字列を必要とするロジックを
お考えになってみてはいかがでしょう。

で、先日の27920において私が指摘した
>1)str_01のサイズが固定であるため、汎用的でない。
の件ですが、仮に何バイトかで固定である(さすがに10バイトでは小さいと思いますが)として、
「今回のプログラムでは、それを超えるワーク文字列が必要な置換はできない」
という仕様である、と言い切ってしまうのも手ではあります。(^^;)



この投稿にコメントする

削除パスワード

No.27947

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 18:20:05)


>さしあたり、そういうワーク的な文字列を必要とするロジックを
>お考えになってみてはいかがでしょう。
そうします(^^)

>>1)str_01のサイズが固定であるため、汎用的でない。
>の件ですが、仮に何バイトかで固定である(さすがに10バイトでは小さいと思いますが)として、
>「今回のプログラムでは、それを超えるワーク文字列が必要な置換はできない」
>という仕様である、と言い切ってしまうのも手ではあります。(^^;)
その手でやってみます(^^)


この投稿にコメントする

削除パスワード

No.27948

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 18:53:19)


プログラムを組んでみたのですが、文字列の複製のところでの代入で警告が出ます。警告は、
c:\c_prog\my_work_07\main.c(62) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'char' で異なっています。
です。
ソースは以下の通りです。

#include<stdio.h>


/*--------------------------------------------------------
    マクロ定義
--------------------------------------------------------*/
#define LEN2 3 - 1    /* p_str2の要素数 */

/*--------------------------------------------------------
    プロトタイプ宣言
--------------------------------------------------------*/
int strrep( char* p_str1, const char* p_str2, const char* p_str3 );

/*--------------------------------------------------------
    main関数
--------------------------------------------------------*/
int main( void )
{
    char list1[] = "abzabz";
    char list2[] = "ab";
    char list3[] = "wxy";


    printf( "%d", strrep( list1, list2, list3 ) );


    return 0;
}


/*--------------------------------------------------------
[内容]
    p_str1の文字列内からp_str2の文字列を探し出し、全てをp_str3の文字列に置換する。
    p_str1の文字列は置換後の文字列を格納するのに十分なサイズが確保されているものとする。
[仮引数]
    char* p_str1            :置換を行う文字列へのポインタ
    const char* p_str2    :置換対象となる文字列へのポインタ
    const char* p_str3    :置換する文字列へのポインタ
[戻り値]
    置換した数
--------------------------------------------------------*/
int strrep( char* p_str1, const char* p_str2, const char* p_str3 )
{
    int i = 0, j, x, n;  /* ループカウンタ、添え字 */
    int count = 0;      /* 文字列2の数 */
    char* p_str01[ 50 ];    /* p_str1のコピー */


    /* p_str1と同じ文字列を作成 */
    while( p_str1[ i ] != '\0' ){
        p_str01[ i ] = p_str1[ i ];
        i++;
    }
    p_str01[ i ] = '\0';
    i = 0;

    /* 探索 */
    while( p_str1[ i ] != '\0' ){
        j = 0;
        /* 一回 */
        while( (p_str2[ j ] != '\0') && (p_str1[ i ] == p_str2[ j ]) ){
            i++;
            j++;
        }
        /* 完全に一致した */
        if( p_str2[ j ] == '\0' ){
            /* 置換 */
            x = 0;
            n = i - LEN2;
            while( p_str3[ x ] != '\0' ){
                p_str1[ n ] = p_str3[ x ];
                n++;
                x++;
            }
            count++;
        }
        if( p_str1[ i ] != p_str2[ 0 ] ){
            i++;
        }
    }

    return count;
}



この投稿にコメントする

削除パスワード

No.27949

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 19:27:05)


>プログラムを組んでみたのですが、文字列の複製のところでの代入で警告が出ます。警告は、
>c:\c_prog\my_work_07\main.c(62) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'char' で異なっています。
>です。
警告は、
c:\c_prog\my_work_07\main.c(53) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'char' で異なっています。
でした(^^;)


この投稿にコメントする

削除パスワード

No.27950

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 21:14:52)


> c:\c_prog\my_work_07\main.c(53) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'char' で異なっています。

27916ではその警告は出ていなかったはずですので、
それと同じようにすればいいのですが…。

main.cの53行目は
>        p_str01[ i ] = p_str1[ i ];

ですか?だとすると、p_str01の定義箇所
>    char* p_str01[ 50 ];    /* p_str1のコピー */

で、char*の*がいりません。
p_str01の現在の定義ではポインターの配列ですので、
p_str1とは型が違っています。


この投稿にコメントする

削除パスワード

No.27951

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 21:34:27)


>main.cの53行目は
><pre>> p_str01[ i ] = p_str1[ i ];</pre>
>ですか?だとすると、p_str01の定義箇所
><pre>> char* p_str01[ 50 ]; /* p_str1のコピー */</pre>
>で、char*の*がいりません。
>p_str01の現在の定義ではポインターの配列ですので、
>p_str1とは型が違っています。
すいません。Debug Errorも出てました(^^;)
指摘どおりに訂正した結果、警告は出なくなりました。
Debug Errorには
Run-Time Check Failure #2 - Stack around the variable 'list1' was corrupted.
とありました。
コレは一体どういうエラーなのですか?


この投稿にコメントする

削除パスワード

No.27952

Re:夏休みの宿題で。
投稿者---ruby(2006/08/16 23:01:33)


>Debug Errorには
>Run-Time Check Failure #2 - Stack around the variable 'list1' was corrupted.

私は、このメッセージを目にしたことがありません。
コンパイル時のエラーメッセージを見ても、どうやらるぅさんと私は
別々のコンパイラーを使っているようです。
従いまして、以下のコメントは推測に基づきます。


main関数で、
    char list1[] = "abzabz";

と書かれています。このとき、list1の要素数を明記していませんので、
文字列終端を示す'\0'を含めて7バイト分の領域を確保しています。
また、"ab"を"wxy"で置き換えようとしていますので、
置き換え後のlist1は"wxyzwxyz"となることを期待しています。
そうすると、置き換え後のlist1が占める領域は、'\0'を含めて
9バイトとなり、当初の領域を超えます。このことが、
メッセージの内容である「list1が破壊された」に
つながっているのではないでしょうか。

対処方法は、strrep関数のワーク文字列長とそろえて、
    char list1[50] = "abzabz";

のように書くことだと思います。こうしておけば、少なくとも現在の
list1〜list3の内容ではそのメッセージは出なくなると思います。
推測ですので、外しているかもしれませんが…。


この投稿にコメントする

削除パスワード

No.27953

Re:夏休みの宿題で。
投稿者---るぅ(2006/08/16 23:29:15)


>私は、このメッセージを目にしたことがありません。
>コンパイル時のエラーメッセージを見ても、どうやらるぅさんと私は
>別々のコンパイラーを使っているようです。
そのようですね(^^;)

>対処方法は、strrep関数のワーク文字列長とそろえて、
>
    char list1[50] = "abzabz";

>のように書くことだと思います。こうしておけば、少なくとも現在の
>list1〜list3の内容ではそのメッセージは出なくなると思います。
>推測ですので、外しているかもしれませんが…。
なくなりませんでした(;;)
コンパイラが別々なら仕方が無いです。
レポートには、デバッグエラーがあると書いておきます。
ありがとうございました。m(_ _)m
また、分からないことができたら質問しますので、その時はアドバイスをお願いします。m(_ _)m


この投稿にコメントする

削除パスワード

No.27917

Re:夏休みの宿題で。
投稿者---επιστημη(2006/08/14 06:20:50)


>正常に動作しないものに関して、どうすれば正常に動作するか聞きたいです。お願いします。

どこが/どのように"正常に動作しないのか"書きましょう。

>まず2分探索を行うプログラムです。

while-loopに飛び込んだ直後に min, middle, max を printfすればわかりそう。




この投稿にコメントする

削除パスワード

No.27919

Re:夏休みの宿題で。
投稿者---ruby(2006/08/14 10:03:40)


>まず2分探索を行うプログラムです。

search関数のwhile文に、致命的な誤りがあります。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧