我有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()。错误消息是“标识符实际未定义”。
对于分裂,我必须将它们分成实部和虚部,但我不知道如何解决这个问题。我希望你们能帮助我。
答案 0 :(得分:2)
complex
不是类型,它是类型模板。您需要指定实部和虚部的类型作为模板参数,例如complex<double>
。
类型模板complex
以及函数real
和imag
位于std
命名空间中。
关于complex<...>
,您可以使用命名空间std编写std::complex<...>
或放置using std::complex; below your includes. (You could also write
;`但是习惯它可能会很危险。)
关于real
和imag
,他们可以使用ADL( a rgument d 依赖 l ookup:他们的参数在std
命名空间中,函数名也会自动在std
中查找,所以你不需要为这些函数指定命名空间。
在行a = &array1;
(和另一个类似的行)中,指向整个数组array1
,它是一个指向数组的指针。您可能需要的是&array[1]
或array1
,因为数组可以隐式转换为指向其第一个元素的指针。
在*a[i]
中,您访问数组a
中的第i个元素指向(a
本身不是指针,但数组下标运算符对指针起作用,就像他们是阵列)。然后你取消引用那个无效的复杂类型。只需删除*
。
您可以看到最终代码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的指针,这是一个指针,这是一个类型错误