fclose() 调用时出现的问题!

westhoods 2006-05-04 10:54:29
本人想在 vc6.0 中使用matlab生成的关于模糊控制的fis文件,于是准备对matlab\toolbox\fuzzy\fis.c 中的函数进行一个封装,但在使用其中的函数
DOUBLE ** returnFismatrix(char *fis_file, int *row_n_p, int *col_n_p);
时会出现运行时的问题 Invalid Address specified to RtlValidateHeap,调试发现问题出在 函数一个fclose()的调用中,由于没有fclose.c 文件,再向函数内跟踪,都是一些看不懂的汇编代码,最奇怪的是该函数只是在调用特别的几个fis文件时才出问题,对于其他的文件运行起来都完全没有问题。

下面是returnFismatrix函数的源码和出问题的fis文件,希望有仁兄能指出问题所在 ;

DOUBLE ** returnFismatrix(char *fis_file, int *row_n_p, int *col_n_p)
{
int i, j, k;
FILE *fp;
char buf[STR_LEN];
char str1[STR_LEN], str2[STR_LEN], str3[STR_LEN], str4[STR_LEN];
char fisType[STR_LEN];

int in_n, out_n, rule_n;
int mf_n;

int now;
DOUBLE **fismatrix;
DOUBLE *in_mf_n, *out_mf_n;

fismatrix = returnEmptyFismatrix(fis_file, row_n_p, col_n_p);

fp = fisOpenFile(fis_file, "r");
/* looping till it finds "[System]" */
while (1) {
if (getNextLine(buf, fp) == NULL)
fisError("Cannot find [System] in FIS file!");
if (!strcmp(buf, "[System]")) /* found it! */
break;
}

/* get FIS information */
now = 0;
getString(buf, fp, fismatrix[now++]); /* name */
getString(buf, fp, fismatrix[now++]); /* type */
for (i = 0; i < STR_LEN && fismatrix[1][i] != 0; i++)
fisType[i] = (int) fismatrix[1][i];
fisType[i] = 0;
in_n = (int)getNumber(buf, fp);
out_n = (int)getNumber(buf, fp);

fismatrix[now][0] = (DOUBLE) in_n;
fismatrix[now][1] = (DOUBLE) out_n;
now++;

/* create in_mf_n and out_mf_n */
in_mf_n = (DOUBLE *)fisCalloc(in_n, sizeof(DOUBLE));
out_mf_n = (DOUBLE *)fisCalloc(out_n, sizeof(DOUBLE));
getMfN(fis_file, in_n, in_mf_n, out_n, out_mf_n);
for (i = 0; i < in_n; i++)
fismatrix[now][i] = in_mf_n[i];
now++;
for (i = 0; i < out_n; i++)
fismatrix[now][i] = out_mf_n[i];
now++;
rule_n = (int)getNumber(buf, fp);
fismatrix[now++][0] = (DOUBLE) rule_n;
getString(buf, fp, fismatrix[now++]); /* and method */
getString(buf, fp, fismatrix[now++]); /* or method */
getString(buf, fp, fismatrix[now++]); /* imp method */
getString(buf, fp, fismatrix[now++]); /* agg method */
getString(buf, fp, fismatrix[now++]); /* defuzz method */
fclose(fp);

/*
printf("in_n = %d, out_n = %d, rule_n = %d\n", in_n, out_n, rule_n);
*/

/* get input & output labels */
/* get rid of FIS name */
fp = fisOpenFile(fis_file, "r");
while (1) {
if (getNextLine(buf, fp) == NULL)
fisError("Cannot find the first Name in FIS file!");
if (sscanf(buf, " Name = '%[^']' ", str1) == 1)
break;
}
for (i = 0; i < in_n+out_n; i++) {
while (1) {
if (getNextLine(buf, fp) == NULL)
fisError("Not enough Name in FIS file!");
if (sscanf(buf, " Name = '%[^']' ", str1) == 1)
break;
}
for (j = 0; j < (int)strlen(str1); j++)
fismatrix[now][j] = str1[j];
now++;
}
fclose(fp);

/* get input & output ranges */
fp = fisOpenFile(fis_file, "r");
for (i = 0; i < in_n+out_n; i++) {
while (1) {
if (getNextLine(buf, fp) == NULL)
fisError("Not enough Range in FIS file!");
if (sscanf(buf, " Range = [ %[^]] ", str1) == 1)
break;
}
if (getArray(str1, fismatrix[now++]) != 2)
fisError("Error in parsing I/O ranges.");
}
fclose(fp);

/* get input and output MF labels */
fp = fisOpenFile(fis_file, "r");
for (i = 0; i < in_n+out_n; i++) {
mf_n = i < in_n? in_mf_n[i]:out_mf_n[i-in_n];
for (j = 0; j < mf_n; j++) {
while (1) {
if (getNextLine(buf, fp) == NULL)
fisError("Not enough MF Labels in FIS file!");
if (sscanf(buf, " %[^']'%[^']' : '%[^']' , [ %[^]] ",
str1, str2, str3, str4) == 4)
break;
}
for (k = 0; k < (int)strlen(str2); k++)
fismatrix[now][k] = str2[k];
now++;
}
}
fclose(fp);

/* get input and output MF types */
fp = fisOpenFile(fis_file, "r");
for (i = 0; i < in_n+out_n; i++) {
mf_n = i < in_n? in_mf_n[i]:out_mf_n[i-in_n];
for (j = 0; j < mf_n; j++) {
while (1) {
if (getNextLine(buf, fp) == NULL)
fisError("Not enough MF types in FIS file!");
if (sscanf(buf, " %[^']'%[^']' : '%[^']' , [ %[^]] ",
str1, str2, str3, str4) == 4)
break;
}
for (k = 0; k < (int)strlen(str3); k++)
fismatrix[now][k] = str3[k];
now++;
}
}
fclose(fp);

/* get input & output MF parameters */
fp = fisOpenFile(fis_file, "r");
for (i = 0; i < in_n+out_n; i++) {
mf_n = i < in_n? in_mf_n[i]:out_mf_n[i-in_n];
for (j = 0; j < mf_n; j++) {
while (1) {
if (getNextLine(buf, fp) == NULL)
fisError("Not enough MF parameters in FIS file!");
if (sscanf(buf, " %[^']'%[^']' : '%[^']' , [ %[^]] ",
str1, str2, str3, str4) == 4) {
/*
printf("%s\n", buf);
printf("str1 = %s\n", str1);
printf("str2 = %s\n", str2);
printf("str3 = %s\n", str3);
printf("str4 = %s\n", str4);
*/
break;
}
}
if (i < in_n) {
if (getArray(str4, fismatrix[now]) > MF_PARA_N) {
/*
printf("%s\n", str4);
printf("%d\n", getArray(str4, fismatrix[now]));
*/
fisError("Error in parsing input MF parameters.");
}
} else {
if (!strcmp(fisType, "mamdani")) {
if (getArray(str4, fismatrix[now]) > MF_PARA_N) {
fisError("Error in parsing output MF parameters.");
}
} else { /* sugeno system */
int tmp = getArray(str4, fismatrix[now]);
if (!strcmp(str3, "constant")){
if (tmp != 1)
fisError("Zero-order Sugeno system does not has the right number of output MF parameters.");
else { /* pad with zeros for zero coefficients */
fismatrix[now][in_n] = fismatrix[now][0];
fismatrix[now][0] = 0;
}
} else if (!strcmp(str3, "linear")) {
if (tmp != in_n+1)
fisError("First-order Sugeno system does not has the right number of output MF parameters.");
} else {
fisError("Unknown output MF type for Sugeno system.");
}
}
}
now++;
}
}
fclose(fp);

/* get rule list */
fp = fisOpenFile(fis_file, "r");
/* looping till it finds "[Rules]" */
while (1) {
if (getNextLine(buf, fp) == NULL)
fisError("Cannot find [Rules] in FIS file!");
if (!strcmp(buf, "[Rules]")) /* found it! */
break;
}

for (i = 0; i < rule_n; i++) {
if (getNextLine(buf, fp) == NULL)
fisError("Not enough rule list in FIS file!");
/* get rid of ",", "(" and ")" */
for (j = 0; j < (int)strlen(buf); j++)
if (buf[j]==',' || buf[j]=='(' || buf[j]==')' || buf[j]==':')
buf[j] = ' ';
if (getArray(buf, fismatrix[now++]) != in_n + out_n + 2) {
/*
printf("%s\n", buf);
printf("%d\n", getArray(buf, fismatrix[now]));
*/
fisError("Error in parsing rule list!");
}
}
fclose(fp);// 就是这个地方 !

/* clean up */
FREE(in_mf_n);
FREE(out_mf_n);

return(fismatrix);
}

