前提・実現したいこと
pythonで作成したfloatの数値が1000個入っているバイナリファイルを読み取り、 自己相関関数にかけ、出力された数値をまたバイナリファイルとして出力するプログラムです 自己相関関数であるため、fの数値を一つずらしてgに代入する処理をバイナリファイル内の個数(1000)回繰り返しています
発生している問題・エラーメッセージ
問題はうまくfの数値を一つずらしてgに代入する処理ができていないことです fseek(fp,0,SEEK_SET); fread(f,sizeof(float),nNum,fp); fseek(fp,sizeof(float)*(i+1),SEEK_SET); fread(g,sizeof(float),nNum-i,fp); g[nNum-i] = f[i]; この部分がfへの代入、gへ一つずらし代入という処理を行っています 途中の for (int k=0;k<nNum;k++) { printf("%f %f\n", f[k], g[k]); //確認用コード } で中の配列がどのようになっているのかを確認してみたのですが、 うまく組めていないのか、gへの代入ができておらず、 0だけしか出力されていない状態です 関係ないかもしれませんが、このプログラムを動作させるとほぼ必ずNortonセキュリティ遮断がかかります ファイル自体は出力されているので大丈夫かと思っていますが自動保護を無効にしても動くので気になっています 考えてはみたのですが、結局わからなかったので質問させていただきます 解決方法か、なにか解決につながるような考え方や、デバッグ方法など教えていただければ幸いです
該当のソースコード
Python
1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <math.h> 5#include <time.h> 6#include <unistd.h> 7 8size_t get_file_size(const char *pFilename) 9{ 10 FILE *fp=NULL; 11 size_t nRet=0; 12 if (pFilename!=NULL) { 13 if ((fp=fopen(pFilename,"rb"))!=NULL) { 14 fseek(fp,0,SEEK_END); 15 nRet=ftell(fp); 16 fseek(fp,0,SEEK_SET); 17 nRet-=ftell(fp); 18 fclose(fp); 19 } 20 } 21 return (nRet); 22} 23 24float correlation(float f[], float g[], int N) 25{ 26 float Rt = 0; 27 for(int n = 0; n < N; n++) 28 { 29 Rt = Rt + f[n] * g[n]; 30// printf("%.20f\n", Rt); 31 } 32 33 return Rt; 34} 35 36int main(void) 37{ 38 FILE *fp=NULL; 39 float *p=NULL; 40 char pFilename[]="correlation.float"; 41 size_t sz=0; 42 int nNum=0; 43 int i; 44 float *f = NULL; 45 float *g = NULL; 46 float *Rt = NULL; 47 48 sz=get_file_size(pFilename); 49 nNum=sz/sizeof(float); 50// printf("%d %d", sz, nNum); //確認用コード 51 52 53 if ((fp=fopen(pFilename,"rb"))==NULL) { 54 goto Release; 55 printf("ファイルが空です\n"); 56 } 57 if ((p=(float*)malloc(nNum*sizeof(float)))==NULL) { 58 goto Release; 59 printf("ファイル内のデータサイズが不正です\n"); 60 } 61 62 remove("function.float"); 63 FILE *fp3 = NULL; 64 if ((fp3=fopen("function.float","rb"))==NULL) { 65 printf("正常\n"); 66 } 67 fclose(fp3); 68 69 70 71 for(i = 0; i < nNum; i++) 72 { 73 fread(p,sizeof(float),nNum,fp); 74 f = (float*)malloc(nNum*sizeof(float)); 75 g = (float*)malloc(nNum*sizeof(float)); 76 Rt = (float*)malloc(sizeof(float)); 77 fseek(fp,0,SEEK_SET); 78 fread(f,sizeof(float),nNum,fp); 79 80 fseek(fp,sizeof(float)*(i+1),SEEK_SET); 81 fread(g,sizeof(float),nNum-i,fp); 82 g[nNum-i] = f[i]; 83 84 /*for (int k=0;k<nNum;k++) 85 { 86 printf("%f %f\n", f[k], g[k]); //確認用コード 87 }*/ 88 89 Rt[0] = correlation(f, g, nNum); 90 Rt[0] = Rt[0] / (nNum + 1); 91 //printf("%.20f\n", Rt[0]); //確認用コード 92 FILE *fp2 = NULL; 93 fp2 = fopen("function.float", "ab"); 94 fwrite(Rt,sizeof(float),1,fp2); 95 free(f); 96 free(g); 97 free(Rt); 98 fclose(fp2); 99 } 100 101 //printf("%f %f\n", f[nNum - 1], g[nNum - 1]); //確認用コード 102 103 Release: 104 if (p!=NULL) { 105 free(p); 106 } 107 if (fp!=NULL) { 108 fclose(fp); 109 } 110 return (0); 111}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。