我有一个浮点值数组,表示一系列复数(所以数组的第一个值,比如x [0],是第一个复数的实部,x [1]是第一个复数的虚部,x [2]是第二个的实部,依此类推......)。
我的问题是我希望能够像使用结构格式那样访问这些数字,即
struct cmpx
{
float real;
float imag;
};
typedef struct cmpx COMPLEX;
所以我创建一个这样的联盟:
typedef union complexdata
{
float numbers[2];
COMPLEX cart; //Stands for cartesian
}complexpair;
所以我简化的main()函数如下所示:
void main(void)
{
float x[10]={1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0};// In reality this is much longer
complexpair *x_ptr;
x_ptr->numbers[0] = x;
}
这显然是错误的,我收到了错误:
“float *”类型的值不能分配给行“x_ptr-> number [0] = x;”
的“float”类型的实体是否可以按照我上面定义的方式使用union类型的指针来指向浮点值数组?这样我就可以访问结构/笛卡尔格式的数据,并将其视为两个浮点值的数组?
感谢您的帮助。
更新:只是为了明确我为什么要这样做;
我有原型的FFT函数:
void fft(COMPLEX *Y, int M, COMPLEX *w)
所以想传递x作为第一个参数,我有变量w,它与x的格式完全相同。当我尝试类似的东西时:
fft((COMPLEX)x->cart, N, (COMPLEX)w_ptr->cart);
这会引发错误。我希望这背后的动机更清晰? 非常感谢。
答案 0 :(得分:0)
OP评论后编辑。
你应该能够做你想要的,你需要重新格式化那个长初始化器(在堆栈上):
void main(void)
{
complexpair x[5]= { {1.0,0.0},
{1.0,0.0},
{1.0,0.0},
{1.0,0.0},
{1.0,0.0} };// In reality this is much longer
complexpair *x_ptr = x;
}
或者只是重新投射数据:
void main(void)
{
float x[10]={1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0};// In reality this is much longer
complexpair *x_ptr = (complexpair *)x;
}
答案 1 :(得分:0)
好吧,我很遗憾无法理解你究竟想要拥有什么,但我确实对你问题的上半部分有什么想法,所以这就是我所理解的:
float
值,这些值将被解释为real
数据类型的imag
和COMPLEX
部分。 2n - 1
数组的元素将被解释为real
'元素的n
部分,2n
'元素是被解释为imag
部分。
现在这是一个假设:您希望以某种理想的方式访问它们。
如果我对这些是正确的,你可以通过智能方式使用指针来实现这一目标。通过float x[2n]
的声明/初始化,您手中有以下内容:
float x[10] = { 1.0, 1.5, 2.0, 2.5, 3.0, ... } //changed numbers for better distinction
在内存中,你有以下内容:
1.0 1.5 2.0 2.5 3.0 ...
//addresses or memory locations of which are:
x x+1 x+2 x+3 x+4 ...
现在,只需在初始化期间进行分配complexpair * x_ptr = x;
,或在之后x_ptr = x;
进行分配,即可使用以下内容访问相同的内存位置:
x_ptr x_ptr+1 x_ptr+2 ...
就是这样!现在,您只需使用以下两行即可轻松访问所有这些内容:
...
float x[10] = { 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5 };
complexpair *x_ptr = x;
...
要使用此功能访问real
es的imag
和COMPLEX
部分,您只需撰写:
x_ptr[0].cart.real; //is 1.0
x_ptr[0].cart.imag; //is 1.5
x_ptr[2].cart.imag; //is 3.5
x_ptr[4].numbers[0]; //is 5.0
...
作为参考,这里是我用于行为检查的全部代码:
#include <stdio.h>
typedef struct cmpx {
float real;
float imag;
} COMPLEX;
typedef union complexdata {
float numbers[2];
COMPLEX cart;
} complexpair;
int main( ) {
float x[10] = { 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5 };
complexpair *x_ptr = x;
for ( int i = 0; i < 5; i++ )
printf( "%f %f\n", x_ptr[i].cart.real, x_ptr[i].cart.imag );
putchar( 10 );
for ( int i = 0; i < 5; i++ )
printf( "%f %f\n", x_ptr[i].numbers[0], x_ptr[i].numbers[1] );
getchar( );
return 0;
}