...全文
282 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cutegang 2006-05-04
  • 打赏
  • 举报
回复
还好C++被发明了。
westhoods 2006-05-04
  • 打赏
  • 举报
回复
fis文件
[System]
Name='test'
Type='mamdani'
Version=2.0
NumInputs=9
NumOutputs=2
NumRules=11
AndMethod='min'
OrMethod='max'
ImpMethod='min'
AggMethod='max'
DefuzzMethod='centroid'

[Input1]
Name='input1'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-24.8 0.133 15.0132275132275]
MF2='mf2':'trimf',[8.79629629629628 14.7825396825397 21.3825396825397]
MF3='mf3':'trapmf',[15.0132275132275 31.8 63.1 71.9]

[Input2]
Name='input2'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-24 0.331 15.542328042328]
MF2='mf2':'trimf',[8.67936507936508 14.8793650793651 21.2301587301587]
MF3='mf3':'trapmf',[15.1455026455026 31.8 63.1 71.9]

[Input3]
Name='input3'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-25.2 -0.133 15.2777777777778]
MF2='mf2':'trimf',[8.48253968253968 14.8825396825397 21.0978835978836]
MF3='mf3':'trapmf',[14.6164021164021 31.8 63.1 71.9]

[Input4]
Name='input4'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-25 0 15.2777777777778]
MF2='mf2':'trimf',[7.75026455026455 14.6502645502646 21.0978835978836]
MF3='mf3':'trapmf',[14.8809523809524 31.8 63.1 71.9]

