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

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

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

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Q&A

解決済

3回答

1284閲覧

C言語 Segmentation Faultについて ソートプログラム

Glock

総合スコア1

C

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

0グッド

0クリップ

投稿2021/08/14 15:08

編集2021/08/14 15:09

前提・実現したいこと

配列をスワップソートとバブルソートで整列するプログラムを作成しています。作成したプログラムを実行するとsegmentation fault と表示されてしまいます。おそらくポインタの使い方が間違っている気がするのですが、どこが違っているのかいまいち分かりません。申し訳ないのですがどなたか教えていただけないでしょうか。

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

segmentation faule

エラーメッセージ

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4#include <time.h> 5 6#define N 1000000 7 8typedef struct _point { 9 int x[10]; /* 0, 1, 2, 3 のいずれかの値 */ 10} POINT; 11 12POINT* A[N]; 13int count_bubble = 0; 14int swap_bubble = 0; 15int count_quick = 0; 16int swap_quick; 17 18void crear_the_point(int n) 19{ 20 for (int t = 0; t < n; ++t) 21 { 22 A[t] = 0; 23 } 24} 25 26float pointcmp(POINT* p1, POINT* p2) { 27 int i; 28 float q1 = 0.0, q2 = 0.0; 29 for (i = 0; i < 10; i++) { 30 q1 += pow(p1->x[i], 2); 31 q2 += pow(p2->x[i], 2); 32 } 33 q1 = sqrt(q1); 34 q2 = sqrt(q2); 35 36 return q1 - q2; 37} 38 39void swap(int a, int b) 40{ 41 POINT* temp; 42 temp = A[a]; 43 A[a] = A[b]; 44 A[b] = temp; 45} 46 47void sortBubble() 48{ 49 int i, j; 50 for (i = 0; i < N - 1; i++) 51 { 52 for (j = N - 1; j > i; j--) 53 { 54 ++count_bubble; 55 if (pointcmp(A[i], A[j]) > 0) 56 { 57 swap(i, j); 58 ++swap_bubble; 59 } 60 } 61 } 62} 63 64POINT* create_point() 65{ 66 POINT* p; 67 p = (POINT*)malloc(sizeof(POINT)); 68 int i; 69 for (i = 0; i < 10; i++) { 70 p->x[i] = (double)rand() / ((double)RAND_MAX + 1.0) * 3; 71 } 72 return p; 73} 74 75void creat_bb(int n) 76{ 77 for (int i = 0; i < n; ++i) 78 { 79 A[i] = create_point(); 80 } 81} 82 83int partition(int m, int n) 84{ 85 for (int i = m; i < n; ++i) 86 { 87 if (pointcmp(A[i], A[n]) < 0) 88 { 89 swap(m, i); 90 ++swap_quick; 91 ++m; 92 } 93 } 94 swap(n, m); 95 ++swap_quick; 96 return m; 97} 98 99 100 101void quick_sort(int t, int s) 102{ 103 int aa; 104 if (t < s) 105 { 106 aa = partition(t, s); 107 quick_sort(t, aa - 1); 108 quick_sort(aa + 1, s); 109 } 110} 111 112int main(void) 113{ 114 int n; 115 clock_t start, end; 116 double time = 0; 117 scanf("%d\n", &n); 118 creat_bb(n); 119 start = clock(); 120 sortBubble(); 121 end = clock(); 122 time =(double) end - start; 123 printf("%d,%d,%lf", count_bubble, swap_bubble, time); 124} 125 126} 127

試したこと

gcc -g ファイル名.c -lm で実行してみましたが特に新たなファイルは出ず、nの値を入力すると止まってしまいました。

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

gitpod を使用しています。

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

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

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

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

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

guest

回答3

0

セグメンテーションフォールトせずにソートできるのは N 個のデータをソートする時だけ、そんなプログラムになってます。

最初に scanf() で入力するデータ数が N より少ない場合、 A[N - 1] の値は初期値である 0、即ち NULLポインタのままです。ところが、sortBubble() は A[0] と A[N - 1] を比較することから動作を開始します。その結果、pointcmp() は一回目の呼出しで0番地をアクセスしてしまう。

投稿2021/08/15 00:12

rubato6809

総合スコア1382

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

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

0

作成したポインタの範囲とソートする範囲が違うのでは?

ソートする範囲が、ポインタを作成していない範囲も
ソートと対象になっていると思われます。

どこまで動いているのか、printfなどを入れて確認してみては。

投稿2021/08/14 15:22

ai_2013_dev

総合スコア338

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

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

Glock

2021/08/14 15:30

ありがとうございます、一度試してみます
guest

0

ベストアンサー

POINT* A[N];

ポインタの配列になってますが、初期化されてる形跡ありませんね

scanf("%d\n", &n);

creat_bb(n);

でn個の初期化してんだけど
sortBubble()
でなにやってんだってはなしですね

投稿2021/08/14 15:10

編集2021/08/14 15:19
y_waiwai

総合スコア88042

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

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

Glock

2021/08/14 15:28 編集

ソートバブルのソート範囲がおかしいという事でしょうか?
y_waiwai

2021/08/14 21:19

sortBubbleではN個操作してます 初期化されてないところまでソートしてます
y_waiwai

2021/08/14 21:20

C言語のコードを組むなら、デバッグ環境を揃えましょう コードの任意の場所で実行を止めて、変数のナカミを見ることができます また、1行づつ実行させて、動作を確認できます そうすれば、自分のコードがどうなってるかわからない、ってことはなくなります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問