初歩的で申し訳ないですが、どうしても詰まっているため質問させていただきたく思います。
各部品を構造体で示し、指定した親部品に必要な各子部品を求めるプログラムを作りたいのですが、実行時に「セグメンテーション違反です」のエラーが発生します。 どこかの型が誤っているということは何となくわかるのですが、具体的な修正場所が見えずに困っています。おそらく構造体の部分だとは思うのですが、関数の部分が正しいのかも確証が持てません。
C言語、OSはlinuxです。
#include<stdio.h>
struct item {
char *part_name; /* アイテム名 */
int n_spart; /* 子アイテム数 */
int spart[10]; /* 子アイテム番号 */
float q_spart[20]; /* 子アイテムの必要量 */
} buhin[25];
void init_buhin()
{
buhin[0].part_name = "生産必要量";
buhin[0].n_spart = 3;
buhin[0].spart[0] = 1;
buhin[0].q_spart[0] = 10.0;
buhin[0].spart[1] = 2;
buhin[0].q_spart[1] = 6.0;
buhin[0].spart[2] = 3;
buhin[0].q_spart[2] = 4.0;
buhin[1].part_name = "直4エンジン";
buhin[1].n_spart = 4;
buhin[1].spart[0] = 4;
buhin[1].q_spart[0] = 1.0;
buhin[1].spart[1] = 7;
buhin[1].q_spart[1] = 1.0;
buhin[1].spart[2] = 5;
buhin[1].q_spart[2] = 1.0;
buhin[1].spart[3] = 3;
buhin[1].q_spart[3] = 4.0;
buhin[2].part_name = "V8エンジン";
buhin[2].n_spart = 4;
buhin[2].spart[0] = 4;
buhin[2].q_spart[0] = 2.0;
buhin[2].spart[1] = 19;
buhin[2].q_spart[1] = 2.0;
buhin[2].spart[2] = 6;
buhin[2].q_spart[2] = 1.0;
buhin[2].spart[3] = 2;
buhin[2].q_spart[3] = 8.0;
buhin[3].part_name = "PSAssy";
buhin[3].n_spart = 4;
buhin[3].spart[0] = 15;
buhin[3].q_spart[0] = 1.0;
buhin[3].spart[1] = 16;
buhin[3].q_spart[1] = 1.0;
buhin[3].spart[2] = 17;
buhin[3].q_spart[2] = 1.0;
buhin[3].spart[3] = 18;
buhin[3].q_spart[3] = 2.0;
buhin[4].part_name = "SHAssy";
buhin[4].n_spart = 4;
buhin[4].spart[0] = 8;
buhin[4].q_spart[0] = 1.0;
buhin[4].spart[1] = 9;
buhin[4].q_spart[1] = 1.0;
buhin[4].spart[2] = 10;
buhin[4].q_spart[2] = 2.0;
buhin[4].spart[3] = 11;
buhin[4].q_spart[3] = 10.0;
buhin[5].part_name = "直4用CCAssy";
buhin[5].n_spart = 4;
buhin[5].spart[0] = 12;
buhin[5].q_spart[0] = 1.0;
buhin[5].spart[1] = 13;
buhin[5].q_spart[1] = 1.0;
buhin[5].spart[2] = 14;
buhin[5].q_spart[2] = 1.0;
buhin[5].spart[3] = 11;
buhin[5].q_spart[3] = 10.0;
buhin[6].part_name = "V8用CCAssy";
buhin[6].n_spart = 4;
buhin[6].spart[0] = 20;
buhin[6].q_spart[0] = 1.0;
buhin[6].spart[1] = 21;
buhin[6].q_spart[1] = 1.0;
buhin[6].spart[2] = 14;
buhin[6].q_spart[2] = 1.0;
buhin[6].spart[3] = 11;
buhin[6].q_spart[3] = 10.0;
buhin[7].part_name = "直4用シリンダ";
buhin[7].n_spart = 0;
buhin[8].part_name = "シリンダヘッド";
buhin[8].n_spart = 0;
buhin[9].part_name = "シリンダヘッドカバー";
buhin[9].n_spart = 0;
buhin[10].part_name = "カムシャフト";
buhin[10].n_spart = 0;
buhin[11].part_name = "ボルト";
buhin[11].n_spart = 0;
buhin[12].part_name = "直4用クランクケース";
buhin[12].n_spart = 0;
buhin[13].part_name = "直4用クランクシャフト";
buhin[13].n_spart = 0;
buhin[14].part_name = "クランクケースカバー";
buhin[14].n_spart = 0;
buhin[15].part_name = "ピストン";
buhin[15].n_spart = 0;
buhin[16].part_name = "ガスケット";
buhin[16].n_spart = 0;
buhin[17].part_name = "コンロッド";
buhin[17].n_spart = 0;
buhin[18].part_name = "ピストンクリップ";
buhin[18].n_spart = 0;
buhin[19].part_name = "V8用シリンダ";
buhin[19].n_spart = 0;
buhin[20].part_name = "V8用クランクケース";
buhin[20].n_spart = 0;
buhin[21].part_name = "V8用クランクシャフト";
buhin[21].n_spart = 0;
}
float get_q(int p, int q)
{
int i; /* カウンタ */
float r =0.0; /* 返す量 */
if (p == q)
r = 1.0;
else if(buhin[p].n_spart != 0) /* 子アイテムの存在をチェック */
for(i = 0;i < buhin[p].n_spart; i++) /* 子アイテムの数だけループ */
r += get_q(buhin[p].spart[i], q) * buhin[p].q_spart[i];
return r;
}
int main()
{
float t_quant;
int p0; /* 基準番号 */
int q0; /* 調べたい番号 */
int x; /* カウンタ */
init_buhin();
p0 = 0; /* 0に使われる */
for(x = 0;x < 22; x++){
if(buhin[x].n_spart == 0){
q0 = x;
t_quant = get_q(p0,q0);
printf("Total quantity of %s is %f in %s.\n",
buhin[q0].part_name, t_quant, buhin[p0].part_name);
}
}
return 0;
}
求めたい数にあたるq0に0または2を代入したときのみエラーが起きずに実行され、他の数字が入ると実行不可能というのも原因がわからず困っています。課題の期限が迫っていて、早くに助言をいただけると非常に助かります。拙文申し訳ありません。よろしくお願いします。