[Input5]
Name='input5'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-25 0 15.1455026455026]
MF2='mf2':'trimf',[8.38253968253968 14.9825396825397 21.0978835978836]
MF3='mf3':'trapmf',[14.484126984127 31.8 63.1 71.9]

[Input6]
Name='input6'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-25 -3.7e-016 15.542328042328]
MF2='mf2':'trimf',[7.75026455026455 14.6502645502646 21.0978835978836]
MF3='mf3':'trapmf',[14.484126984127 31.8 63.1 71.9]

[Input7]
Name='input7'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-25 0 15.4100529100529]
MF2='mf2':'trimf',[7.18253968253968 15.8825396825397 21.8915343915344]
MF3='mf3':'trapmf',[14.6164021164021 31.7 63 71.8]

[Input8]
Name='input8'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-24.8 0.133 15.2777777777778]
MF2='mf2':'trimf',[8.24391534391534 15.4439153439153 21.8915343915343]
MF3='mf3':'trapmf',[14.3518518518519 31.8 63.1 71.9]

[Input9]
Name='input9'
Range=[0 50]
NumMFs=3
MF1='mf1':'trimf',[-25 -3.7e-016 15.2777777777778]
MF2='mf2':'trimf',[8.37936507936508 15.1793650793651 21.6269841269841]
MF3='mf3':'trapmf',[14.7486772486772 31.7 63 71.8]

[Output1]
Name='output1'
Range=[0 1.4]
NumMFs=3
MF1='mf1':'trimf',[-0.3479 -0.007 0.6981]
MF2='mf2':'trimf',[0.0091 0.6729 1.422]
MF3='mf3':'trimf',[0.7245 1.369 1.874]

[Output2]
Name='Output2'
Range=[-0.2 0.2]
NumMFs=5
MF1='mf1':'trimf',[-0.3 -0.2 -0.1]
MF2='mf2':'trimf',[-0.2 -0.1 0]
MF3='mf3':'trimf',[-0.1 0 0.1]
MF4='mf4':'trimf',[0 0.1 0.2]
MF5='mf5':'trimf',[0.1 0.2 0.3]

[Rules]
1 1 1 1 1 1 1 1 1, 1 0 (1) : 1
3 3 3 3 3 3 3 3 3, 3 0 (1) : 1
0 0 0 0 0 0 0 0 3, 0 5 (1) : 1
0 0 0 0 0 0 0 3 0, 0 5 (1) : 1
0 0 0 0 0 0 3 0 0, 0 5 (1) : 1
0 0 0 0 0 3 0 0 0, 0 5 (1) : 1
0 0 0 0 3 0 0 0 0, 0 1 (1) : 1
0 0 0 3 0 0 0 0 0, 0 1 (1) : 1
0 0 3 0 0 0 0 0 0, 0 1 (1) : 1
0 3 0 0 0 0 0 0 0, 0 1 (1) : 1
3 0 0 0 0 0 0 0 0, 0 1 (1) : 1

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