小编Fir*_*cer的帖子

可以使用什么算法以不同的方式将不同大小的矩形打包成最小的矩形?

我有一堆矩形物体,我需要将它们装入尽可能小的空间(这个空间的尺寸应该是2的幂).

我知道各种打包算法会将项目尽可能地打包到给定的空间中,但是在这种情况下我需要算法来计算出该空间应该有多大.

例如,说我有以下矩形

  • 128*32
  • 128*64
  • 64*32
  • 64*32

它们可以装入128*128的空间

 _________________
|128*32          |
|________________|
|128*64          |
|                |
|                |
|________________|
|64*32  |64*32   |
|_______|________|

但是如果还有160*32和64*64,则需要256*128空间

 ________________________________
|128*32          |64*64  |64*32  |
|________________|       |_______|
|128*64          |       |64*32  |
|                |_______|_______|
|                |               |
|________________|___            |
|160*32              |           |
|____________________|___________|

有哪些算法能够打包一堆矩形并确定容器所需的大小(功率为2,并且每个维度的给定最大大小)?

algorithm packing

269
推荐指数
6
解决办法
9万
查看次数

Visual Studio,每个解决方案缩进设置

我正在做一些不同的事情,有些使用标签,有些使用2个空格用于缩进,另外用户有4个空格用于缩进等.

在Visual Studio中设置它的选项位于工具 - >选项 - >文本编辑器 - > <语言> - >选项卡中

有没有办法在每个解决方案基础上覆盖这些设置?

indentation visual-studio-2008

84
推荐指数
3
解决办法
2万
查看次数

boost :: function和boost :: bind如何工作

我不喜欢在我的代码中散布着魔术盒......这两个类究竟是如何工作的,基本上允许任何函数映射到一个函数对象,即使函数<>有一个完全不同的参数设置为一个im传递给 boost::bind

它甚至适用于不同的调用约定(即成员方法__thiscall在VC下,但"普通"函数通常__cdecl或者__stdcall需要与C兼容的那些).

c++ boost boost-bind boost-function

82
推荐指数
1
解决办法
6万
查看次数

有效地为多个项目和配置使用Visual Studio项目属性

我一直使用Visual Studio内置的Visual Studio来配置我的项目,通常使用属性表,以便多个项目将使用一个公共集.

