(c 環境,visual studio)我有這個練習:計算兩個復數之間的乘積。結果由 comp1 指向。我知道兩個復數是這樣相乘的:
(a ib)*(c id)=(ac?bd) i(ad bc)。我做到了。這是一個非常簡單的程式,實際上我只使用了 1 行(在函式中)。但在除錯器中我讀到:
“不能將 double 型別的物體分配給“struct complex”型別的物體”。
我嘗試使用 cast 運算子,但我發現這對于 struct 型別是非法的。所以我覺得完全迷失了。我知道這個理論:如果我想將結構傳遞給函式,我需要使用指標。并使用指標訪問結構成員,我使用語法糖“箭頭運算子”->“。它的意思是“*(p).x”。那么它有什么問題呢?
幾何.c
#include "complex.h"
#include "stdlib.h"
void complex_product(struct complex *comp1, struct complex *comp2) {
*comp1 = ((comp1->re * comp2->im) - (comp1->im * comp2->im)) ((comp1->re * comp2->im) (comp1->im * comp2->re));
}
幾何.h
#if !defined COMPLEX_H
#define COMPLEX_H
struct complex {
double re, im;
};
extern void complex_product(struct complex* comp1, struct complex* comp2);
#endif
uj5u.com熱心網友回復:
仔細閱讀您從編譯器中得到的錯誤。理解錯誤資訊是一項重要的技能!問題不在于您訪問 的欄位comp1和comp2執行數值計算的方式,而在于您如何處理計算結果。
*comp1 = /*some number*/;
*comp1是一個struct complex。右邊是一個數字。您不能為結構分配編號。
我知道兩個復數是這樣相乘的:
(a ib)*(c id)=(ac?bd) i(ad bc)
正確的。
((comp1->re * comp2->im) - (comp1->im * comp2->im)) ((comp1->re * comp2->im) (comp1->im * comp2->re))
你上面寫的不是這個。請注意,您在這里計算的是實數。該i部分丟失。
在您的程式中,復數由具有兩個欄位的結構表示re,分別im用于實部和虛部。i不是表示為可以乘以的東西。您需要分別計算實部和虛部,而不是將它們加在一起。
struct complex result = { /*expression for the real part*/, /*expression for the imaginary part*/ };
或者
struct complex result = {
.re = /*expression for the real part*/,
.im = /*expression for the imaginary part*/,
};
或者
struct complex result;
result.re = /*expression for the real part*/;
result.im = /*expression for the imaginary part*/;
顯然complex_product應該使用它的第一個引數作為輸入和輸出。執行此操作時,您需要注意不要在完成計算之前覆寫輸入。這行不通:
comp1->re = …;
comp1->im = …;
因為 的計算comp1->im需要 的舊值comp1->re。最簡單的處理方法是使用中間變數來存盤結果,如我上面所示,并在最后將其復制到輸出:
void complex_product(struct complex *comp1, struct complex *comp2) {
struct complex result;
result.re = …;
result.im = …;
*comp1 = result;
}
確保您了解此程式*何時使用以及何時使用->。這是您在學習 C 時需要習慣的事情。
我會讓你把這一切放在一起。請注意,上面至少有一個錯誤——您計算了a*d兩次而不是計算a*c。
uj5u.com熱心網友回復:
問題很簡單,您正在正確地執行操作,但您沒有將結果存盤在正確的變數中,對于復數,您有一個實部和一個虛部。您要做的是將它們混合在一起并將該值分配給一個復雜的結構(這是非法的 bcz 不同的變數型別)。
您需要做的是將實部分配給 double 變數,將虛部分配給不同的變數,然后將這些變數分配給結構的相應屬性,如下所示:
double re_result = (comp1->re * comp2->im) - (comp1->im * comp2->im);
double im_result = (comp1->re * comp2->im) (comp1->im * comp2->re);
comp1.re = re_result;
comp1.im = im_result;
這樣您的 comp1 復變數將具有實部和虛部的結果值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362487.html
上一篇:如何在串列中收集串列
