前提・実現したいこと
テキストファイルから1行ずつデータをchar
型配列に読み込み、int
型に変換してから配列の平均を除去・正規化し内積を計算して相関係数を算出するプログラムを作る。
勉強のためにポインタと動的確保を使ってみることとする。
発生している問題・エラーメッセージ
4つのファイル別のデータを各配列に入れて利用したいのですが、想定したとおりに構造ができず困っています。(data_raw[]
に各4ファイルの階層がありその中のdata_raw[][]
に数値が一行づつ入っている構造)
今のところファイルの先頭の行が全てのdata_raw[]
に入ってしまいます。これをdata_raw[][]
に入れたいです。
他の方法を選ぶべきでしたらご教授いただけると幸いです。
該当のテキストファイル
rdata1.txt
573 577 595 600 598 598 612 608 607 616 618 610 621 620 635 648 675 693 710 740 772 781 781 790 831 843 866 878 918 956 1005 1020 1004 977 954 933 914 915 711 886 829 810 784 773 780 795 773 754 793 821 820 871 918 975 1049 1147 1139 1083 675 718 872 846 869 841 765 664 704 723 716 677 632 623 599 568 530 499 469 436 406 358 300 249 215 187 179 132 [EOF]
該当のソースコード
C
1#include "targetver.h" 2 3#define _CRT_SECURE_NO_WARNINGS 4#define F_C 4 //file_count 5#define D_S 85 //data_size 6 7#include <math.h> 8#include <stdio.h> 9#include <stdlib.h> 10#include <tchar.h> 11 12 13double in_pro(double v1[], double v2[], int size); 14 15int main(void) 16{ 17 FILE *fp; 18 int n = 0; 19 int sum[F_C], data[F_C][D_S]; 20 char *filename[F_C] = { "rdata1.txt", "rdata2.txt", "rdata3.txt", "rdata4.txt" }; 21 char ***data_raw; 22 double u1[] = { 1, 0, 0 }; 23 double u2[] = { 0, sqrt(3) / 2, 0.5 }; 24 double u3[] = { 0, 0.5, -sqrt(3) / 2 }; 25 double xn[] = { 2, -1, 1 }; 26 double a[3]; 27 double x[6]; 28 double g[3]; 29 30 data_raw = (char ***)malloc(sizeof(char **) * F_C); 31 for (size_t i = 0; i < F_C; i++) 32 { 33 data_raw[i] = (char **)malloc(sizeof(char *) * D_S); 34 for (size_t j = 0; j < D_S; j++) 35 { 36 data_raw[i][j] = (char *)malloc(sizeof(char) * 0x10); 37 } 38 } 39 40 for (size_t i = 0; i < F_C; i++) 41 { 42 if ((fp = fopen(filename[i], "r")) == NULL) 43 { 44 fprintf(stderr, "Failed to opening %s.\n", filename[i]); 45 exit(EXIT_FAILURE); 46 } 47 48 while (fgets(data_raw[i][n], 0x10, fp) != NULL) 49 { 50 n++; 51 //puts(data_raw[i][n]); 52 } 53 n = 0; 54 } 55 56 for (size_t i = 0; i < F_C; i++) 57 { 58 for (size_t j = 0; j < D_S; j++) 59 { 60 data[i][j] = atoi(data_raw[i][j]); 61 sum[i] += data[i][j]; 62 } 63 sum[i] /= D_S; 64 printf("%d\n", sum[i]); 65 } 66 67 68 printf("***\tH30\tDSP1-3\t23\t***\n\n"); 69 70 printf("u1:[%f, %f, %f]\n", u1[0], u1[1], u1[2]); 71 printf("u2:[%f, %f, %f]\n", u2[0], u2[1], u2[2]); 72 printf("u3:[%f, %f, %f]\n \n", u3[0], u3[1], u3[2]); 73 74 x[0] = in_pro(u1, u1, 3); 75 x[1] = in_pro(u1, u2, 3); 76 x[2] = in_pro(u1, u3, 3); 77 x[3] = in_pro(u2, u2, 3); 78 x[4] = in_pro(u2, u3, 3); 79 x[5] = in_pro(u3, u3, 3); 80 81 printf("u1 * u1 : %f\n", x[0]); 82 printf("u1 * u2 : %f\n", x[1]); 83 printf("u1 * u3 : %f\n", x[2]); 84 printf("u2 * u2 : %f\n", x[3]); 85 printf("u2 * u3 : %f\n", x[4]); 86 printf("u3 * u3 : %f\n \n", x[5]); 87 88 a[0] = in_pro(xn, u1, 3); 89 a[1] = in_pro(xn, u2, 3); 90 a[2] = in_pro(xn, u3, 3); 91 92 printf("a1[%f], a2[%f], a3[%f]\n \n", a[0], a[1], a[2]); 93 94 for (size_t i = 0; i < 3; i++) g[i] = a[0] * u1[i] + a[1] * u2[i] + a[2] * u3[i]; 95 96 printf("g[%f, %f, %f]\n", g[0], g[1], g[2]); 97 98 99 fclose(fp); 100 return 0; 101} 102 103double in_pro(double v1[], double v2[], int size) 104{ 105 int i; 106 double x = 0; 107 for (i = 0; i < size; i++) x += v1[i] * v2[i]; 108 109 return x; 110}
補足情報(FW/ツールのバージョンなど)
VisualStudio2015
VCコンパイラ
回答4件
あなたの回答
tips
プレビュー