相关疑难解决方法(0)

C Struct中的默认值

我有这样的数据结构:

    struct foo {
        int id;
        int route;
        int backup_route;
        int current_route;
    }

以及一个名为update()的函数,用于请求对其进行更改.

  update(42, dont_care, dont_care, new_route);

这真的很长,如果我在结构中添加一些内容,我必须在每次调用更新(...)时添加'dont_care'.

我正在考虑将结构传递给它,但事先用'dont_care'填充结构比在函数调用中拼写它更加繁琐.我可以使用默认值dont care在某处创建结构,并在我将其声明为局部变量后设置我关心的字段吗?

    struct foo bar = { .id = 42, .current_route = new_route };
    update(&bar);

将我希望表达的信息传递给更新功能的最优雅的方法是什么?

我希望其他一切都默认为-1("不关心"的密码)

c initialization

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

如果比较函数不是运算符<?,为什么std :: sort会崩溃?

以下程序是使用VC++ 2012编译的.

#include <algorithm>

struct A
{
    A()
        : a()
    {}

    bool operator <(const A& other) const
    {
        return a <= other.a;
    }

    int a;
};

int main()
{
    A coll[8];
    std::sort(&coll[0], &coll[8]); // Crash!!!
}
Run Code Online (Sandbox Code Playgroud)

如果我return a <= other.a;改为return a < other.a;那么程序按预期运行,没有例外.

为什么?

c++ algorithm standards exception

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

安全使用+ =运算符使用[]创建一个新的std :: map条目?

假设我有一个std::map<int, int>,这样做是否安全?

std::map<int, int> m_map;
m_map[0] += 1;
Run Code Online (Sandbox Code Playgroud)

如果0我执行此操作时地图中不存在该键,它将如何知道要添加的值1?

我希望std :: map通过执行=而不是+=在值在地图中创建新条目的情况来处理此问题.这将使我不必这样做:

std::map<int, int>::iterator it = m_map.find(0);
if(it != m_map.end()) {
    it->second += 1;
}
else {
    m_map[0] = 1;
}
Run Code Online (Sandbox Code Playgroud)

c++ map

12
推荐指数
3
解决办法
1271
查看次数

只有当len <3时,才会出现堆损坏错误.怎么会?

出于某种原因,如果len <3,我将在delete []缓冲行中得到堆损坏错误.

case WM_COMMAND:
{
    switch(LOWORD(wParam))
    {
    case ID_BUTTON_OK:
        {
            int len = SendMessage(mapName, WM_GETTEXTLENGTH, 0, 0);

            char* buffer = new char[len+1];
            ZeroMemory(buffer,sizeof(buffer));

            len = SendMessage(mapName, WM_GETTEXT, (WPARAM)len+1, (LPARAM)buffer);

            if(isMapNameLegal(buffer)) // Makes sure the map name is legal
            {
            }
            else
            {
                MessageBox(NULL,"The map name is illegal","Error",MB_ICONERROR);
            }

            delete[] buffer;
        }
        break;
Run Code Online (Sandbox Code Playgroud)

有isMapNameLegal.顺便说一句,它是静态的:

bool Creator::isMapNameLegal(char* name)
{
    if(strlen(name)<=3)
        return false;

    int x=0;
    while(name[x]!='\0')
    {
        if(name[x]<48 && name[x]!=32)       //32=='\r', 48==0,
            return false;
        if(name[x]>57 && name[x]<65)        //57==9, 65==A
            return false;
        if(name[x]>90 …
Run Code Online (Sandbox Code Playgroud)

c++ memory oop heap memory-management

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