掲示板利用宣言

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

 私は

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

掲示板2

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

No.24272

強制終了の原因
投稿者---あきき(2005/11/20 20:43:05)


初歩的なことです。予想した結果は得られるのですが、強制終了してしまいます。その原因を突き詰めたいので宜しくお願いします。
ソースは以下の通りです

#include <stdio.h>

int  main( void )
{
    int i,array[100];
    int total;

    for(i=1,total=0; i <= sizeof array / sizeof array[0];i++){
        array[i] = i;
        total += array[i];
    }
    printf("total = % d\n",total);

    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:強制終了の原因 24273 かずま 2005/11/20 20:52:16
<子記事> Re:強制終了の原因 24274 あきき 2005/11/20 20:52:51


No.24273

Re:強制終了の原因
投稿者---かずま(2005/11/20 20:52:16)


a[100] に値を書き込んでいるからでしょう。
int array[100]; と宣言したら、a[0]〜a[99] しか参照してはいけません。



この投稿にコメントする

削除パスワード

No.24275

解決
投稿者---あきき(2005/11/20 21:11:04)


>a[100] に値を書き込んでいるからでしょう。
>int array[100]; と宣言したら、a[0]〜a[99] しか参照してはいけません。

a[100]に書き込んでいたからメモリーを破壊していると言う事ですね。
有難うございます。




この投稿にコメントする

削除パスワード

No.24276

Re:解決
投稿者---shu(2005/11/20 22:41:52)


>a[100]に書き込んでいたからメモリーを破壊していると言う事ですね。
>有難うございます。

正しいプログラムは、どんな風になったでしょうか?
それから、このプログラムは、何をするためのプログラムだったのでしょうか?


この投稿にコメントする

削除パスワード

No.24297

Re:解決(やっぱりわかってなっかったです)
投稿者---あきき(2005/11/21 22:59:16)


>正しいプログラムは、どんな風になったでしょうか?
>それから、このプログラムは、何をするためのプログラムだったのでしょうか?

修正プログラムは以下の通りです。先に示したプログラムの修正版では予想結果も得られ、正常終了しました

#include <stdio.h>

#define N 100

int  main( void )
{
    int i,array[N+1];
    int total;

    for(i=1,total=0; i < sizeof array / sizeof array[0];i++){
        array[i] = i;
        total += array[i];
    }
    printf("total = %d\n",total);

    return 0;
}


sizeofを使った継続条件のテストプログラムです。
構造体化したデータ数を継続条件とし、sizeof演算子を用いるといつもコンパイルエラーになります。



この投稿にコメントする

削除パスワード

No.24300

Re:解決(やっぱりわかってなっかったです)
投稿者---shu(2005/11/21 23:28:30)


>sizeofを使った継続条件のテストプログラムです。
>構造体化したデータ数を継続条件とし、sizeof演算子を用いるといつもコンパイルエラーになります。

サンプルを作ってみました。
(継続条件のテストということなので、合計の計算は省きました。)
かずまさんの回答なども参考に、違うところを見比べてみてください。


//
//  継続条件のテストプログラム
//

//
#include <stdio.h>

//
#define N   100

//
//
int main( void )
{
    int array[N], i, n = sizeof array / sizeof array[0];
    
    //  予め、配列にデータをセット
    for (i = 0; i < N; i++)
        array[i] = i;
    
    //  i < N の形式で
    for (i = 0; i < N; i++)
        printf( "%d ", array[i] );
    
    putchar( '\n' );
    
    //  sizeof array / sizeof array[0] の形式で
    for (i = 0; i < sizeof array / sizeof array[0]; i++)
        printf( "%d ", array[i] );
    
    putchar( '\n' );
    
    //  sizeof array / sizeof array[0] を先に計算しておく形式で
    for (i = 0; i < n; i++)
        printf( "%d ", array[i] );
    
    putchar( '\n' );
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.24302

Re:解決(やっぱりわかってなっかったです)
投稿者---あきき(2005/11/22 00:25:52)


確かに、前もって、sizeofでサイズを計算していれば、タイプミスを防げますね。それ以前に、i=1、継続条件に、i<=としていた事がメモリーを破壊しているのでは。
配列の要素数をsizeofを用いて計算するのは分りましたが、構造体の配列となるとまだエラーが出ます。今調べていますが・・・
型が違うとか


この投稿にコメントする

削除パスワード

No.24303

Re:解決(やっぱりわかってなっかったです)
投稿者---まきじ(2005/11/22 00:44:05)


>構造体の配列となるとまだエラーが出ます。

構造体でも同じです。
typedef struct test{
    int x;
    char c;
}HOGE;

int main(void){

    HOGE bar[10];
    
    printf("size: %d\n",sizeof(bar) / sizeof(bar[0]));
    
}
>型が違うとか

別の箇所でエラーなのでは?


この投稿にコメントする

削除パスワード

No.24321

Re:解決!!
投稿者---あきき(2005/11/22 23:32:05)


サンプルソース有難うございました。sizeof(変数)のところをsizeof(struct 変数)としていました
皆さん有難うございました。


この投稿にコメントする

削除パスワード

No.24310

Re:解決(やっぱりわかってなっかったです)
投稿者---shu(2005/11/22 12:52:31)


>確かに、前もって、sizeofでサイズを計算していれば、タイプミスを防げますね。それ以前に、i=1、継続条件に、i<=としていた事がメモリーを破壊しているのでは。

sizeof array / sizeof array[0] を先に計算しておくのは、タイプミスを防ぐためではありません。


この投稿にコメントする

削除パスワード

No.24301

Re:解決(やっぱりわかってなっかったです)
投稿者---DD.(2005/11/22 00:00:32)


>for(i=1,total=0; i < sizeof array / sizeof array[0];i++){
http://proger.blog10.fc2.com/blog-entry-52.html
↑ここなんてみるとよくわかるかもしれないかも。


この投稿にコメントする

削除パスワード

No.24274

Re:強制終了の原因
投稿者---あきき(2005/11/20 20:52:51)


すみません。
環境はVC+++・XPです


この投稿にコメントする

削除パスワード

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