小编Jam*_*ese的帖子

GDB在c ++对象的构造函数中报告参数的错误地址

我正在经历一个奇怪的行为,GDB将一个字符串作为参数传递给构造函数.代码工作正常,但是当我在调试器中单步执行时,GDB似乎认为我的参数位于不同的地址.有谁知道这里发生了什么?

这是我可以创建的最简单的程序来演示问题:

--(jwcacces@neptune)--------------------------------------------(/home/jwcacces)--
--$ nl gdb_weird.cpp
     1  #include <iostream>
     2  #include <string>
     3
     4  class C
     5  {
     6  public:
     7     C(std::string str)
     8     {
     9        std::string* str_ptr = &str;
    10        std::cout << "Address of str: " << &str << std::endl;
    11        std::cout << "Address in str_ptr: " << str_ptr << std::endl;
    12        std::cout << "Value of str: " << str << std::endl;
    13     };
    14  };
    15
    16  int main(int, char*[])
    17  {
    18     std::string s("Hello, World!");
    19     C …
Run Code Online (Sandbox Code Playgroud)

c++ constructor gdb parameter-passing stdstring

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

pycharm类型检查器预期的类型dict,改为“无”

在此片段中:

from typing import Dict, Optional 
class T:
    def __init__(self):
        self.bla = {}

    def t(self) -> Dict:
        if self.bla is None:
            self.bla = {'not none': 'nope!'}
        return self.bla
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么intellij / pycharm的类型检查器认为此方法的返回值为None

带有错误消息的代码段

类型检查器似乎只有在我注释t()为be 的返回类型时才感到满意Optional[Dict],但是该方法永远不会返回None,因此我认为它不应该是可选的。

如果我的初始值改变self.bla__init__(){}它仍东西返回值None。如果我使用a str而不是a 则出现相同的错误dict

python typechecking pycharm

6
推荐指数
2
解决办法
3810
查看次数

设置了OFN_ALLOWMULTISELECT标志的GetOpenFileName()

我正在尝试使用GetOpenFileName()常用对话框调用弹出一个对话框并允许用户选择多个文件.

我已经设置了OFN_ALLOWMULTISELECT标志,以及OFN_EXPLORER设置,所以我得到了"新样式"文件选择框.

当我设置我的OPENFILENAME结构时,我将ofn.lpstrFile指向分配用于保存结果的缓冲区,并将ofn.nMaxFile设置为其长度.

我遇到的问题是,如果用户选择了缓冲区溢出的文件名这么多,则对GetOpenFileName的调用返回FALSE,然后CommDlgExtendedError()返回FNERR_BUFFERTOOSMALL.

这对于错误检测很好,我可以调高缓冲区的大小来修复它,但是用户迟早会选择足够的文件名来溢出缓冲区.

我已经看到MSDN中的注释说明如果缓冲区太小,lpstrFile缓冲区的前两个字节将包含所需的大小,但它返回的大小似乎太小(当OFN_ALLOWMULTISELECT不是'时,这是正确的' t set).另外,这需要我再次打开对话框!

我的另一个想法是创建一个对话框挂钩程序,然后在我收到CDN_SELCHANGE通知消息并动态分配正确大小的缓冲区时检测文件名的大小,但是当它将数据写入新缓冲区时,似乎记住ofn.nMaxFile的orignal值.

有没有人知道动态分配缓冲区以保存GetOpenFile调用结果而不使对话框出现两次的正确方法?


因此,事实证明,Martlark的文章是正确的.

我的2个错误是:
1)我忘了将MAX_PATH添加到钩子中的applcate大小,
2)这只适用于GetOpenFileName的unicode版本.(我是用UNICODE编译没有定义)

c c++ winapi dialog

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