(c 环境,Visual Studio)\n我有这个练习:计算两个复数之间的乘积。结果由 comp1 指向。\n我知道两个复数是这样相乘的:
\n(a+ib)*(c+id)=(ac\xe2\x88\x92bd)+i(ad+bc)。我做到了。这是一个非常简单的程序,事实上我只使用了 1 行(在函数中)。但在调试器中我读到:
\n“不能将 double 类型的实体分配给“struct complex”类型的实体”。
\n我尝试使用强制转换运算符,但我发现这对于结构类型是非法的。所以我感觉完全迷失了。\n我知道这个理论:\n如果我想将结构传递给函数,我需要使用指针。为了使用指针访问结构体成员,我使用语法糖“箭头运算符”->”。它的意思是“*(p).x”。\n那么它有什么问题呢?
\n几何.c
\n#include "complex.h"\n#include "stdlib.h"\nvoid complex_product(struct complex *comp1, struct complex *comp2) {\n *comp1 = ((comp1->re * comp2->im) - (comp1->im * comp2->im)) + ((comp1->re * comp2->im) + (comp1->im * comp2->re));\n}\nRun Code Online (Sandbox Code Playgroud)\n几何.h
\n#if !defined COMPLEX_H \n#define COMPLEX_H\nstruct complex {\n double re, im; \n};\nextern void complex_product(struct complex* comp1, struct complex* comp2); \n\n#endif \nRun Code Online (Sandbox Code Playgroud)\n
仔细阅读从编译器收到的错误。理解错误消息是一项重要技能!问题不在于访问comp1和comp2执行数值计算的字段的方式,而在于如何处理计算结果。
\n\nRun Code Online (Sandbox Code Playgroud)\n*comp1 = /*some number*/;\n
*comp1是一个struct complex. 右侧是一个数字。您无法为结构分配编号。
\n\n我知道两个复数以这种方式相乘:
\n\n
(a+ib)*(c+id)=(ac\xe2\x88\x92bd)+i(ad+bc)
正确的。
\n\n\nRun Code Online (Sandbox Code Playgroud)\n((comp1->re * comp2->im) - (comp1->im * comp2->im)) + ((comp1->re * comp2->im) + (comp1->im * comp2->re))\n
那不是你上面写的。请注意,您在这里计算的是实数。该i零件缺失。
在您的程序中,复数由具有两个字段的结构表示re,im分别为实部和虚部。i不表示为可以相乘的东西。您需要分别计算实部和虚部,而不是将它们加在一起。
struct complex result = { /*expression for the real part*/, /*expression for the imaginary part*/ };\nRun Code Online (Sandbox Code Playgroud)\n或者
\nstruct complex result = {\n .re = /*expression for the real part*/,\n .im = /*expression for the imaginary part*/,\n};\nRun Code Online (Sandbox Code Playgroud)\n或者
\nstruct complex result;\nresult.re = /*expression for the real part*/;\nresult.im = /*expression for the imaginary part*/;\nRun Code Online (Sandbox Code Playgroud)\n显然complex_product应该使用它的第一个参数作为输入和输出。当您这样做时,您需要小心,不要在完成计算之前覆盖输入。这是行不通的:
comp1->re = \xe2\x80\xa6;\ncomp1->im = \xe2\x80\xa6;\nRun Code Online (Sandbox Code Playgroud)\n因为 的计算comp1->im需要 的旧值comp1->re。处理这个问题的最简单方法是使用中间变量来存储结果,如上面所示,并将其复制到最后的输出:
void complex_product(struct complex *comp1, struct complex *comp2) {\n struct complex result;\n result.re = \xe2\x80\xa6;\n result.im = \xe2\x80\xa6;\n *comp1 = result;\n}\nRun Code Online (Sandbox Code Playgroud)\n确保您了解该程序何时使用*以及何时使用->. 这是学习 C 语言时需要习惯的事情。
我将让您将所有这些整合在一起。请注意,在 \xe2\x80\x93 之上至少存在一个错误,您计算了a*d两次而不计算a*c。