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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

947閲覧

freadにNULLが入ってしまうのを解決できない。

hiro12358

総合スコア6

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/10/13 07:13

発生している問題

freadにNULLが入力されエラーが発生する。
エラー個所は下記のソースコードにおいて、『今回のエラー部分』というコメントアウトで覆った部分です。

※長くなるのでヘッダーなどのソースコードは省略させてもらいました。
なお、前回の質問のほうに省略されたヘッダ-は記載してあります。

該当のソースコード

C++

1 2int main() 3{ 4 SpParam sp; 5 WrSWaveFileHeader wHdr; 6 long totalLength; 7 8 unsigned long sampRate; 9 unsigned short sampBits; 10 long posOfData, sizeOfData; 11 12 FILE *fpS1,*fpS2; 13 errno_t err; 14 15 16 char filename1[200], filename2[200]; 17 18 19 printf("比較するwavの名前を入れてください。\n"); 20 scanf_s("%s", filename1,200); 21 22 23 err = fopen_s(&fpS1, "soukanyou1.wav", "rb"); 24 if (err != 0) 25 { 26 fprintf(stderr, "%s をオープンできません.\n", filename1); 27 getchar(); 28 exit(EXIT_FAILURE); 29 } 30 31 // エラー確認兼ねるインプットしたWAVファイルのヘッダーの読み込み 32 if (wavHdrRead(&*fpS1, &sampRate, &sampBits, &posOfData, &sizeOfData) != 0) //FILE型の中身はunsigned char。 33 return -1; 34 35 fseek(fpS1, posOfData, SEEK_SET); 36 37 short *InS1; 38 InS1 = (short*)malloc(sizeOfData);//sizeofはそれの大きさ 39 40////////////////////今回のエラー部分///////////////////// 41 if (fread(InS1, sizeOfData, 1, fpS1) != 1) 42 return -1; 43///////////////////////////////////////////////////////// 44 45 46 printf("比較元のwavの名前を入れてください。\n"); 47 scanf_s("%s", filename2, 200); 48 49 err = fopen_s(&fpS2, "soukanyou2.wav", "rb"); 50 if (err != 0) 51 { 52 fprintf(stderr, "%s をオープンできません.\n", filename2); 53 getchar(); 54 exit(EXIT_FAILURE); 55 } 56 57 //エラー確認兼ねるインプットしたWAVファイルのヘッダーの読み込み 58 if (wavHdrRead(&*fpS2, &sampRate, &sampBits, &posOfData, &sizeOfData) != 0) //FILE型の中身はunsigned char。 59 return -1; 60 61 fseek(fpS2, posOfData, SEEK_SET); 62 63 short *InS2; 64 InS2 = (short*)malloc(sizeOfData); 65 66 if (fread(InS2, sizeOfData, 1, fpS2) != 1) 67 return -1; 68 69 int i, k; 70 71 short *soukan; 72 soukan = (short*)malloc(sizeof(sizeOfData)); 73 74 for (k = 0; k < 16000; k++)//sizeOfData - i 75 { 76 for (i = 0; i < 16000; i++) 77 { 78 soukan[k] = soukan[k] + InS1[i] * InS2[i + k]; 79 } 80 81 } 82 83 //相関関数soukan[k]の最大値を探す。 84 85 int j; 86 short soukanMax; 87 soukanMax = 0; 88 89 for (j = 0; j < 16000; j++) 90 { 91 if (soukanMax < soukan[j]) 92 soukanMax = soukan[j]; 93 } 94 95 printf("相関関数の値は %d 。\n", soukanMax); 96 97 return 0; 98 99 free(InS1); 100 free(InS2); 101 102 103 104 fclose(fpS1); 105 fclose(fpS2); 106 107 char cheak; 108 109 scanf_s("%s", cheak, 200); 110 111 return 0; 112} 113

以下、エラー直前の自動変数

+ InS1 0xcccccccccccccccc {???} short * + fpS1 0x0000020c7a493500 {_Placeholder=0x0000000000000000 } _iobuf * fseek 0x00007ff6b9f162b6 {Soukan.exe!fseek} void * malloc 0x00007ff6b9f162e0 {Soukan.exe!malloc} void * posOfData 44 long sizeOfData 64000 long

補足

前回の質問を顧みて、メイン関数から直接プログラムを繋げエラーの原因を探してみたところ、そもそもfreadに渡す値に何らかの誤りがあるようだと判明しました。しかし、そこから進むことができなくなってしまったので、コードミスや基礎的な間違いでもいいので、指摘してもらえたらありがたいです。

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

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

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

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

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

LouiS0616

2017/10/13 08:57

どのようなエラーメッセージが出ますか?
guest

回答1

0

ベストアンサー

前の質問を拝見しましたが、wavHdrRead 関数で fclose を呼び出しているからかと思われます。閉じられたファイルポインターには操作できません。

投稿2017/10/13 16:45

chitoku

総合スコア1610

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

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

hiro12358

2017/10/17 06:47

前の質問まで辿っていただいたようでありがとうございました。無事、通りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問