前提・実現したいこと
k近傍による判断結果を出力するコードを書いている途中です。
実現したいこと
・a配列の2次元配列(nxd)の動的メモリ確保の仕方
・mergesort関数によるコアダンプの修正
発生している問題・エラーメッセージ
セグメンテーション違反です (コアダンプ)
該当のソースコード
C
1#include<stdio.h> 2#include<stdlib.h> 3#include<math.h> 4#define k 3 5int merge(double *arr,int p,int q,int r){ 6 int i,j=0,bi=p,ci=q+1; 7 double *T=(double*)malloc((r-p+1)*sizeof(double)); 8 while(bi!=q+1){ 9 if(arr[bi]<=arr[ci]){ 10 T[j]=arr[bi]; 11 ++j; 12 ++bi; 13 }else{ 14 T[j]=arr[ci]; 15 ++j; 16 ++ci; 17 } 18 if(ci==r+1){ 19 break; 20 } 21 } 22 if(bi==q+1){ 23 while(j!=r-p+1){ 24 T[j]=arr[ci]; 25 ++j; 26 ++ci; 27 } 28 }else if(ci==r+1){ 29 while(j!=r-p+1){ 30 T[j]=arr[bi]; 31 ++j; 32 ++bi; 33 } 34 } 35 for(i=0;i<r-p+1;++i){ 36 arr[i+p]=T[i]; 37 } 38 free(T); 39 return 0; 40} 41int mergesort(double *arr,int a,int b){ 42 int mid; 43 double t=0; 44 if(a+1==b){ 45 if(arr[a]>arr[b]){ 46 t=arr[a]; 47 arr[a]=arr[b]; 48 arr[b]=t; 49 } 50 return 1; 51 } 52 mid=(a+b)/2; 53 mergesort(arr,a,mid); 54 mergesort(arr,mid+1,b); 55 merge(arr,a,mid,b); 56 return 0; 57} 58double dis(int size1,int size2,double a[size1][size2],double *s){ 59 double u,v,ans1=0,ans=0; 60 int i=0; 61 for(i=0;i<size2;++i){ 62 u=a[size1][i]; 63 v=s[i]; 64 ans1+=pow((u-v),2); 65 } 66 ans=sqrt(ans1); 67 printf("%lf ",ans); 68 return ans; 69} 70int knn_diag(double *s,int n,int d,double a[n][d]){ 71 int i=0,c=0; 72 double b[5]={}; 73 for(i=0;i<n;++i){ 74 b[i]=dis(i,d,a,s);//距離をbに代入 75 } 76 /*for(i=0;i<n;++i){ 77 printf("%lf ",b[i]); 78 }*/ 79 c=mergesort(b,0,n-1);//小さい方から順に並べる 80 for(i=0;i<k;++i){ 81 printf("%lf \n",b[i]);//k番目まで出力 82 } 83 return 0; 84} 85int main(){ 86 int n,d,i=0,j=0,c=0; 87 scanf("%d %d",&n,&d); 88 //n=5,d=2; 89 double a[5][2]={{180.0,60.0},{164.0,90.0},{151.0,80.0},{153.0,50.0},{172.0,40.0}};//aをnxd配列の動的メモリ確保 90 91 //aにnxd個のデータを標準入力で代入 92 /*for(i=0;i<n;++i){ 93 for(j=0;j<d;++j){ 94 scanf("%lf",&a[i][j]); 95 } 96 }*/ 97 double *s=(double*)malloc(d*sizeof(double)); 98 //s配列にd個のデータを標準入力で代入 99 for(i=0;i<d;++i){ 100 scanf("%lf",&s[i]); 101 } 102 c=knn_diag(s,n,d,a); 103 if(c==0){ 104 printf("You are healthy!\n"); 105 }else{ 106 printf("You have a heart disease!\n"); 107 } 108 return 0; 109}
試したこと
knn_diag関数でmergesort関数による並び替えをするところでコアダンプが発生したと思います。
補足情報(FW/ツールのバージョンなど)
標準入力
5 2
150 60
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。