fclose() 调用时出现的问题!
本人想在 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);
}