RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-344284

V-Mor's questions

Martin Hope
V-Mor
Asked: 2022-08-11 11:46:32 +0000 UTC

获取 std::vector 元素地址而不是使用 data() 的陷阱

  • 0

我有一个字节向量std::vector<char>。我想将其数据send从 Windows Sockets API 传递给一个函数。我首先想到的是这样做:

std::vector<char> data;
// На этом моменте вектор заполняется данными
send(socket, data.data(), data.size(), 0);

然而,由于 我正在使用旧的标准 C++(Visual Studio 2008 SP1),我不能使用该方法data(),它只是不存在。然后我求助于这个:

std::vector<char> data;
// На этом моменте вектор заполняется данными
send(socket, &data[0], data.size(), 0);

我做了几个“实验”,创建了不同长度的向量,用数据填充它们,然后以相同的方式获取数据(即仅通过指针及其偏移量)并且没有发生错误。基于此,我假设这种将矢量数据传递给函数send的方式是可行且安全的。但是,在我看来,这种方法仍然看起来“歪曲”,而根据我的经验,看起来“歪曲”的一切都充满了许多陷阱(即,在任何情况下程序都可能出现不安全行为)。

因此问题是:以这种方式将向量数据std::vector<char> data传递给函数是否安全,在什么情况下会导致不好的事情(UB、异常等)?send&data[0]

PS 请不要建议使用更新的语言标准。这对我来说是不可能的。

c++
  • 1 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2021-12-30 13:49:36 +0000 UTC

未从 net-snmp 文件中读取 Mib-tree

  • 2

尝试使用此答案使用 net-snmp 减去 MIB 树文件。这是我的代码:

#define _CRT_SECURE_NO_WARNINGS

#define _WINSOCKAPI_
#include <windows.h>

#include <iostream>
#include <fstream>

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/definitions.h>
#include <net-snmp/library/tools.h>
#include <net-snmp/mib_api.h>
#include <net-snmp/library/mib.h>
#include <net-snmp/library/parse.h>

#pragma comment(lib, "WS2_32.lib")


void showTree(struct tree *tree_head, unsigned int level = 0)
{
    for (struct tree * tp = tree_head; tp; tp = tp->next_peer)
    {
        for (size_t i = 0; i < level; ++i)
            std::cout << "\t";

        std::cout << tp->subid << " " << tp->label << std::endl;
        showTree(tp->child_list, level + 1);
    }
}

int main(int argc, char* argv[])
{
    struct tree *tp;
    struct tree *tree_head = NULL;
    FILE *fp = NULL;

    char str[] = "путь к папке с файлами MIB\\название_файла.mib";

    netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_WARNINGS, 2);
    netsnmp_ds_toggle_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_SAVE_MIB_DESCRS);

    netsnmp_init_mib();

    add_mibdir("путь к папке с файлами MIB");

    tree_head = read_mib(str);

    if (tree_head)
    {
        std::cout << "Successfully parsed the MIB\n";
    }

    std::cout << "\nParsing results:\n";

    std::cout << tree_head->number_modules << std::endl;
    showTree(tree_head); // Рекурсивно выводит дерево

    getchar();
    return 0;
}

预期结果:推导出的 MIB 树包含来自RFC-1155的核心节点以及来自文件的我的节点和树本身。

结果是:一个 MIB 树不仅包含RFC-1155中的内容,还包含一大堆其他内容,而且我的文件中没有任何信息。即使是第一个节点。

事实证明,我明确传递了从中获取树的文件,他从任何地方获取了所有可能的树,但不是从我的文件中获取。

问题:如何tree从我的文件中获取仍然包含树的类型对象,而不是从库在计算机上找到的所有 MIB 中,除了我的?

c++
  • 1 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2021-12-08 10:32:13 +0000 UTC

“无法将 const char* 类型的值分配给 char* 类型的实体” 是什么决定了此错误的发生或不发生?

  • 1

在一些关于 ruSO 的问题中,例如,这里,以及 Cyber​​Forum 上的问题(例如,这里),以及一般在 Internet 上,很多人都会遇到问题标题中描述的问题。如何解决它,我从同样的问题中知道。它发生的原因也是众所周知的。问题是,为什么我没有想到呢?

更详细地说:我试图重现问题以解决第一个链接上的问题,以便检查我的解决方案,然后将其写下来作为回应。而且我发现,从其他人那里提出问题的所有事情都可以正常工作并且没有任何问题。例如,这个简单的代码:

