复数的实部和虚数部分

时间:2014-11-20 08:59:11

标签: c++ arrays pointers for-loop complex-numbers

我有2个指针指向两个20个成员数组。我的数组包含复数。我想对复数进行逐元素划分,这就是为什么我需要将数字分成实部和虚部。我尝试了以下代码,但它给出了错误。

    #include <complex>

    complex *a;
    complex *b;
    complex array1[20];
    complex array2[20];
    a = &array1;
    b = &array2;
    int i=0;
    for (i=0;i<=19;i++)
    {
    real_part_array1[i] = real(*a[i]);
    imag_part_array1[i] = imag(*a[i]);
    real_part_array2[i] = real(*b[i]);
    imag_part_array2[i] = imag(*b[i]); 
    }

我得到的第一个错误是;我试着把它写成

    #include <complex.h>

错误信息是“无法打开源文件complex.h”。然后我删除了h,错误消失了。我遇到的第二个错误是real()和imag()。错误消息是“标识符实际未定义”。

对于分裂,我必须将它们分成实部和虚部,但我不知道如何解决这个问题。我希望你们能帮助我。

2 个答案:

答案 0 :(得分:2)

  1. complex不是类型,它是类型模板。您需要指定实部和虚部的类型作为模板参数,例如complex<double>

  2. 类型模板complex以及函数realimag位于std命名空间中。

    关于complex<...>,您可以使用命名空间std编写std::complex<...>或放置using std::complex; below your includes. (You could also write;`但是习惯它可能会很危险。)

    关于realimag,他们可以使用ADL( a rgument d 依赖 l ookup:他们的参数在std命名空间中,函数名也会自动在std中查找,所以你不需要为这些函数指定命名空间。

  3. 在行a = &array1;(和另一个类似的行)中,指向整个数组array1,它是一个指向数组的指针。您可能需要的是&array[1]array1,因为数组可以隐式转换为指向其第一个元素的指针。

  4. *a[i]中,您访问数组a中的第i个元素指向(a本身不是指针,但数组下标运算符对指针起作用,就像他们是阵列)。然后你取消引用那个无效的复杂类型。只需删除*

  5. 即可

    您可以看到最终代码here

答案 1 :(得分:-1)

您可能想要使用它:

#include <complex>


int main()
{
    std::complex<float> *a;
    std::complex<float> *b;
    std::complex<float> array1[20];
    std::complex<float> array2[20];
    int real_part_array1[20];
    int real_part_array2[20];
    int imag_part_array1[20];
    int imag_part_array2[20];
    a = array1;
    b = array2;
    int i=0;
    for (i=0;i<=19;i++)
    {
    real_part_array1[i] = std::real(a[i]);
    imag_part_array1[i] = std::imag(a[i]);
    real_part_array2[i] = std::real(b[i]);
    imag_part_array2[i] = std::imag(b[i]); 
    }
    return 0;
}

complex不是类型,而是类型模板。因此,你可能想要使用复杂的&lt; int&gt;或复杂的&lt;双&gt;。

同样真实和想象在std命名空间中,因此std :: real和std :: imag。

现在当你说a =&amp; array1时,array1已经是一个指针,你指的是指向LHS的指针,这是一个指针,这是一个类型错误