小编Pri*_*tic的帖子

Unicode的换行规则是否要求最后一个字符是强制中断?

我正在尝试使用libunibreak(https://github.com/adah1972/libunibreak)来标记某些给定的unicode文本中可能的换行符.

Libunibreak在某些文本中为每个代码单元返回了四个可能的选项:

LINEBREAK_MUSTBREAK
LINEBREAK_ALLOWBREAK
LINEBREAK_NOBREAK
LINEBREAK_INSIDEACHAR
Run Code Online (Sandbox Code Playgroud)

希望这些是自我解释的.我希望MUSTBREAK对应于像LF这样的换行符.但是,对于任何给定的文本,Libunibreak始终指示最后一个字符是MUSTBREAK

例如,使用字符串"abc",输出将是[NOBREAK,NOBREAK,MUSTBREAK].对于"abc \n",输出将是[NOBREAK,NOBREAK,NOBREAK,MUSTBREAK].我在绘制文本时使用MUSTBREAK属性开始一个新行,因此第一个案例("abc")创建了一个不应该存在的额外换行符.

这是Unicode指定的行为,还是我正在使用的库实现的怪癖?

unicode line-breaks

4
推荐指数
1
解决办法
103
查看次数

为什么在没有编写者的命名管道上进行选择会无限期地阻塞?

我在 read_fds 中使用单个命名管道 fd 调用 select。该命名管道没有写入器,并且仅以非阻塞、只读模式打开。我希望 select 返回,命名管道 fd 标记为准备读取,并且尝试从管道读取返回 0:

从联机帮助页中读取:

当尝试从空管道或 FIFO 读取时:

  • 如果没有进程打开管道进行写入,则 read() 应返回 0 > 指示文件结束。

但是,只能无限期地选择块。为什么会这样呢?

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

#include <stdexcept>
#include <thread>
#include <iostream>

int main()
{
    char buf[4096];

    // Create a named pipe
    auto err = mkfifo("/tmp/whatever",0666);
    if(err) {
        throw std::runtime_error(
                    std::string("Failed to create fifo ")+
                    strerror(errno));
    }

    std::thread reader_thread(
                [&](){
        auto fd = open("/tmp/whatever",O_RDONLY|O_NONBLOCK);
        if(fd < 0) {
            throw std::runtime_error("Failed to open fifo");
        } …
Run Code Online (Sandbox Code Playgroud)

c++ linux select posix nonblocking

4
推荐指数
1
解决办法
742
查看次数

计算两个四边形交点的方法?

可能重复:
多边形交集的简单算法

我正在寻找一个关于如何快速计算两个任意定向四边形的交点的概述(没有预设的拐角或边长约束).我不是要简单地检查它们是否相交,而是希望得到构成所得交叉区域的点.我知道通常多边形交叉不是一个小问题,并且有可用的库可以做得很好.

但是因为在这个我只关注四面形状的特殊情况下,我想知道是否有一种快速方法可以使用,而不需要在我的应用程序中包含一个完整的附加库.

到目前为止,我所想到的只有:

  1. 在两个形状上相对于彼此运行'多边形点'
  2. 将每个多边形的每个边相互交叉

上述两个步骤是否最终得到了构成最终交叉区域的所有点?有更好的方法可以使用吗?

如果我能得到构成结果区域的点的正确排序,那也很好.这不是强制性的 - 如果你知道任何聪明/快速的方法(凸壳?)我会感激任何建议.

c++ math geometry

3
推荐指数
1
解决办法
2760
查看次数

如何根据 constexpr 结果在编译时选择函数

我有一个在运行时处理动态数据(many_things)的函数:

void do_some_work(Thing &many_things)
{
    constexpr bool add = something_evald_at_compile_time;

    // do some work
    for(auto &thing : many_things) {
        thing.result = add_or_subtract(thing.one,thing.two);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要有两种“add_or_subtract”变体,并根据 constexpr“add”调用其中之一:

template <typename N> // call me if 'add' == true
N add_or_subtract(N a, N b) { return a+b; }

template <typename N> // call me if 'add' == false
N add_or_subtract(N a, N b) { return a-b; }
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

c++ c++11

2
推荐指数
1
解决办法
1651
查看次数

调试语句放置修复的不一致输出

编辑:这是一个未初始化的变量... :(

说明:我使用的PointLLA构造函数只通过Latitude和Longitude,但我从未将内部Altitude成员变量显式设置为0. Rookie错误...

原始问题:我的代码中有一个错误的时间非常糟糕.我正在计算单个点和矩形角之间的距离.在这种情况下,该点以矩形为中心,因此我应该得到四个相等的距离.我得到三个相等的距离,一个几乎相等的距离值是不一致的(每次运行都不同).

如果我有几个关键的调试语句(几乎只是一个std :: cout调用)明确打印出每个矩形角的位置,我得到距离的预期值,并且不一致性消失.这是相关的代码:

// calculate the minimum and maximum distance to
// camEye within the available lat/lon bounds
Vec3 viewBoundsNE;   convLLAToECEF(PointLLA(maxLat,maxLon),viewBoundsNE);
Vec3 viewBoundsNW;   convLLAToECEF(PointLLA(maxLat,minLon),viewBoundsNW);
Vec3 viewBoundsSW;   convLLAToECEF(PointLLA(minLat,minLon),viewBoundsSW);
Vec3 viewBoundsSE;   convLLAToECEF(PointLLA(minLat,maxLon),viewBoundsSE);

// begin comment this block out, and buggy output
OSRDEBUG << "INFO: NE (" << viewBoundsNE.x
         << "  " << viewBoundsNE.y
         << "  " << viewBoundsNE.z << ")";
OSRDEBUG << "INFO: NW (" << viewBoundsNW.x
         << "  " << viewBoundsNW.y
         << "  " << viewBoundsNW.z …
Run Code Online (Sandbox Code Playgroud)

c++

0
推荐指数
1
解决办法
96
查看次数

标签 统计

c++ ×4

c++11 ×1

geometry ×1

line-breaks ×1

linux ×1

math ×1

nonblocking ×1

posix ×1

select ×1

unicode ×1