我有一堆矩形物体,我需要将它们装入尽可能小的空间(这个空间的尺寸应该是2的幂).
我知道各种打包算法会将项目尽可能地打包到给定的空间中,但是在这种情况下我需要算法来计算出该空间应该有多大.
例如,说我有以下矩形
它们可以装入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,并且每个维度的给定最大大小)?
我正在做一些不同的事情,有些使用标签,有些使用2个空格用于缩进,另外用户有4个空格用于缩进等.
在Visual Studio中设置它的选项位于工具 - >选项 - >文本编辑器 - > <语言> - >选项卡中
有没有办法在每个解决方案基础上覆盖这些设置?
我不喜欢在我的代码中散布着魔术盒......这两个类究竟是如何工作的,基本上允许任何函数映射到一个函数对象,即使函数<>有一个完全不同的参数设置为一个im传递给 boost::bind
它甚至适用于不同的调用约定(即成员方法__thiscall在VC下,但"普通"函数通常__cdecl或者__stdcall需要与C兼容的那些).
我一直使用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
我正在编写一些用于解析一些文本数据文件的模板类,因此很可能绝大多数的解析错误都是由于数据文件中的错误造成的,这些错误大部分都不是由程序员编写的,因此需要关于为什么应用程序无法加载的好消息,例如:
解析example.txt时出错.[MySectiom] Key的值("notaninteger")不是有效的int
我可以计算出从传递给在类模板函数和成员瓦尔参数文件,段和键名,但我不知道如何让模板函数试图转换为类型的名称.
我当前的代码看起来像,只有普通字符串的特殊化,如下:
template<typename T> T GetValue(const std::wstring §ion, 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文件中).
然后链接器能够找到适当的模板特化,只要它在某处定义,否则抛出链接器错误,以便我可以添加类型.
什么是一组异常类的好设计?
我看到各种各样的东西,关于什么异常类应该和不应该做什么,但不是一个简单的设计,易于使用和扩展,做那些事情.
让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) 有时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 ++知识的人能够编辑和实现各种功能.
因为它是一个实时应用程序,我需要为这些脚本进行某种多任务处理.理想情况下我想要它,以便c ++应用程序调用脚本函数,然后继续运行(在c ++线程下),直到暂停点(Wait(x)),或者它返回.在等待的情况下,需要保存状态,以便在持续时间到期后应用程序在下次循环时重新启动脚本.
脚本还需要能够调用c ++类方法,理想情况下使用c ++类而不是c ++类的普通包装函数.
我不想花费大量时间来实现它,因此使用现有的脚本语言比编写自己的脚本语言更受欢迎.我听说Python和Lua可以集成到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) 是否有可能在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++ ×8
exception ×2
algorithm ×1
boost ×1
boost-asio ×1
boost-bind ×1
build ×1
compile-time ×1
doxygen ×1
indentation ×1
packing ×1
scripting ×1
sockets ×1
tcp ×1
templates ×1
typename ×1