我有一个(我认为)非常简单的问题,我需要帮助。我正在研究在C中使用被调用的用户定义函数学习指针。
我有两个函数,我的main()和另一个函数从文件read_file()中提取某些数据。 Read_file()从指定文件中提取数据 - 整数,(coeff_num)和一系列值(coeff_values) - 并打印出数据。然后main()意味着将此数据重新打印为检查,以确保正确调用它以执行进一步的计算。
我的问题是:read_file()函数中的所有内容都正常打印出来。在检查main()时,data_num打印正常,但data_values不打印。
代码(编辑了一些不相关的位,主要是错误检查内容)如下:
int read_file(int *data_num, double **data_values, char *filename);
int main()
{
int data_num;
double **data_values;
char *filename[] = {/*FILES*/};
read_fule(&data_num, data_values, *filename);
printf("Check Number:\n%u\n", data_num);
printf("Check Values:\n);
for(int i = 0; i<data_num; i++)
{
printf("%u\t", data_values[i]);
}
return(0);
}
和
int read_file(int *data_num, double **data_values, char *filename)
{
FILE * fp = fopen(filename, "rb"); //Opening file
/* Error checking code here - see if file opens, find length
return if not long enough, etc */
//Find number of values
char buffer_n[4];
fread(buffer_n, 4, 1, fp);
int result = buffer_n[0]|(buffer_n[1] << 8)|(buffer_n[2] << 16)|(buffer_n[3] << 24); //Change endian
*data_num = result;
/* Instructed to allocate memory */
data_values = malloc(8*result); //Allocating memory
//Reads data values
fread(data_values, 8, result, fp);
//Prints results as float
printf("Number of data values: %d \n", result);
for(int i=0; i<result; i++)
{
printf("%0.3f\t", data_values[i]);
}
fclose(fp);
return 1;
}
我很确定这是我指针的问题。对于程序,我必须在读取data_values时使用malloc(),而read_file必须具有以下原型:int read_file(int * data_num,double ** data_values,char * filename)。有人可以给我一些关于我搞砸的地方的指导吗?
为任何帮助干杯,我们将不胜感激。
答案 0 :(得分:0)
我设置result = 30
就像你告诉我的那样,改了一些地方,我认为现在它运作正常。
我认为你不需要double**
指针,你需要的是double*
指针。
您需要将void*
投射到double*
:
data_values = (double*)malloc(8*result); //Allocating memory
此代码可以正常工作:
//data_values should be defined as double*
int read_file(int *data_num, double *data_values, char *filename)
{
FILE * fp = fopen(filename, "rb"); //Opening file
/* Error checking code here - see if file opens, find length
return if not long enough, etc */
//Find number of values
char buffer_n[4];
size_t i;//added
fread(buffer_n, 4, 1, fp);
//int result = buffer_n[0]|(buffer_n[1] << 8)|(buffer_n[2] << 16)|(buffer_n[3] << 24); //Change endian
int result = 30;
*data_num = result;
/* Instructed to allocate memory */
data_values = (double*)malloc(8*result); //Allocating memory
//Reads data values
fread(data_values, 8, result, fp);
//Prints results as float
printf("Number of data values: %d \n", result);
for(int i=0; i<result; i++)
{
printf("%0.3f\t", data_values[i]);
}
fclose(fp);
return 1;
}
修改强>:
如果您想使用double**
,可以试试这个解决方案:
/* Instructed to allocate memory */
data_values[0] = (double*)malloc(8 * result); //Allocating memory
//Reads data values
fread(data_values[0], 8, result, fp);
//Prints results as float
printf("Number of data values: %d \n", result);
for(int i=0; i<result; i++)
{
printf("%0.3f\t", data_values[0][i]);
}
但是你必须注意到这不是一个表单,它仍然用作数组,所以你可以根据你的情况稍后更改它。