【发布时间】:2014-11-18 13:48:38
【问题描述】:
我对编程比较陌生,所以如果我的问题是基本的,我深表歉意。
情况:
我有几个浮点值和一个指向每个值的指针数组。例如:
float nr1=1.15;
float nr2=2.30;
float nr3=23.34;
....
float * my_address_array[3];
my_address_array[0] = &nr1;
my_address_array[1] = &nr2;
my_address_array[2] = &nr3;
要访问一个元素,我可以使用:
float temp_value;
float ** ptr_value;
...
ptr_value = &my_address_array[0];
temp_value = **( ptr_value+0); // copy nr1 to temp
temp_value = **( ptr_value+1); // copy nr2 to temp
temp_value = **( ptr_value+2); // copy nr3 to temp
到目前为止一切顺利。在我的系统中,浮点数占用 32 位(8051 微控制器)。我需要取一个浮点数并将其分成四个 8 位变量。 nr2 示例:
我的尝试是:
unsigned char storage1;
unsigned char storage2;
unsigned char storage3;
unsigned char storage4;
...
storage1 =(unsigned char) ((**( ptr_value+1)) >> 24) ;
storage2 =(unsigned char) ((**( ptr_value+1)) >> 16) ;
storage3 =(unsigned char) ((**( ptr_value+1)) >> 8) ;
storage4 =(unsigned char) ((**( ptr_value+1)) & 0xff) ;
我得到错误的操作数类型。似乎我不能对浮点数使用位移操作(至少谷歌是这样的)。我可以添加一个新指针,如:
char ** ptr_char_value;
...
ptr_char_value = &my_address_array[0]; // generates warning
storage1 = (*(*( ptr_char_value+1)+0));
storage2 = (*(*( ptr_char_value+1)+1));
storage3 = (*(*( ptr_char_value+1)+2));
storage4 = (*(*( ptr_char_value+1)+3));
我确实收到了一个警告(这是公平的),我正在使用 char 类型指针作为浮点值。我也不确定这有多可靠。任何人都可以提出更好的解决方案吗?
谢谢!
编辑:代码适用于 8051 微控制器。我想让它尽可能快/最优。
【问题讨论】:
-
ptr_char_value = &my_address_array[0];确实很危险。案例:ptr_char_value上的指针算术运算。你的目标是什么? -
在C中,
char类型给所有类型起别名,所以没关系。 -
有问题的微控制器来自 Silabs C8051F96x (8 bit)
-
你应该减少那个指针的废话。
**( ptr_value+0)可以写成*ptr_value[0]。另外,使用更多的临时变量;在多行上重复相同的指针计算是丑陋且不必要的。 -
我同意数组访问看起来比指针访问更好。但是指针访问速度更快(经过测试)。由于我可能需要执行数百次操作,因此我的性能会受到影响。这可能是编译器优化的事情,但我更喜欢使用指针而不是花时间优化数组访问(然后更改一大块代码)。关于更多临时值,代码看起来与我发布的不同。我只是举个例子来说明问题。