質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.36%

Q&A

解決済

1回答

516閲覧

C言語のマージソートで途中にSegmentation faultが出る

marimo77

総合スコア3

0グッド

0クリップ

投稿2023/06/05 03:29

実現したいこと

マージソートプログラム中の比較操作・交換操作に相当する行の実行回数を計測、表示したい

前提

学校の課題でCで書かれてあるマージソートのコードを動かしたいのですが、セグフォのエラーが出てしまいました。エラーの出ている場所は120行目のb[i] = a [i]だと分かったのですが解決方法がわかりません。

最初のmain関数で配列を宣言してるのですがどうして途中の1箇所のみで、segmentation faultになるのでしょうか? またそれを解決する方法はありますでしょうか?

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

例外が発生しました Segmentation fault

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5#define MAX_ELEMENTS 1000 /* 最大のデータ数 */ 6#define OFFSET 100 /* データ数の増分値 */ 7#define MAX_LINES 10 /* 関数の最大行数 */ 8 9int a[MAX_ELEMENTS] ; /* 探索するデータ領域 */ 10int b[MAX_ELEMENTS] ; /*マージソートに使う作業用領域*/ 11 12int comp, swap ; /* 比較回数、交換回数を格納する変数 */ 13 14void merge_sort_array(int a[], int low, int high); 15void init_step(void); 16void print_step(int); 17void print_header(char *); 18int sorted(int); 19 20int main(void){ 21 int i; 22 int n; /* データ数 */ 23 int low; 24 int high; 25 26 srand(time(0)); /* 乱数の種を初期設定する */ 27 28 /* ランダム入力の場合 */ 29 print_header("random"); 30 for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) { 31 init_step(); /* comp, swap の初期化 */ 32 for (i = 0; i < n; i++) { 33 a[i] = rand() % n ; /* 配列要素に乱数値を設定する */ 34 } 35 36 merge_sort_array(a, low,high); /* ソートを実行 */ 37 38 /* ここにソートのチェックをいれる */ 39 40 /* ここまでにソートのチェックをいれる */ 41 42 43 print_step(n); /* 比較回数、交換回数の表示 */ 44 } 45 46 /* 昇順にソートされた入力の場合 */ 47 print_header("ascending order"); 48 for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) { 49 init_step(); /* comp, swap の初期化 */ 50 for (i = 0; i < n; i++) { 51 a[i] = i ; /* 配列要素に昇順のデータ値を設定する */ 52 } 53 54 merge_sort_array(a, low, high); /* ソートを実行 */ 55 56 /* ここにソートのチェックをいれる */ 57 58 /* ここまでにソートのチェックをいれる */ 59 60 print_step(n); /* 比較回数、交換回数の表示 */ 61 } 62 63 /* 降順にソートされた入力の場合 */ 64 print_header("descending order"); 65 for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) { 66 init_step(); /* comp, swap の初期化 */ 67 for (i = 0; i < n; i++) { 68 a[i] = n - i ; /* 配列要素に降順のデータ値を設定する */ 69 } 70 71 merge_sort_array(a, low, high); /* ソートを実行 */ 72 73 /* ここにソートのチェックをいれる */ 74 75 /* ここまでにソートのチェックをいれる */ 76 77 print_step(n); /* 比較回数、交換回数の表示 */ 78 } 79 80 return 0; 81} 82 83void init_step(void){ 84 swap = 0; comp = 0; 85} 86 87void print_header(char *s) { 88 printf("%s\n n, 比較回数, 交換回数, チェック", s); 89 printf("\n"); 90} 91 92void print_step(int n){ 93 printf("%4d, %8d, %8d", n, comp, swap); 94 95 if (sorted(n)) { /* 配列が整列されているかチェック */ 96 printf(", sorted\n"); 97 } else { 98 printf(", unsorted\n"); 99 } 100} 101 102int sorted(int n) { 103 int i; 104 for (i=0; i < n-1; i++) 105 if (a[i] > a[i+1]) return 0; 106 return 1; 107} 108 109 110void merge_sort_array(int a[], int low, int high){ 111 int mid, i, j, k; 112 113 if(low >= high) 114 return; 115 mid = (low + high) / 2; 116 merge_sort_array(a, low, mid); 117 merge_sort_array(a, mid + 1, high); 118 119 for (i = low; i <= mid; i++){ 120 b[i] = a[i]; 121 } 122 for(i = mid + 1, j = high; i <= high; i++, j--){ 123 b[i] = a[j]; 124 } 125 126

試したこと

110行目のmerge_sort_arrayの引数にint [b]を加えた。

補足情報(FW/ツールのバージョンなど)

110行目以降のmerge_sort_arrayの中身と必要に応じてマージソートの作業領域の配列や使用する変数などは変更可です。
制限があり申し訳ありませんが、お願いします。
VScodeを使用して作成デバッグしています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

main() 関数で変数 low high を初期化してないから、かもしれません。
そもそもこれらの変数は不要で、main() からの merge_sort_array() 呼び出しは常に merge_sort_array(a, 0, n - 1); でいいと思います。

質問文の雰囲気からしてUNIX系の環境で作業をしているのだと思いますが、コンパイルすときは -Wall オプションを付けて、出てくる警告をすべて解決しましょう。

投稿2023/06/05 03:37

編集2023/06/05 04:33
int32_t

総合スコア21666

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

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

marimo77

2023/06/05 03:39

ありがとうございます。試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問