union类型的指针(也包含一个结构)到一个浮点数组C

时间:2014-03-07 15:17:42

标签: c pointers structure unions complex-numbers

我有一个浮点值数组,表示一系列复数(所以数组的第一个值,比如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);

这会引发错误。我希望这背后的动机更清晰? 非常感谢。

2 个答案:

答案 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数据类型的imagCOMPLEX部分。
  • 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的imagCOMPLEX部分,您只需撰写:

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;
}