Tag: 语言不可知的

C将内存部件移动到位

我正在实现几个数据结构和一个我要使用的原语如下:我有一个内存块A [N](它有一个可变长度,但我的示例为100)并且在这个块中,有一个较小的部分长度为K的C(比方说30)我想要移动而不使用任何额外的内存。 另外的困难是,A“包裹”,即C可以从A [80]开始,然后C的前20个元素是元素A [80..100],最后10个元素是元素A [ 0..10]。 此外,目标范围还可以以任何可能的方式“包裹”并与C重叠。 另外,我不想使用超过一定数量的额外内存,一切都应该到位。 此外,既不在目标范围内也不在源范围内的A部分可能包含重要的内容,因此也不能使用。 所以一个案例如下: A看起来像这样: | 456789ABCDEF0123456789AB | —– | 0123 | 应该转变为: | 89AB | —– | 0123456789ABCDEF01234567 | 只是将它委托给一个库或者从库中使用另一个数据结构不是一个选项,我想自己理解这个问题。 在第一眼看来,我认为这可能不是微不足道的,但是一旦你区分了几个案例,它就会变得清晰,但现在我遇到了严重的麻烦。 当然,如果它们不重叠或不包装,则存在微不足道的情况,但至少如果两者同时发生,则会变得混乱。 你可以从一个自由的地方开始并移动属于那里的部分,然后你在其他地方创建另一个免费部分,很难跟踪你可以使用哪些部分。 也许我完全错过了一些东西,但即使我的特殊情况,如果目标范围没有包装也有近100行(虽然它的一半是断言和注释)我可以更新它以便它也处理一般情况下一些额外的索引计算,但如果有人有一个优雅而简短的解决方案,我将不胜感激。 直觉上我认为这应该是微不足道的,但我还没有看到最好的解决方案。 注意:有趣的情况当然是,如果C几乎和A一样大。如果| C | <N / 2,这是微不足道的。 编辑:使用超过一定量的额外标志/索引计数作为额外的内存,我想尽可能避免这种情况。 编辑:有些人想看我的代码。 我的问题相当抽象,所以我不想发布它,但也许有人看到了如何改进它。 这很糟糕,它只适用于目标从头开始(但是,可以很容易地改变)并且非常长的情况,但它可以在O(n)中没有额外的内存。 #include #include #include #include void move_part(int* A, size_t N, size_t target, size_t […]

将颜色值从float 0..1转换为byte 0..255

将颜色值从float转换为byte的正确方法是什么? 起初我以为b=f*255.0应该这样做,但现在我想,在这种情况下,只有精确的1.0将被转换为255 ,但0.9999已经是254 ,这可能不是我想要的…… 似乎b=f*256.0会更好,除非它会在精确1.0的情况下产生256的不需要的情况。 最后我用这个: #define F2B(f) ((f) >= 1.0 ? 255 : (int)((f)*256.0))