我在vivado hls上实现了一个图像处理算法,作为优化的一部分,我试图将浮点表示转换为定点表示。
这就是它出错的地方
#include <ap_fixed.h>
unsigned char win[3][3];
typedef ap_ufixed<11,8> fix;
struct pixel_f
{
fix r;
fix g;
fix b;
};
pixel_f new_pix;
.
.
.
.
.
new_pix.r = ((fix)(win[1][0] + win[1][2]) / 2)+0.5;当我试图执行它的时候,它给了我一个错误
demosiac_core.cpp:16:49: error: ambiguous overload for 'operator+' (operand types are 'ap_fixed_base<11, 8, false, (ap_q_mode)5u, (ap_o_mode)3u, 0>::RType<32, 32, true>::div {aka ap_fixed<12, 9, (ap_q_mode)5u, (ap_o_mode)3u, 0>}' and 'double')
new_pix.r = ((fix)(win[1][0] + win[1][2]) / 2)+0.5;有没有人能帮我提供一些建议,告诉我为什么会出问题,以及如何才能使其正常工作?
提前谢谢你,
发布于 2020-11-30 15:17:37
看一下头文件,问题似乎是ap_ufixed类既有一个接受double的构造函数,即fix::fix(double),也有一个转换为double的运算符,即fix::operator double()。但是它没有定义一个接受fix和double的加法运算符,即没有operator+(fix, double)。
因此,当编译像这样的代码时
fix x = ...;
double y = ...;
fix z = x + y;编译器不知道是将y转换为fix并添加两个fix值,还是将x转换为double并添加两个double值。编译器错误消息中的歧义指的是什么。
解决方案是准确地说出您想要什么,如果您希望加法器将两个fix值相加,则编写以下代码
new_pix.r = ((fix)(win[1][0] + win[1][2]) / 2)+ fix(0.5);如果您希望加法将两个double值相加(似乎不太可能),那么编写以下代码
new_pix.r = (double)((fix)(win[1][0] + win[1][2]) / 2) + 0.5;或者,您可能想要完全重写表达式。我不明白为什么这不能与您的代码做同样的事情(获得win[1][0]和win[1][2]的平均值,但要向上舍入),而是以一种更简单、更有效的方式
new_pix.r = (win[1][0] + win[1][2] + 1) / 2;顺便说一下,似乎定义了接受整数值的运算符,这就是为什么代码中的/ 2不会导致同样的问题。
https://stackoverflow.com/questions/65069234
复制相似问题