Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ NCurses的背景色数量似乎有限(前景色很好)_C++_Ncurses - Fatal编程技术网

C++ NCurses的背景色数量似乎有限(前景色很好)

C++ NCurses的背景色数量似乎有限(前景色很好),c++,ncurses,C++,Ncurses,最后在这里遇到了一个不寻常的问题:在程序开始时,我循环使用所有支持的256种颜色(在这里仅使用默认值),并创建一对具有所有可能排列的颜色-这导致了65535对我期望的每种可能的fg/bg组合。我已经通过打印到stderr验证了这些对是否符合预期 只需检查一下,我的终端支持256色、64k对和颜色/对重新分配 问题就出在这里:当试图通过attrset打印任意fg/bg颜色时(并验证它实际上是上面打印的所需颜色对),前景颜色工作正常,但背景颜色保持不变。如果我将所有值硬编码为单个bg颜色,它会按预期

最后在这里遇到了一个不寻常的问题:在程序开始时,我循环使用所有支持的256种颜色(在这里仅使用默认值),并创建一对具有所有可能排列的颜色-这导致了65535对我期望的每种可能的fg/bg组合。我已经通过打印到stderr验证了这些对是否符合预期

只需检查一下,我的终端支持256色、64k对和颜色/对重新分配

问题就出在这里:当试图通过attrset打印任意fg/bg颜色时(并验证它实际上是上面打印的所需颜色对),前景颜色工作正常,但背景颜色保持不变。如果我将所有值硬编码为单个bg颜色,它会按预期工作,同样,使每个排列具有相同的fg/bg颜色(即,将不同fg/bg对的数量限制为256个)也会按预期工作,如果我将对生成代码限制为仅生成256个不同的对,我会按预期看到背景色

从根本上说,这似乎是对可以创建多少唯一对的某种限制(256);如果我使用bg=0的所有64k颜色对,我可以通过其所有256对来寻址任何给定颜色,结果窗口与我设置所有fg/bg置换的窗口相同(即,就好像ncurses内部使用0表示所有bg颜色一样)

有什么想法吗?我在valgrind中没有看到任何内存问题,而且从我所知道的,ncurses文档暗示我的使用是受支持的。 谢谢

以下是生成对的代码:

for(unsigned int c2 = 0; c2 < 256; c2++) {
        for(unsigned int c1 = 0; c1 < 256; c1++) {
            int pi = (c2)*256 + c1;
            init_extended_pair(pi, c1, c1);
            std::cerr << "init " << pi << " : " << c1 << ", " << c2 << "\n";
        }
    }
计算给定fg/bg的对ID,完成调试代码以检索颜色值

void CursesObject::setColor(ColorRGBA fg, ColorRGBA bg) {
    if(fg == cfg && bg == cbg) return;
    else if(fg == bg) {
        attron(COLOR_PAIR(0));
        return;
    }
    //attrset(0x0);
    
    cfg = fg;
    cbg = bg;
    
    int pairID = this->getColor(fg) + (this->getColor(bg))*256;//\\\ + 16;
    //std::cout << "colorPair: " << pairID << " from cid = " << this->getColor(fg) << ", col = " << fg.toString() <<"\n";
    
    static int uidbgOff = 25;
    short dr, db, dg, bbr,bbb,bbg;
    int cp1, cp2;
    extended_pair_content(pairID, &cp1, &cp2);
    color_content(cp1, &dr, &dg, &db);
    color_content(cp2, &bbr, &bbg, &bbb);
    
    std::stringstream ss;
    ss << pairID << " : " << dr << ", " << dg << ", " << db << " | " << bbr << ", " << bbg << ", " << bbb << " reported, pair " << cp1 << ":" << cp2 <<", should be " << this->getColor(fg) << ":" << this->getColor(bg)<<"\n";
    
    
    
    //sleep(5);
    attrset(COLOR_PAIR(pairID));
    this->write({10,uidbgOff}, ss.str());
    uidbgOff++;
    //this->update();
    
}
void curseObject::setColor(ColorRGBA fg,ColorRGBA bg){
如果(fg==cfg&&bg==cbg)返回;
否则如果(fg==bg){
attron(颜色对(0));
返回;
}
//属性集(0x0);
cfg=fg;
cbg=bg;
int pairID=this->getColor(fg)+(this->getColor(bg))*256;//\+16;

//std::cout该示例混合使用支持扩展颜色对和不支持扩展颜色对的调用。
attron
attrset
调用将颜色对存储在8位字段中。如果使用
attr\u on
attr\u set
,则将颜色对存储在整数中(远大于8位)。扩展的\u-pair内容建立在后者的基础上,允许使用大于32767的颜色对。

这将教会我依赖在线文档,谢谢!我已经切换到扩展函数(大多数情况下工作正常),但32767以上的扩展的\u-pair内容()仍然显示为0,0。我应该检查任何常见的问题吗?
void CursesObject::setColor(ColorRGBA fg, ColorRGBA bg) {
    if(fg == cfg && bg == cbg) return;
    else if(fg == bg) {
        attron(COLOR_PAIR(0));
        return;
    }
    //attrset(0x0);
    
    cfg = fg;
    cbg = bg;
    
    int pairID = this->getColor(fg) + (this->getColor(bg))*256;//\\\ + 16;
    //std::cout << "colorPair: " << pairID << " from cid = " << this->getColor(fg) << ", col = " << fg.toString() <<"\n";
    
    static int uidbgOff = 25;
    short dr, db, dg, bbr,bbb,bbg;
    int cp1, cp2;
    extended_pair_content(pairID, &cp1, &cp2);
    color_content(cp1, &dr, &dg, &db);
    color_content(cp2, &bbr, &bbg, &bbb);
    
    std::stringstream ss;
    ss << pairID << " : " << dr << ", " << dg << ", " << db << " | " << bbr << ", " << bbg << ", " << bbb << " reported, pair " << cp1 << ":" << cp2 <<", should be " << this->getColor(fg) << ":" << this->getColor(bg)<<"\n";
    
    
    
    //sleep(5);
    attrset(COLOR_PAIR(pairID));
    this->write({10,uidbgOff}, ss.str());
    uidbgOff++;
    //this->update();
    
}