如何在.c文件中使用.h文件内计算得到的数值进行运算
错误原因
rando()函数内定义的base、height、pressure都是局部栈变量,函数执行结束后内存就会被回收,外部完全无法访问,所以会报「赋值后未使用」的警告。- main.c里定义的
height、pressure都是单double类型,不是数组,自然无法用下标[x]访问,也没法用sizeof计算数组长度。
实现方案(结构体封装返回值)
1. 修改rand.h
#ifndef RAND_H_INCLUDED #define RAND_H_INCLUDED #include <stdio.h> #include <stdlib.h> #include <time.h> // 定义长度宏统一管理数组大小 #define ARR_LEN 20 // 结构体封装所有生成的随机数据 typedef struct { double base; double height[ARR_LEN]; double pressure[ARR_LEN]; } RandResult; RandResult rando() { static int seed_inited = 0; // srand全局只需要初始化一次,多次调用会导致随机数重复 if (!seed_inited) { srand(time(NULL)); seed_inited = 1; } RandResult res; res.base = rand(); // 生成height数组 for(int i=0;i<ARR_LEN;i++){ res.height[i] = rand(); } // 生成pressure数组 for(int q=0;q<ARR_LEN;q++){ res.pressure[q] = rand(); } return res; } #endif // RAND_H_INCLUDED
2. 修改main.c
#include <stdio.h> #include <stdlib.h> #include "rand.h" int main() /*table formatting testing*/ { // 调用函数获取所有随机数据 RandResult res = rando(); int hnum = ARR_LEN; int pnum = ARR_LEN; /*打印height*/ int hloop; for (hloop=0;hloop<hnum;hloop++){ if (hloop==0){ printf(" %g", res.height[hloop]); } else{ printf(" %g", res.height[hloop]); } } /*打印base和pressure*/ printf("\n"); int ploop; for (ploop=0;ploop<pnum;ploop++){ if (ploop==0){ printf("%g %g", res.base, res.pressure[ploop]); } else{ printf(" %g", res.pressure[ploop]); } } return 0; }
注意事项
- 局部变量的作用域仅限当前函数内部,跨函数传递数据可以用返回值、传入的指针参数两种方案,全局变量因为线程安全、可重入性问题不推荐使用。
srand(time(NULL))不需要每次调用随机函数都执行,全局初始化一次即可。
内容的提问来源于stack exchange,提问作者J.D.
相关产品推荐
相关产品推荐

