掲示板利用宣言

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

 私は

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

掲示板2

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

No.29912

マトリックスの読み込みについて
投稿者---yume(2007/03/12 09:05:46)


5×5のマトリックスを読み込んで,すべての成分に5を足して出力するプログラムを作っています.

5×5なので,変数はa[5][5]として,以下のソースを作り,実行しましたところ,「問題が発生したため,hoge.exeを終了します.ご不便をおかけして申し訳ありません」との表示がでました.

このときの使用環境は,WindowsXP Professionalで,コンパイラはBorland C++ 5.5.1 for Win32(フリーソフト)を使っています.

#include <stdio.h>
#include <math.h>

 main(){

    int i,j;
    float a[5][5];

    FILE *fp1, *fp2;

    fp1 = fopen("input.txt","r");
    fp2 = fopen("output.txt","w");

    

    for(i=1;i<=5;i++){

        for(j=1;j<=5;j++){

            fscanf(fp1,"%f",&a[i][j]);

        }

    }

    for(i=1;i<=5;i++){

        for(j=1;j<=5;j++){
            
            a[i][j]=a[i][j]+5;

            fprintf(fp2,"%8.2f",a[i][j]);

        }

    }

    fclose(fp1);
    fclose(fp2);

    return(0);

}



ためしにと思って,a[6][6]とすると,うまくいくようです.

また,よくわからないのですが,Linux上で,gcc -o hoge hoge.cとしてコンパイルすると,a[5][5]でもうまくいきます.

これは,何が原因なのでしょうか.お教え願えませんでしょうか.お願いいたします.


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:マトリックスの読み込みについて 29913 Blue 2007/03/12 09:08:35


No.29913

Re:マトリックスの読み込みについて
投稿者---Blue(2007/03/12 09:08:35)


配列の要素の扱いに間違いがあります。

2−3.配列
の最初の赤字の部分をご覧ください。


この投稿にコメントする

削除パスワード

No.29914

Re:マトリックスの読み込みについて
投稿者---Blue(2007/03/12 09:12:42)


ちなみに
>Linux上で,gcc -o hoge hoge.cとしてコンパイルすると,a[5][5]でもうまくいきます.
では、バグっているのにうまくいくと思ったほうがいいでしょう。

メモリの管理のしかたは処理系によって多少異なります。
本来ならプログラムから管理していない領域を参照しようとしているので
アプリケーションが以上終了してしまうのですが、
たまたまLinuxでは最適化(?)の関係上、うまくいっているように見えるだけです。
(もしかしたら、別の変数の中身が変わっているってこともありうる)


この投稿にコメントする

削除パスワード

No.29915

Re:マトリックスの読み込みについて
投稿者---yume(2007/03/12 09:27:15)


>配列の要素の扱いに間違いがあります。

コメントありがとうございました.
要するに,a[5][5]というのは,a[0][0]〜a[4][4]であるにも関らず,
それに続くfor文でa[1][1]〜a[5][5]までの間で反復させているのが
原因であると理解してよろしいのでしょうか?


この投稿にコメントする

削除パスワード

No.29916

Re:マトリックスの読み込みについて
投稿者---Blue(2007/03/12 09:51:35)


>要するに,a[5][5]というのは,a[0][0]〜a[4][4]であるにも関らず,
>それに続くfor文でa[1][1]〜a[5][5]までの間で反復させているのが
>原因であると理解してよろしいのでしょうか?
そうです。

それとちょっと補足
9−1.2次元配列
の最初の※のところの図のようにメモリは割り当てられます。
よって、

a[1][5]とするとa[2][0]ということになります。

同様に

a[2][5]はa[3][0]
a[3][5]はa[4][0]

となります。で

a[4][5]はa[5][0]

となり、ここからは管理していない領域になってしまいます。

図で書くと、
参照可今回
a[0][0] 
a[0][1] 
a[0][2] 
a[0][3] 
a[0][4] 
a[1][0](a[0][5]) 
a[1][1]
a[1][2]
a[1][3]
a[1][4]
a[2][0](a[1][5])
a[2][1]
a[2][2]
a[2][3]
a[2][4]
a[3][0](a[2][5])
a[3][1]
a[3][2]
a[3][3]
a[3][4]
a[4][0](a[3][5])
a[4][1]
a[4][2]
a[4][3]
a[4][4]
a[5][0](a[4][5]) 
a[5][1] 
a[5][2] 
a[5][3] 
a[5][4] 
a[6][0](a[5][5]) 
となります。



この投稿にコメントする

削除パスワード

No.29917

Re:マトリックスの読み込みについて
投稿者---yume(2007/03/12 10:31:03)


ありがとうございました.

続けてもう一つ教えていただきたいのですが,マトリックスを
1000×1000に拡張して,再度,上記のプログラムを実行すると,
エラー表示は出てこないのですが,そのかわり,outputのファイルが
出てこなくなりました.これは何か問題があるのでしょうか?


この投稿にコメントする

削除パスワード

No.29918

Re:マトリックスの読み込みについて
投稿者---bugs(2007/03/12 10:46:15)


> 1000×1000に拡張して,再度,上記のプログラムを実行すると,
> エラー表示は出てこないのですが,そのかわり,outputのファイルが
> 出てこなくなりました.これは何か問題があるのでしょうか?

ソースをどのように修正されたか、最新の状態を見せていただけますか?
なお、ファイルのオープンが失敗したときのことを考慮していない
(fopenの戻り値をチェックしていない)のは問題ありです。



この投稿にコメントする

削除パスワード

No.29919

Re:マトリックスの読み込みについて
投稿者---yume(2007/03/12 10:53:36)


>ソースをどのように修正されたか、最新の状態を見せていただけますか?
>なお、ファイルのオープンが失敗したときのことを考慮していない
>(fopenの戻り値をチェックしていない)のは問題ありです。

