- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对使用 typedef struct 还很陌生,所以我希望你能够给出非常基本的解释,以便我可以更好地理解。
我声明了一个名为 ExpNum[3]
的数组变量对于我的 typedef 结构。我希望能够通过ExpNum[0].ValueofParamOne[0]
依此类推到另一个名为 myfunction()
的函数。但是,我无法做到
pstInputs->ExpNum[0].ValueofParamOne[0]
当我运行如下所示的代码时,此处初始化的值甚至没有被传递。我明白这一点是因为我
printf
ExpNum[0].ValueofParamOne[0]
在主函数和myfunction()
并且值(value)观不同。 main函数中的正确,而myfunction()
中的正确。打印随机长数字,错误。我知道为什么会出现错误。我的问题是我应该如何传递这个数组?首先这有可能吗?我知道一个更简单的方法是传递结构而不声明
ExpNum[3]
。然而,这很重要,因为我的实际程序涉及更多实验,我需要ExpNum[3]
帮助用户确保他们不会混淆ValueofParamOne
,ValueofParamTwo
对应ExperimentResults
或者也许我应该完全改变我的方法?我的主要重点是确保用户准确分配他们的值。
myfunction()
是高度技术性和数学性的。其目的是计算优化的参数值。当然,在我的实际函数中,实验数据不止3个。typedef struct
{
unsigned int NumofParam;
double ExperimentResults[3];
double ValueofParamOne[3];
double ValueofParamTwo[3];
}EXP_CONDITION;
int main()
{
EXP_CONDITION stInputs;
EXP_CONDITION* pstInputs;
pstInputs = &stInputs;
pstInputs->NumofParam = 2U;
EXP_CONDITION ExpNum[3];
/*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;
myfunction(&stInputs);
return 0;
}根据 @MaxVollmer 和 @aschepler 的评论进行编辑:)
最佳答案
很明显,您对如何将这些值组合到一个结构中以同时使用所有值感到有点困惑。
在你的代码中。您为 stInputs.NumofParam
分配了一个值 - 但没有分配其他值。
然后,您在 ExpNum
中声明了一个 3 结构体数组,但随后莫名其妙地在每个结构体中仅分配了一行值?
从您的问题的要点来看,您似乎正在尝试用所有值填充一个结构,以便您可以将该结构传递给 myfunction
(我们假设它会执行类似输出中的所有值之类的操作)结构)
在查看修复之前,让我们先看看一些常见的编码问题。
首先,不要在代码中使用魔数(Magic Number)(除非绝对需要,例如使用 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
变量名称,转而使用所有小写,同时保留大写 -与宏和常量一起使用的大小写名称。这是一个风格问题 - 所以这完全取决于你,但不遵循它可能会导致某些圈子中错误的第一印象。
现在来看看你的代码。首先(特别是如果您将循环遍历数组中的元素)在声明时将结构初始化为全零。这将消除因无意中尝试读取未初始化值而调用未定义行为的机会。您可以为第一个成员使用命名初始化程序(默认情况下所有其他成员将设置为零),也可以使用通用初始化程序(例如{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
仔细检查一下,如果您还有其他问题,请告诉我。如果我误解了您的问题,请发表评论或编辑您的问题并告诉我。
关于c - 如何将结构体的数组变量传递给另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52434975/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!