#include <iostream>

int main()
{
    char * x = "Hello";
    std::cout << x << std::endl;

    getchar();
    return 0;
}

编译没有问题,并在 VS 2015 和 VS 2008 上按预期输出“Hello”。

再一次,问题是:为什么上面描述的问题不能为我重现并且const char *分配没有问题char *?发生此错误的条件是什么?

c++
  • 1 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2021-11-30 12:57:14 +0000 UTC

是否存在根本区别:如果 if 块中有 return 或 throw,则放置或不放置 else?

  • 7

假设我们有以下代码:

if (condition)
    return 0;
else
    DoSomething();

它可以重写为:

if (condition)
    return 0;
DoSomething();

在这两种情况下,只要condition == true,该函数将返回,否则该函数将被调用DoSomething()。可以使用运算符throw而不是给出类似的示例return。也就是说,从逻辑上讲,在这两种情况下(有else和没有)绝对没有区别。

问:在这种情况下有什么好的理由下注或不下注else吗?else也许这两个示例(有和没有)之间存在一些甚至很小的性能差异?

c++
  • 2 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2021-11-16 01:00:05 +0000 UTC

如何在 Visual Studio 2019 调试器中查看 std::vector 中的值?

  • 1

有一个简单的代码:

#include <iostream>
#include <vector>


