union类型的指针(也包含一个结构)指向浮点数组C
我有一个浮点数数组,它代表一系列复数(数组的第一个值,比如x[0],是第一个复数的实部,x[1]是第一个复数的虚部,x[2]是第二个复数的实部,依此类推……) 我的问题是,我希望能够访问这些数字,就好像它们是一种结构格式,即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
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我不明白它如何产生错误。。。正如上面的代码一样,它不会产生任何错误,只是一个警告。您可以将typecastedx
分配给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;
}