
以下のようなプログラムを書いているのですが、delete [] ang;の行を実行すると、
Debug Assertion Failed!
Program: ...\Debug\pro.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
というエラーが発生します。
fscanfを書いてからうまくいかなくなってきたので、modtorがオーバーフローしてるのかな?とも思ったのですが、特にそれらしいものは見当たりません。
いったい何が原因なのでしょうか?
よろしくお願いします。
#include<stdio.h>
#include<string>
using namespace std;
void main(void){
int i;
int ret;
static const int anum=3;
static const int LoopMax=100;
double *modtor=new double[LoopMax*anum];
double *ang=new double[LoopMax*2*anum];
const string strlearned="A.csv";
const string strlearning="_learning.csv";
FILE *fpl;
FILE *fpvnmd;
errno_t err;
double outputv[anum]={0};
double tempd;
double *tarr=new double[LoopMax];
//delete [] tarr; //ここで消すとエラーが消える
fopen_s(&fpl,strlearned.c_str(),"r");
printf("データ読み込み\n");
for(i=0;i<LoopMax;i++){
if(fscanf(fpl,"%[^,],%lf,%lf,%lf,%lf",&tempd,&modtor[anum*i],&modtor[anum*i+1],&modtor[anum*i+2])==EOF)break;
}
fclose(fpl);
delete [] ang;
delete [] tarr;
delete [] modtor;
}
No.4ベストアンサー
- 回答日時:
>この意味を余りよく知らないのです^^;
これが原因なので意味を理解しないまま使ってはだめでしょう。
%[~]は文字列を読み込む指定子の1つです。(普通は%sですね)
フォーマット系の可変引数の関数では引数の型チェックができません。
フォーマット指定子と実際の引数の型を合わせるのはプログラマの責任で型が合わないとこのようなバグを引き起こします。
>この「*」は何を意味しているのでしょうか?
http://www.linux.or.jp/JM/html/LDP_man-pages/man … より引用
-------------------
代入抑制文字"*"。 scanf() は変換指定に指示された通り入力を読み込むが、その入力は捨てられる。対応する pointer 引き数は必要なく、 scanf() が返す代入が成功した数にこの指定は含まれない。
-------------------
です。
No.5
- 回答日時:
4. 「元のままだと「5番目の引数が無いので、」とありますが、もとの場合、5番目の引数は、「&modtor[anum*i+1]」となっていると思うのですが、これはどういう意味なのでしょうか?
フォーマット指定部分"%[^,],%lf,%lf,%lf,%lf"では5個の指定がありますが読み込む変数が
&tempd
&modtor[anum*i]
&modtor[anum*i+1]
&modtor[anum*i+2]
の4個しかないということでしょう。
今回は個数の問題だけでもなく1個目の型があってないのも原因ですが。
データが
0.000000,0.000000,0.010127,0.210067
なら
fscanf(fpl,"%lf,%lf,%lf,%lf",&tempd,&modtor[anum*i],&modtor[anum*i+1],&modtor[anum*i+2])
でも問題なかったのでは。
No.3
- 回答日時:
その「
http://simd.jugem.jp/?eid=49」には「%[^,] を使用することにより、カンマ以外の_文_字_列_を読み込むという_指_定_が出来るわけです。」とありますが?No.2
- 回答日時:
%[^,] に対して double tempd でいいの?
>%[^,] に対して double tempd でいいの?
これは、どういう意味なのでしょうか?
実は、%[^,]はhttp://simd.jugem.jp/?eid=49 に、こう書くとカンマを無視して読み込めるようになると書いてあったから、付けただけなもので、この意味を余りよく知らないのです^^;
No.1
- 回答日時:
if(fscanf(fpl,"%[^,],%lf,%lf,%lf,%lf",&tempd,&modtor[anum*i],&modtor[anum*i+1],&modtor[anum*i+2])==EOF)break;
を
if(fscanf(fpl,"%*[^,],%lf,%lf,%lf",&modtor[anum*i],&modtor[anum*i+1],&modtor[anum*i+2])!=anum)break;
にしてみよう。
「scanfは引数が足りなくても知ったこっちゃない」と「scanfは読み捨て可能」と、2つの事を覚えましょう。
元のままだと「5番目の引数が無いので、メモリ上にあったゴミをアドレスだと思って、そこに実数値を格納し、メモリがグチャグチャに壊れる」とか「カンマ以外を読み捨てる時、読み捨てるバイト数がdoubleオブジェクトのサイズを超えてたら、メモリがグチャグチャに壊れる」って事が起きます。
つか、
> //delete [] tarr; //ここで消すとエラーが消える
の状態で実行時エラーが出ないで動いちゃうのが不思議。偶然「壊れても構わないメモリが壊れているだけ」なんだろうなあ。
解答有り難うございます。
if(fscanf(fpl,"%*[^,],%lf,%lf,%lf",&modtor[anum*i],&modtor[anum*i+1],&modtor[anum*i+2])!=anum)break;
について、いくつか質問があります。
1. 「%*[^,]」という記述がありますが、この「*」は何を意味しているのでしょうか?
2. 「scanfは引数が足りなくても知ったこっちゃない」と「scanfは読み捨て可能」とのことですが、ここでいう引数とは、「,&modtor[anum*i],&modtor[anum*i+1],&modtor[anum*i+2]」の部分のことを指しているのでしょうか?
また、私は、一列目の値を「,&tempd」で空読みするようにしてみていたのですが、chie65535さんの方では、この部分がなくなり、%lfの数も3つになっていますが、このことに関係しているのでしょうか?
もしそうなら、どのように関係しているのでしょうか?
3. chie65535さんは、fscanfの戻り値が、anumでなければ終了としていますが、これは行の項目数が3でなければ、想定している項目数と違うから終了。という解釈で良いんでしょうか?
4. 「元のままだと「5番目の引数が無いので、」とありますが、もとの場合、5番目の引数は、「&modtor[anum*i+1]」となっていると思うのですが、これはどういう意味なのでしょうか?
私の疑問は、どういうデータファイルを読み込んでいるのか、書き忘れてたから出ている部分もあるのかな・・・
私が使っているデータは、
0.000000,0.000000,0.010127,0.210067
0.010000,0.000000,0.059026,0.178709
0.020000,0.000000,0.096992,0.153418
・
・
・
0.990000,0.000000,-0.020241,0.019949
という、100行のデータになっています。
長々となってしまいましたが宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
データ数の多い構造体配列
-
C言語によるチェビシェフ窓の計...
-
C 開放してるのにエラー(doubl...
-
3次方程式の求解プログラム(...
-
doubleの変数にintとintの割り...
-
3次元配列使用でStackOverflowE...
-
C言語で
-
float型とdouble型の変数の違い...
-
c言語でユーザ関数を利用して複...
-
漸化式のプログラム
-
C言語を実行すると-infが出てき...
-
シンプソン則について
-
2次方程式の解を求めるプログ...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
C言語 配列の確保
-
C言語でdouble型の小数点の引き...
-
c言語でDFTのプログラムを作成...
-
指数の表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
C言語でdouble型の小数点の引き...
-
difftime()について
-
doubleは常に%lfとするべきなのか
-
C#イベント中の戻り値の設定の...
-
c言語で、繰り返し文の中で、0....
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
c言語のプログラミングについて...
-
バイナリから実数を取得したい...
-
c言語のコンパイルエラー canno...
-
関数におけるif文とreturn文に...
おすすめ情報