int main()
{
    std::vector<int> v {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    getchar();
    return 0;
}

c 行有getchar();一个断点。我在两个 IDE 中运行此代码:Visual Studio 2019 和 CLion。停在一点的时候,我看的是局部变量的值,也就是向量v。这是我在 CLion 中看到的(从我的角度来看,它是一个“健康人的调试器”):

克莱恩

这就是 Visual Studio 2019 向我展示的内容:

视觉工作室 2019

我知道 VS 的输出通过容器实现的细节来证明是合理的,并且很可能“在引擎盖下”向量看起来完全一样。但是,尽管如此,CLion 出于某种原因“理解”程序员在调试时很可能希望看到“一点”而不是这个。此外,在使用 Visual Studio 2008 时,我不止一次地用调试器查看了类似的向量,就像在 CLion 中一样,容器元素以可读的形式显示(不幸的是,无法附上屏幕截图) .

问:自 2008 版以来 VS 调试器发生了什么变化,我如何让它显示有用的信息而不是容器的内部实现细节?

c++
  • 1 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2020-09-01 12:26:50 +0000 UTC

如何使用std::copy将值从std::map复制到std::vector

  • 2

目标是将所有值从复制std::map到std::vector。

是的,不用它,std::copy你可以简单地循环遍历字典的所有值,然后把它们扔到一个向量中。但是,它是在std::copy.

最小的例子:

#include <iostream>
#include <string>
#include <map>
#include <algorithm>


int main()
{
    std::map<int, std::string> m;
    m[0] = "Hello";
    m[7] = "Heey";
    m[-59] = "R";
    m[1024] = "Rrrrrrrrroooooooooocccccccckkkkkk";

    std::vector<std::string> res;
    
    //  Хочется, чтобы строка работала как-то так, но проблема в том, что элементы словаря – пары, а не только значения
    // std::copy(m.begin(), m.end(), res.begin());

    // Здесь планирую получить вывод в виде всех значений словаря m
    for (std::vector<std::string>::const_iterator elem = res.begin(); elem != res.end(); ++elem)
        std::cout << *elem << std::endl;

    return 0;
}

所以从我的角度来看,问题归结为:如何在不考虑键的情况下获取字典值序列的迭代器?也就是说,要取消引用迭代器,请获取 not std::pair,但std::string在我的情况下。

PS 我用的是C++07,也就是出现在C++11中的功能对我来说是不可用的(请不要问为什么,对我来说没有必要也没有必要。)

c++
  • 2 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2020-11-26 00:54:00 +0000 UTC

VS2019 步进调试跳过循环迭代

  • 1

我在 Visual Studio 2019 上创建了一个带有循环的简单代码:

#include <iostream>

using namespace std;

int main()
{
    int x = 10;
    while (x > 5)
    {
        cout << "something";
        x -= 1;
    }

    return 0;
}

为了演示循环迭代期间计数器的变化,我通过按 F10 开始逐步调试,然后使用相同的键沿着代码行移动。当前行指针到达循环体的第一行,然后简单地跳转到return 0,设置变量的值,就好像循环已经执行过了一样。对于以前版本的 VS,没有注意到这一点。

问题:如何一步一步地执行循环的每次迭代而没有像描述的那样的间隙?

PS F9 没有帮助,它进入指令本身,事实上,它应该是。

c++
  • 1 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2020-09-17 10:49:11 +0000 UTC

Python 在 PATH 中,但不会从 cmd 运行

  • 4

为 Visual Studio 2019 安装了 Python。我也想从 cmd 使用它。python.exe添加了包含Path. 但是,当您重新启动 cmd 并键入python时,提示再次出现,Windows 启动其应用商店并提供下载 Python。

我在 Windows 10 专业版上工作。

python
  • 2 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2020-08-27 20:00:11 +0000 UTC

[] 运算符在 std::shared_ptr 中的工作原理

  • 1

我正在尝试通过其指针访问数组的元素,声明如下shared_ptr:

#include <iostream>
#include <memory>

using namespace std;

int main() 
{
    {
        shared_ptr<int> up(new int[5] {1,2,3,4,5});
        cout << up[3];
    }

    getchar();
    return 0;
}

但是,在编译时,会抛出一个错误,指出“没有[]与这些操作数对应的运算符”。

我在cppreference和 IDE 工具提示中读到[]y运算符shared_ptr采用 type ptrdiff_t,但是像这样:

#include <iostream>
#include <memory>

using namespace std;

int main() 
{
    {
        shared_ptr<int> up(new int[5] {1,2,3,4,5});
        cout << up[static_cast<ptrdiff_t>(3)];
    }

    getchar();
    return 0;
}

也因同样的错误而失败。

问题:如何正确使用此运算符,我做错了什么?

c++
  • 1 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2020-08-26 14:40:26 +0000 UTC

如何在 Crypto++ 中将字节转换为 word64?

  • 0

我正在尝试使用 Crypto++ 获取一些数据的哈希值,但该函数SHA512::Transform采用 type 的数据word64,这是 type 的同义词unsigned long long,而我的数据是一个 array char。

问题:这个库是否具有用于正确转换的内置函数,char*或者word64*您仍然需要手动编写它吗?

PS我看了文档,但是里面没有一个例子,很不方便,也不让你弄明白。

c++
  • 1 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2020-08-23 15:12:36 +0000 UTC

为什么 C++ 可以将 int* 转换为 const int* 而不能转换为 **?

  • 9

有这样的代码(什么都不做,它只是举例):

#include <iostream>

using namespace std;

int f(const int *)
{
    return 0;
}

int main() 
{
    int * x = new int;
    f(x);

    getchar();
    return 0;
}

在这里(在上面的代码中)一切正常。

但在这段代码中:

#include <iostream>

using namespace std;

int f(const int **) // Добавил ещё одну *
{
    return 0;
}

int main() 
{
    int * x = new int;
    f(&x); // Теперь передаю адрес указателя

    getchar();
    return 0;
}

Visual Studio 引发错误:

"int f(const int **)": невозможно преобразовать аргумент 1 из "int**" в "const int **"

我不明白和之间的根本区别是什么。为什么一个转换没有问题,而另一个没有?int*int**

c++
  • 1 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2020-08-15 21:59:39 +0000 UTC

为什么 C/C++ time() 函数需要一个参数?

  • 4

正如我在cppstudio上所读到的,time()当给定一个不等于 的参数时,一个函数NULL会返回该参数所指向的相同值。

问题:这个函数的参数有什么意义,如果它实际上是用它执行指针解引用?我相信这里有一个隐藏的含义,但现在我认为让这个函数不带参数会更好,这样它就可以简单地返回当前时间值。说服我向它传递一个参数而不是NULL无用的(毕竟,您可以简单地用 取消引用指针*)。

c++
  • 3 个回答
  • 10 Views
Martin Hope
V-Mor
Asked: 2020-08-01 14:09:01 +0000 UTC

C++ 中的 zstring 是什么,我在哪里可以得到它?

  • 2

Cpp核心指南的一部分讨论了神秘的字符串类型zstring以及czstring使用它们相对于经典字符串类型的好处char *。在 C++ 中找不到类似的东西。告诉我如何在您的程序中连接和使用这些类型?

PS我知道对于存储字符串,std::string. 我只是出于好奇而感兴趣,而不是出于实际使用的目的。

c++
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5