🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

735閲覧

コアダンプをなくしたい

gogepan

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/01/17 08:17

発生している問題・エラーメッセージ

Amideを用いて3次元画像を2次元画像に投影するプログラムを作成しています。コンパイルはできるのですが実行するとコアダンプが発生してしまいます。
初心者なのでなるべくかみ砕いて説明していただけるとありがたいです。

該当のソースコード

c

1#include<stdio.h> 2#include<stdlib.h> 3#define nx 128 4#define ny 128 5#define nz 128 6 7#define MASS_ATT_TISSUE 0.2264 8#define DENSITY_TISSUE 1.06 9 10#define BMASS_ATT_TISSUE 0.4242 11#define BDENSITY_TISSUE 1.92 12#define PIXEL 0.25 13 14int main(void){ 15 16 int i,j,k; 17 FILE *fp; 18 19 float att_tis; 20 float batt_tis; 21 float img_att[nz][ny][nx]; 22 float proj_att[ny][nx]; 23 float att_tis_pix; 24 float batt_tis_pix; 25 26 att_tis=MASS_ATT_TISSUE*DENSITY_TISSUE; 27 att_tis_pix=att_tis*PIXEL; 28 29 batt_tis=BMASS_ATT_TISSUE*BDENSITY_TISSUE; 30 batt_tis_pix=batt_tis*PIXEL; 31 32 for(i=0;i<nx;i++){ 33 for(j=0;j<ny;j++){ 34 for(k=0;k<nz;k++){ 35 img_att[k][j][i]=0; 36 } 37 } 38 } 39 40 float x0,y0,a,b; 41 float X,Y; 42 43 //3D作成 44 45 for(k=0;k<nz;k++){ 46 47 x0=64;y0=64; 48 a=56;b=40; 49 for(i=0;i<nx;i++){ 50 for(j=0;j<ny;j++){ 51 X=((float)i-x0)*((float)i-x0)/(a*a); 52 Y=((float)j-y0)*((float)j-y0)/(b*b); 53 if(X+Y <= 1){ 54 img_att[k][j][i]=att_tis_pix; 55 } 56 } 57 } 58 59 } 60 61 for(k=4;k<nz;k++){ 62 63 x0=40;y0=64; 64 a=20;b=24; 65 for(i=0;i<nx;i++){ 66 for(j=0;j<ny;j++){ 67 X=((float)i-x0)*((float)i-x0)/(a*a); 68 Y=((float)j-y0)*((float)j-y0)/(b*b); 69 if(X+Y <= 1){ 70 img_att[k][j][i]=0; 71 } 72 } 73 } 74 x0=88;y0=64; 75 a=20;b=24; 76 for(i=0;i<nx;i++){ 77 for(j=0;j<ny;j++){ 78 X=((float)i-x0)*((float)i-x0)/(a*a); 79 Y=((float)j-y0)*((float)j-y0)/(b*b); 80 if(X+Y <= 1){ 81 img_att[k][j][i]=0; 82 } 83 } 84 } 85 } 86 87 88 89 //投影 90 for(k=0;k<nz;k++){ 91 for(j=0;j<ny;j++){ 92 for(i=0;i<nx;i++){ 93 proj_att[k][i]+=img_att[k][j][i]; 94 } 95 } 96 } 97 98 fp=fopen("proj_3DCT.raw","wb"); 99 if(fp == NULL) 100 { 101 printf("File open error\n"); 102 exit(1); 103 } 104 for(j=0;j<ny;j++) 105 { 106 fwrite(proj_att[j],sizeof(float),nx,fp); 107 } 108 fclose(fp); 109 110 return 0; 111} 112

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/01/17 08:40

コアダンプが発生するソースコードの位置は分かりますか? または、proj_3DCT.raw というファイルが公開されているなら、こちらで試してみますけど…。
guest

回答4

0

ベストアンサー

ローカル変数に大きな容量の変数を定義してます。
ローカル変数はスタックに取られますんで、ここらへんの変数をグローバル変数としてみてはどうでしょう

投稿2021/01/17 08:49

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

たいがいのコンピュータ環境において、「スタック領域」はあまり大きくありません。通常のPC上のOSであれば2MB以下であることが多いです。
その範囲を超えるような操作をすると、プログラムが破綻して何が起こるかわかりませんが、C/C++ではそういう操作も「プログラマの責任」において禁止されず出来てしまいます。

で、ローカル変数はそのスタック領域上に確保されます。
float img_att[nz][ny][nx];
nz,ny,nxが各々128であれば、floatは4byteとしてざっと8MBの領域をこの配列が占めることになります。そこに書き込みを行うので、破綻してコアダンプという事態にあいなりました。

(どうすればよいか、は聞かれていないので、敢えて説明しません。自分で調べてください。'ローカル変数 サイズ'あたりをキーワードに検索すれば結構なことがわかると思います。もちろん「スタック」を知らなければそれもC言語をあつか必須の知識ですので調べておきましょう。)

投稿2021/01/17 08:48

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/01/17 08:53

> どうすればよいか、は聞かれていない あ、本文にはなかったけどタイトルが「コアダンプをなくしたい」だったか... まぁ、調べてみてください。
guest

0

float img_att[nz][ny][nx]; で img_att のサイズは8メガバイトです。
Linux では、スタックサイズが 8メガバイトなので、すべての変数を
自動変数として割り付けることができません。
static float img_att[nz][ny][nx]; として、静的に領域を確保しましょう。

投稿2021/01/17 08:47

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列の添え字が範囲外になっているのではないかと思います。
配列を添え字でアクセスする直前で、添え字の値が範囲内かどうかチェックしましょう。

投稿2021/01/17 08:46

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問