お世話になります.以下の通りとなっています.

#include <stdio.h>
#include <math.h>

main(){

    int i,j;
    float a[1000][1000];

    FILE *fp1,*fp2;

    fp1 = fopen("input.txt","r");
        if(fp1 == NULL){
            printf("Cannot open the file\n");/* 戻り値のチェックとはこれのことでしょうか? */
            return (0);
        }
    fp2 = fopen("output.txt","w");
        if(fp2 == NULL){
            printf("Cannot open the file\n");
            return (0);
        }

    

    for(i=0;i<1000;i++){

        for(j=0;j<1000;j++){

            fscanf(fp1,"%f",&a[i][j]);

        }

    }

    for(i=0;i<1000;i++){

        for(j=0;j<1000;j++){
            
            a[i][j]=a[i][j]+5;
            fprintf(fp2,"%8.2f",a[i][j]);

        }

    }

    
    fclose(fp1);
    fclose(fp2);

    return(0);

}




この投稿にコメントする

削除パスワード

No.29920

Re:マトリックスの読み込みについて
投稿者---Blue(2007/03/12 10:54:39)


float型の1000*1000の配列、、、

sizeof(float)=4の場合、4,000,000Byte(4MB)必要になるのですよね?
どうも、BCCのデフォルトのスタックサイズは4KBらしいので
そこでうまくいっていないのではないでしょうか?

http://202.33.253.145/qanda/lang/l0001924.html


この投稿にコメントする

削除パスワード

No.29921

Re:マトリックスの読み込みについて
投稿者---Blue(2007/03/12 10:58:59)


リンク先を見ると、そんなに大きな配列はスタックに宣言できない
ようです。

仕様を考え直す(1000ずつ読むとか)か
ヒープにメモリをとる(malloc等)かしないと動かないのではないでしょうか?

ただし、ヒープで4MB取れるかどうかは知りませんけど。


この投稿にコメントする

削除パスワード

No.29922

Re:マトリックスの読み込みについて
投稿者---yume(2007/03/12 11:04:54)


無茶でしたか・・・
ちょっと,仕様を考え直すことにします.

ありがとうございました.


この投稿にコメントする

削除パスワード

No.29927

Re:マトリックスの読み込みについて
投稿者---ルナレルナ(2007/03/12 19:06:07)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	二次元配列じゃなくても……
//

#include <stdio.h>

int main(void)
{
    double data;
    FILE *in *out;
    
    in = fopen(/* 略 */);
    out = fopen(/* 略 */);
    
    while (fscanf(in, "%lf", &data) != EOF)
        fprintf(out, "%f", data + 5);
        
    fclose(in);
    fclose(out);
    
    return 0;
}


//
//	+スペースと改行処理
//

#include <stdio.h>

int main(void)
{
    double data;
    int i;
    FILE *in, *out;
    
    i = 0;
    while (fscanf(in, "%lf", &data) != EOF) {
        fprintf(out, " %f", data + 5);
        
        i++;
        if (i % 5 == 0)
            putc('\n', out);
    }
    
    fclose(in);
    fclose(out);
}


//
//	1000 * 1000なら1000を足すのか?
//

#include <stdio.h>

int main(void)
{
    double data;
    int i, j, n;
    FILE *in, *out;
    
    n = 5;
    in = fopen("input.txt", "r");
    out = fopen("output.txt", "w");
    
    for (i = 0; i < n; i++, putc('\n', out))
        for (j = 0; j < n; j++)
            if (fscanf(in, "%lf", &data) == 1)
                fprintf(out, " %f", data + 5);	//	5 * 5だから5を足すのか?
        
    fclose(in);
    fclose(out);
    
    return 0;
}


//
//	標準入出力とリダイレクトで……
//

#include <stdio.h>

int main(void)
{
    double data;
    
    while (scanf("%lf", &data) != EOF)
        printf("%f", data + 5);
        
    return 0;
}



この投稿にコメントする

削除パスワード

No.29930

Re:マトリックスの読み込みについて
投稿者---ルナレルナ(2007/03/13 14:53:10)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	+スペースと改行処理
//

#include <stdio.h>

int main(void)
{
    double data;
    int i;
    FILE *in, *out;
    
    //	fopen()できてなかった。
    in = fopen("input.txt", "r");
    out = fopen("output.txt", "w");

    i = 0;
    while (fscanf(in, "%lf", &data) != EOF) {
        fprintf(out, " %f", data + 5);
        
        i++;
        if (i % 5 == 0)
            putc('\n', out);
    }
    
    fclose(in);
    fclose(out);
}



この投稿にコメントする

削除パスワード

No.29924

Re:マトリックスの読み込みについて
投稿者---YuO(2007/03/12 14:05:55)


>sizeof(float)=4の場合、4,000,000Byte(4MB)必要になるのですよね?
>どうも、BCCのデフォルトのスタックサイズは4KBらしいので
>そこでうまくいっていないのではないでしょうか?
>http://202.33.253.145/qanda/lang/l0001924.html

その文書,MS-DOS時代のコンパイラの話では……?
# コンパクトモデルとか,懐かしいぞ。

Win32であれば,デフォルトで1MBのスタック空間のはずですが。


この投稿にコメントする

削除パスワード

No.29925

Re:マトリックスの読み込みについて
投稿者---Blue(2007/03/12 14:14:24)


>その文書,MS-DOS時代のコンパイラの話では……?
>Win32であれば,デフォルトで1MBのスタック空間のはずですが。
あ、そうなんですか。
確かに DOS のところのQ&Aの項目を見ていました。

こっちですかね?
http://202.33.253.145/qanda/lang/l0000258.html


この投稿にコメントする

削除パスワード

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