Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
union类型的指针(也包含一个结构)指向浮点数组C_C_Pointers_Structure_Unions_Complex Numbers - Fatal编程技术网

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

union类型的指针(也包含一个结构)指向浮点数组C,c,pointers,structure,unions,complex-numbers,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 numb

我有一个浮点数数组,它代表一系列复数(数组的第一个值,比如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;
}
这显然是错误的,我得到了错误:

对于“x_ptr->number[0]=x;”行,不能将“float*”类型的值分配给“float”类型的实体

是否可以像我上面定义的那样使用union类型的指针指向浮点值数组?这样我就可以访问结构/笛卡尔格式的数据,并将其视为两个浮点值的数组

谢谢你的帮助

更新:只是为了明确我为什么要这样做

我对原型有一个FFT功能:

 void fft(COMPLEX *Y, int M, COMPLEX *w) 
所以我想传递x作为第一个参数,我有变量w,它的格式和x完全相同。当我尝试类似于:

fft((COMPLEX)x->cart, N, (COMPLEX)w_ptr->cart);
这会抛出一个错误。我希望这背后的动机更清楚?
非常感谢。

在OP的评论后编辑

你应该能够做你想做的事情,你需要重新格式化那长的初始值设定项(在堆栈上):

或者只是重新播放数据:

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

很遗憾,我无法理解你到底想要什么,但我确实从你问题的上半部分对你想要什么有一个模糊的猜测,所以我理解如下:

  • 您有一个
    float
    值数组,这些值将被解释为
    real
    imag
    复杂数据类型的一部分
  • 数组的
    2n-1
    第个元素将被解释为
    n
    第个元素的
    real
    部分,而
    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
imag
部分,您只需编写:

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;
}
#包括
类型定义结构cmpx{
浮动真实;
浮动图像;
}复杂的;
typedef联合复杂数据{
浮点数[2];
复合推车;
}复合空气;
int main(){
浮点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;
对于(int i=0;i<5;i++)
printf(“%f%f\n”,x_ptr[i].cart.real,x_ptr[i].cart.imag);
putchar(10);
对于(int i=0;i<5;i++)
printf(“%f%f\n”,x_ptr[i]。数字[0],x_ptr[i]。数字[1]);
getchar();
返回0;
}

w是一个拼写错误,现在已更改。我需要更多信息来帮助。你到底想要什么样的结果?例如,您是否希望能够通过键入
x_ptr->cart.real
之类的内容来访问第一个
1.0
,以及通过键入
x_ptr->cart.imag
来访问第一个
0.0
?是的,但也能够以x_ptr->number[0]和x_ptr->number[1]的形式访问它们,因此,union。fft调用是否应该与指向复数指针的右强制转换一起工作,如
fft((复数*)x_ptr,N,(复数*)w_ptr)?您确定
complexpair*x\u ptr=x是否正确?好的,谢谢您的回复,当我尝试complexpair*x_ptr=x;它会产生一个错误。我可能需要添加更多信息,请稍后参阅更新的问题。@bluefocs我不明白它如何产生错误。。。正如上面的代码一样,它不会产生任何错误,只是一个警告。您可以将typecasted
x
分配给
x_ptr
以消除该错误,如:
complexpair*x_ptr=(complexpair*)x
也可以消除该警告。但这应该只是一个警告,而不是一个错误……这就是我如何避开错误的原因。我写这篇文章是为了一个嵌入式系统,这样编译器的行为会很奇怪。@bluefocs关于您上次的编辑,函数
fft
需要一个
COMPLEX
结构的地址,但是您通过调用
fft((COMPLEX)x->cart,N,(COMPLEX)w_ptr->cart)将结构本身赋予它。那里的类型转换也应该是完全冗余的,因为这些值已经是复杂的。如果您想要实现的是能够在
fft
中操作
x->cart
w_ptr->cart
,那么只需调用如下函数:
fft(&x->cart,N,&w_ptr->cart)。或者你想合法地玩弄例如
Y
,而不仅仅是
*Y
,在
fft
内部吗?我只需要在fft函数中操纵x->cart和w_ptr->cart,也就是说,只要联合保持复杂的结构,我就担心它,所以fft(&x->cart,N,&w_ptr->cart)可以工作。谢谢
#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;
}