我最关心的一个问题是管理多个项目,配置和平台.如果您只使用主GUI(右键单击项目 - >属性)执行所有操作,它很快就会变得混乱,难以维护并容易出现错误(例如无法正确定义某些宏,或使用错误的运行时库等).处理不同的人在不同的地方放置依赖库的事实(例如我的所有人都住在"C:\ Libs\[C,C++]\[lib-name] \"),然后经常管理这些库的不同版本不同的(发布,调试,x86,x64等)也是一个大问题,因为它使在新系统上设置它的时间大大复杂化,然后版本控制存在问题并且将每个人的路径分开. .

属性表使这更好一点,但我不能让一张表有不同的配置和平台的单独设置(下拉框显示为灰色),导致我有许多表,如果以正确的顺序继承做我想要的( "x86","x64","debug","release","common","目录"(通过定义BoostX86LibDir等用户宏来处理前面提到的依赖性问题)等,如果以错误的顺序继承(例如"x64"和"debug"之前的"common"会导致尝试链接不正确的库版本或错误地命名输出等问题...

我想要的是一种处理所有这些分散的依赖关系并设置一组"规则"的方法,这些规则被解决方案中的所有项目使用,例如将输出库命名为"mylib- [vc90,vc100] - [x86 ,x64] [ - d] .lib",无需为每个单独的项目,配置和平台组合执行所有这些操作,然后使它们保持正确同步.

我知道转移到完全不同的系统,如CMake创建所需的文件,然而这使其他地方的事情变得复杂,因为即使是简单的任务,如在项目中添加新文件,然后需要在其他地方进行其他更改,这不是我的事情.除非有一些VS2010集成可以跟踪这些变化,否则完全满意.

c++ projects-and-solutions build visual-studio-2010 visual-studio

70
推荐指数
4
解决办法
4万
查看次数

C++获取模板中的类型名称

我正在编写一些用于解析一些文本数据文件的模板类,因此很可能绝大多数的解析错误都是由于数据文件中的错误造成的,这些错误大部分都不是由程序员编写的,因此需要关于为什么应用程序无法加载的好消息,例如:

解析example.txt时出错.[MySectiom] Key的值("notaninteger")不是有效的int

我可以计算出从传递给在类模板函数和成员瓦尔参数文件,段和键名,但我不知道如何让模板函数试图转换为类型的名称.

我当前的代码看起来像,只有普通字符串的特殊化,如下:

template<typename T> T GetValue(const std::wstring &section, const std::wstring &key)
{
    std::map<std::wstring, std::wstring>::iterator it = map[section].find(key);
    if(it == map[section].end())
        throw ItemDoesNotExist(file, section, key)
    else
    {
        try{return boost::lexical_cast<T>(it->second);}
        //needs to get the name from T somehow
        catch(...)throw ParseError(file, section, key, it->second, TypeName(T));
    }
}
Run Code Online (Sandbox Code Playgroud)

Id而不是必须为数据文件可能使用的每种类型进行特定的重载,因为它们有很多...

此外,我需要一个不会产生任何运行时开销的解决方案,除非发生异常,即完全编译时解决方案是我想要的,因为这个代码被称为吨次并且加载时间已经变得有点长.

编辑:好的,这是我提出的解决方案:

我有一个类型h包含以下内容

#pragma once
template<typename T> const wchar_t *GetTypeName();

#define DEFINE_TYPE_NAME(type, name) \
    template<>const wchar_t *GetTypeName<type>(){return name;}
Run Code Online (Sandbox Code Playgroud)

然后我可以在我需要处理的每种类型的cpp文件中使用DEFINE_TYPE_NAME宏(例如,在定义要开始的类型的cpp文件中).

然后链接器能够找到适当的模板特化,只要它在某处定义,否则抛出链接器错误,以便我可以添加类型.

c++ templates compile-time typename

69
推荐指数
7
解决办法
11万
查看次数

C++异常类设计

什么是一组异常类的好设计?

我看到各种各样的东西,关于什么异常类应该和不应该做什么,但不是一个简单的设计,易于使用和扩展,做那些事情.

  1. 异常类不应该抛出异常,因为这可能直接导致进程终止,而没有任何机会记录错误等.
  2. 它需要能够获得用户友好的字符串,最好是本地化的语言,以便在应用程序无法从错误中恢复之前,在应用程序终止之前告诉它们.
  3. 当堆栈展开时,需要可以添加信息,例如,如果XML解析器无法解析输入流,能够添加源是来自文件,还是通过网络等.
  4. 异常处理程序需要轻松访问处理异常所需的信息.
  5. 将格式化的异常信息写入日志文件(英文,因此没有翻译).

让1和4一起工作是我遇到的最大问题,因为任何格式化和文件输出方法都可能失败.

编辑:所以看了几个类中的异常类,并且在Neil链接的问题中,似乎通常的做法是完全忽略第1项(因此提升建议),这似乎是一个相当糟糕的想法我.

无论如何,我以为我也会发布我正在考虑使用的异常类.

class Exception : public std::exception
{
    public:
        // Enum for each exception type, which can also be used
        // to determine the exception class, useful for logging
        // or other localisation methods for generating a
        // message of some sort.
        enum ExceptionType
        {
            // Shouldn't ever be thrown
            UNKNOWN_EXCEPTION = 0,

            // The same as above, but it has a string that
            // may provide some information
            UNKNOWN_EXCEPTION_STR,

            // For …
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling exception

42
推荐指数
4
解决办法
3万
查看次数

boost :: asio干净地断开连接

有时boost :: asio似乎在我想要之前断开连接,即在服务器正确处理断开连接之前.我不确定这是怎么可能的,因为客户端似乎认为它完全发送了消息,但是当服务器发出错误时它甚至没有读取消息头...在测试期间,这种情况可能只发生在5次中,服务器接收客户端关闭消息,并干净地断开客户端.

错误:"远程主机强行关闭现有连接"

客户端断开连接:

void disconnect()
{
    boost::system::error_code error;
    //just creates a simple buffer with a shutdown header
    boost::uint8_t *packet = createPacket(PC_SHUTDOWN,0);
    //sends it
    if(!sendBlocking(socket,packet,&error))
    {
        //didnt get here in my tests, so its not that the write failed...
        logWrite(LOG_ERROR,"server",
            std::string("Error sending shutdown message.\n")
            + boost::system::system_error(error).what());
    }

    //actaully disconnect
    socket.close();
    ioService.stop();
}
bool sendBlocking(boost::asio::ip::tcp::socket &socket,
    boost::uint8_t *data, boost::system::error_code* error)
{
    //get the length section from the message
    boost::uint16_t len = *(boost::uint16_t*)(data - 3);
    //send it
    asio::write(socket, asio::buffer(data-3,len+3),
        asio::transfer_all(), *error); …
Run Code Online (Sandbox Code Playgroud)

c++ sockets network-programming tcp boost-asio

26
推荐指数
3
解决办法
4万
查看次数

在c ++ app中实现脚本

我想将我的应用程序的各个部分移动到简单的脚本中,以允许不具备c ++知识的人能够编辑和实现各种功能.

因为它是一个实时应用程序,我需要为这些脚本进行某种多任务处理.理想情况下我想要它,以便c ++应用程序调用脚本函数,然后继续运行(在c ++线程下),直到暂停点(Wait(x)),或者它返回.在等待的情况下,需要保存状态,以便在持续时间到期后应用程序在下次循环时重新启动脚本.

脚本还需要能够调用c ++类方法,理想情况下使用c ++类而不是c ++类的普通包装函数.

我不想花费大量时间来实现它,因此使用现有的脚本语言比编写自己的脚本语言更受欢迎.我听说Python和Lua可以集成到c ++应用程序中,但我不知道如何实现这一目标.

  • 脚本必须能够调用c ++函数
  • 脚本必须能够在调用某些函数时"暂停"(例如,等待),并由c ++线程重新启动
  • 需要快速 - 这是一个实时应用程序,可能会运行很多脚本.

我可以相当容易地滚动多任务代码,前提是可以保存并重新启动脚本(可能是通过与原始脚本不同的线程).

c++ scripting

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

捕获所有未处理的C++异常?

有没有办法捕获原本未处理的异常(包括那些在catch块之外抛出的异常)?

我并不是真的关心所有正常的清理工作,只是因为我可以捕获它,将其写入日志/通知用户并退出程序,因为这些情况下的例外通常是致命的,不可恢复的错误.

就像是:

global_catch()
{
    MessageBox(NULL,L"Fatal Error", L"A fatal error has occured. Sorry for any inconvience", MB_ICONERROR);
    exit(-1);
}
global_catch(Exception *except)
{
    MessageBox(NULL,L"Fatal Error", except->ToString(), MB_ICONERROR);
    exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling exception

24
推荐指数
7
解决办法
5万
查看次数

记录预处理器在Doxygen中定义

是否有可能在Doxygen中记录预处理器定义?我希望能够像变量或函数那样做,但Doxygen输出似乎"丢失"了定义的文档,并且也不包含定义本身.

我尝试了以下内容

/**My Preprocessor Macro.*/
#define TEST_DEFINE(x) (x*x)
Run Code Online (Sandbox Code Playgroud)

/**@def TEST_DEFINE

   My Preprocessor Macro.
*/
#define TEST_DEFINE(x) (x*x)
Run Code Online (Sandbox Code Playgroud)

我也尝试将它们放在一个组(尝试defgroup,addtogroup和ingroup)中,而不仅仅是在"文件范围",但是也没有效果(尽管组中的其他项目是按照预期记录的).

我查看了各种Doxygen选项,但看不到任何可以启用(或阻止)文档定义的内容.

c++ doxygen c-preprocessor

24
推荐指数
2
解决办法
3万
查看次数