【问题标题】:Accessing values from user-defined functions从用户定义的函数中访问值
【发布时间】:2017-03-30 23:22:23
【问题描述】:

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

欢迎任何帮助,我们将不胜感激。

【问题讨论】:

  • 你的result 是什么,分配内存可能太大了。
  • 结果的值?在我正在阅读的文件中,这通常是 30(%d) 左右。
  • 几点: malloc() 返回 void 指针,因此您需要将其类型转换为所需的指针,另一件事 malloc() 仅返回一个指针,因此指向指针的指针没有意义。所有 malloc() 都应该有各自的 free() 调用
  • 是的,自从我发布我的 malloc() 实现可能是问题的一部分以来,我实际上一直在考虑。我一直在查看一些参考页面,尽管我还没有完全弄清楚如何正确修复它。感谢您确认这是不正确的。

标签: c pointers user-defined-functions


【解决方案1】:

我按照你告诉我的设置了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]);
    }

但是你要注意,这不是表格,这仍然是作为数组使用的,所以你以后可以根据你的情况改变它。

【讨论】:

  • 程序必须使用特定的原型,即:int read_file(int *data_num, double **data_values, char *filename)。所以它必须是data_valuesdouble** 指针。我认为这是因为 data_values 必须以可以打印的形式返回到main() 并且可以对特定数组值执行操作?我不确定问题是否在于我在main() 和/或read_file() 中实现代码的方式 - 我承认我有点迷路了,哈哈。谢谢你帮助我。
  • 由于某种原因,我仍然无法使其正常运行。仅从read_file() 运行会产生正确的输出,但是当我在main() 中调用read_file() 时(如在我最初的帖子中 - 程序必须检查数据是否正确调用然后再次打印),它只是崩溃在重新打印正确的data_num 后没有给出编译器错误。所以我认为这可能与coeff_valuesmain() 中的调用方式有关。有什么想法吗?
  • 如何在此处发布您的数据样本,我不确定该程序的预期价值是多少。@Grom
猜你喜欢
  • 2013-05-07
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2021-09-10
  • 1970-01-01
  • 2020-03-20
  • 2023-04-11
相关资源
最近更新 更多