从用户定义的函数访问值

时间:2017-03-30 23:22:23

标签: c pointers user-defined-functions

我有一个(我认为)非常简单的问题,我需要帮助。我正在研究在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)。有人可以给我一些关于我搞砸的地方的指导吗?

为任何帮助干杯,我们将不胜感激。

1 个答案:

答案 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]);
    }

但是你必须注意到这不是一个表单,它仍然用作数组,所以你可以根据你的情况稍后更改它。