很明显,您对如何将这些值放在一个结构中以同时使用所有值有点困惑。
在您的代码中。您为 stInputs.NumofParam 分配了一个值——但没有分配其他值。
然后您在ExpNum 中声明了一个 3-struct 数组,但随后莫名其妙地在每个 struct 中分配了一行值?
从您的问题的要点来看,您似乎正在尝试用所有值填充一个结构,因此您可以将该结构传递给myfunction(我们假设它会执行类似输出结构中的所有值的操作)
在查看修复之前,让我们先看看一些一般性的编码问题。
首先,不要在代码中使用幻数(除非绝对需要,例如使用scanf field-width 修饰符)。您的3 是一个幻数。相反,如果您需要一个常量 #define 一个(或多个),或者使用全局 enum 来做同样的事情。这样,您可以在代码顶部有一个位置来根据需要进行更改,并且您不必通过声明或循环限制来进行更改,例如
#include <stdio.h>
#define MAXV 3 /* if you need a constant, #define one (or more) */
typedef struct {
unsigned int NumofParam;
double ExperimentResults[MAXV];
double ValueofParamOne[MAXV];
double ValueofParamTwo[MAXV];
} EXP_CONDITION;
接下来,C 避免使用camelCase 或MixedCase 变量名,而支持所有小写,同时保留大写 名以用于宏和常数。这是一个风格问题——所以这完全取决于你,但不遵循它可能会在某些圈子中导致错误的第一印象。
现在开始您的代码。首先(特别是如果您将循环遍历数组中的元素)在声明时将您的结构初始化为全零。这将消除通过无意中尝试读取未初始化值来调用 Undefined Behavior 的机会。您可以为第一个成员使用命名初始化器(默认情况下,所有其他成员都将设置为零),或者您可以使用通用初始化器(例如{0})完成同样的事情。示例:
int main (void)
{
/* initialize your struct to all zero using a named initializer
* or the universal intializer {0}
*/
EXP_CONDITION stInputs = { .NumofParam = 0 };
EXP_CONDITION* pstInputs;
pstInputs = &stInputs;
...
EXP_CONDITION ExpNum[MAXV] = {{ .NumofParam = 0 }};
现在看看你的作业逻辑。您在数组ExpNum 中声明了 3 个结构。每个结构都有 3 个数组,每个数组有 3 个值,例如
double ExperimentResults[MAXV];
double ValueofParamOne[MAXV];
double ValueofParamTwo[MAXV];
当您尝试填充 ExpNum[0] ExpNum[1] 和 ExpNum[2] 中的每一个时,您只会填充一个元素,例如
/*assign values to Experiment 1*/
ExpNum[0].ValueofParamOne[0]=200;
ExpNum[0].ValueofParamTwo[0]=400;
ExpNum[0].ExperimentResults[0]=1000;
/*assign values to Experiment 2*/
ExpNum[1].ValueofParamOne[1]=210;
ExpNum[1].ValueofParamTwo[1]=440;
ExpNum[1].ExperimentResults[1]=2000;
...
要完全填充您需要的单个结构
/*assign values to Experiment 1*/
ExpNum[0].ValueofParamOne[0]=200;
ExpNum[0].ValueofParamTwo[0]=400;
ExpNum[0].ExperimentResults[0]=1000;
ExpNum[0].ValueofParamOne[1]=210;
ExpNum[0].ValueofParamTwo[1]=440;
ExpNum[0].ExperimentResults[1]=2000;
ExpNum[0].ValueofParamOne[2]=220;
ExpNum[0].ValueofParamTwo[2]=480;
ExpNum[0].ExperimentResults[2]=3000;
现在让我们看看myfunction,我们假设它只是输出存储在每个结构中的值(这只是示例):
void myfunction (EXP_CONDITION *exp)
{
printf ("\nNumofParam: %u\n", exp->NumofParam);
for (int i = 0; i < MAXV; i++)
printf (" %7.1lf %7.1lf %7.1lf\n", exp->ExperimentResults[i],
exp->ValueofParamOne[i], exp->ValueofParamTwo[i]);
putchar ('\n'); /* tidy up with newline */
}
想想如果我们调用myfunction (pstInputs) 会打印什么?如果我们调用myfunction (&ExpNum[0]) 会打印什么?或myfunction (&ExpNum[1])
提示:
Initial stInputs struct
NumofParam: 2
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
Content of each of ExpNum structs
NumofParam: 0
1000.0 200.0 400.0
0.0 0.0 0.0
0.0 0.0 0.0
NumofParam: 0
0.0 0.0 0.0
2000.0 210.0 440.0
0.0 0.0 0.0
NumofParam: 0
0.0 0.0 0.0
0.0 0.0 0.0
3000.0 220.0 480.0
我可能是错的,但从逻辑上讲,您似乎打算在您的 stInputs 结构中进行所有实验,而不是在您的 ExpNum 数组中每个都撒上一行。编码和结构的美妙之处在于,您可以轻松地将数据混在一起,现在将其放在一个位置,以便您可以正确管理数据。简单循环 ExpNum 数组并将所有数据复制到 stInputs 结构的适当位置,例如
/* now put all values in your stInputs struct like it appears
* you intended to do?
*/
for (int i = 0; i < MAXV; i++) {
pstInputs->ExperimentResults[i] = ExpNum[i].ExperimentResults[i];
pstInputs->ValueofParamOne[i] = ExpNum[i].ValueofParamOne[i];
pstInputs->ValueofParamTwo[i] = ExpNum[i].ValueofParamTwo[i];
}
现在,当您致电 myfunction (pstInputs) 时,您将获得所有数据,例如
Output of the completely filled stInputs struct
NumofParam: 2
1000.0 200.0 400.0
2000.0 210.0 440.0
3000.0 220.0 480.0
将所有部分放在一起,您的最终示例可能如下所示:
#include <stdio.h>
#define MAXV 3 /* if you need a constant, #define one (or more) */
typedef struct {
unsigned int NumofParam;
double ExperimentResults[MAXV];
double ValueofParamOne[MAXV];
double ValueofParamTwo[MAXV];
} EXP_CONDITION;
void myfunction (EXP_CONDITION *exp)
{
printf ("\nNumofParam: %u\n", exp->NumofParam);
for (int i = 0; i < MAXV; i++)
printf (" %7.1lf %7.1lf %7.1lf\n", exp->ExperimentResults[i],
exp->ValueofParamOne[i], exp->ValueofParamTwo[i]);
putchar ('\n'); /* tidy up with newline */
}
int main (void)
{
/* initialize your struct to all zero using a named initializer
* or the universal intializer {0}
*/
EXP_CONDITION stInputs = { .NumofParam = 0 };
EXP_CONDITION* pstInputs;
pstInputs = &stInputs;
pstInputs->NumofParam = 2U;
EXP_CONDITION ExpNum[MAXV] = {{ .NumofParam = 0 }};
/*assign values to Experiment 1*/
ExpNum[0].ValueofParamOne[0]=200;
ExpNum[0].ValueofParamTwo[0]=400;
ExpNum[0].ExperimentResults[0]=1000;
/*assign values to Experiment 2*/
ExpNum[1].ValueofParamOne[1]=210;
ExpNum[1].ValueofParamTwo[1]=440;
ExpNum[1].ExperimentResults[1]=2000;
/*assign values to Experiment 3*/
ExpNum[2].ValueofParamOne[2]=220;
ExpNum[2].ValueofParamTwo[2]=480;
ExpNum[2].ExperimentResults[2]=3000;
/* output your first stInputs struct */
puts ("Initial stInputs struct");
myfunction (&stInputs);
/* output values in each of your ExpNum array of struct
* (but note, you only assign one-row in each struct)
*/
puts ("Content of each of ExpNum structs");
for (int i = 0; i < MAXV; i++)
myfunction (&ExpNum[i]);
/* now put all values in your stInputs struct like it appears
* you intended to do?
*/
for (int i = 0; i < MAXV; i++) {
pstInputs->ExperimentResults[i] = ExpNum[i].ExperimentResults[i];
pstInputs->ValueofParamOne[i] = ExpNum[i].ValueofParamOne[i];
pstInputs->ValueofParamTwo[i] = ExpNum[i].ValueofParamTwo[i];
}
/* output the completely filled stInputs struct */
puts ("Output of the completely filled stInputs struct");
myfunction (pstInputs);
return 0;
}
使用/输出的完整示例
$ ./bin/expstruct
Initial stInputs struct
NumofParam: 2
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
Content of each of ExpNum structs
NumofParam: 0
1000.0 200.0 400.0
0.0 0.0 0.0
0.0 0.0 0.0
NumofParam: 0
0.0 0.0 0.0
2000.0 210.0 440.0
0.0 0.0 0.0
NumofParam: 0
0.0 0.0 0.0
0.0 0.0 0.0
3000.0 220.0 480.0
Output of the completely filled stInputs struct
NumofParam: 2
1000.0 200.0 400.0
2000.0 210.0 440.0
3000.0 220.0 480.0
查看一下,如果您还有其他问题,请告诉我。如果我误解了您的问题,请发表评论或编辑您的问题并告诉我。