小编Fre*_*abe的帖子

如何与量子谐振子波函数进行数值积分?

如何对无限范围内的一维积分进行数值积分(采用什么数值方法,以及使用什么技巧),其中被积函数中的一个或多个函数是1d量子谐振子波函数.其中我想在谐振子基础上计算某些函数的矩阵元素:

Ñ(X)= N ñ ħ Ñ(X)EXP(-x 2 /2)
其中H Ñ(x)是厄米多项式

V m,n =\int _ { - infinity} ^ {infinity} phi m(x)V(x)phi n(x)dx

同样在存在具有不同宽度的量子谐波波函数的情况下.

问题是波函数phi n(x)具有振荡行为,这对于大n是一个问题,并且来自GSL(GNU Scientific Library)的自适应Gauss-Kronrod积分算法花费很长时间来计算,并且具有大的误差.

numerical physics numerical-analysis numerical-methods numerical-integration

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

正确捕获LoadLibrary()错误

我正在研究一种在Windows XP和Windows Vista之间的所有Windows版本上运行的C++软件.在我的代码中,我开发了一个链接标准库(Qt库)的DLL .一旦部署了我的软件,用户在他的系统上没有完全相同的Qt构建,但配置略有不同并不罕见.可能存在禁用的功能(因此它们的Qt构建不会导出相同的符号集),或者甚至可能以使库二进制文件与原始文件不兼容的方式更改库.

在某些时候,我通过LoadLibrary()调用加载我的DLL.这可以吸引用户系统上的任何Qt库.如果我很幸运,他们的Qt构建与我在开发DLL时使用的内容兼容,因此LoadLibrary()成功.但是,根据他们对Qt构建所做的更改,LoadLibrary()调用有时会失败

  • "指定的模块无法找到."; 如果他们的Qt构建包含比我的Qt构建更少的DLL,通常会发生这种情况.所以我的DLL试图加载例如QtFoo.dll但由于这个dll不是他们的Qt构建的一部分,加载我的DLL失败.
  • "无法找到指定的程序."; 如果他们更改了他们的Qt构建以便禁用某些功能,这通常会发生这种情况,这会导致导出的符号减少.

我的问题是:我怎样才能优雅地捕捉到这些错误?对,我只是使用GetLastError(),然后打印上述两个消息之一.然而,这将是多少,如果我知道更多有用的模块无法找到,或者缺少的程序.我注意到,当在资源管理器中运行一个链接缺少DLL的应用程序时,资源管理器设法产生一个很好的'由于缺少所需的库blah.dll而无法加载应用程序foo'.是否有一些API可用于获取有关LoadLibrary()调用失败原因的更多信息?

c++ windows plugins qt loadlibrary

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

如何在给出ActiveX控件的HWND的情况下获得COM接口?

我正在尝试编写一个用于监视ActiveX控件的小C(C++也很好)实用程序.鉴于我想要打印的窗口的一些HWND句柄

  1. ActiveX控件为此HWND公开了哪些属性和哪些方法
  2. 可选地,控件实现什么接口

出于测试目的,我将随机ActiveX控件(如Microsoft Slider控件)嵌入到ActiveX控件测试容器中,以便我知道控件的HWND确实是ActiveX控件的窗口.此外,我知道控件公开了哪些属性/方法,所以我可以测试我的工具.

我目前的(1)解决方案是使用HWND上的AccessibleObjectFromWindow函数来获取IDispatch.它可以工作,但似乎你总是只返回一个可访问的接口(返回的IDispatch只是IAccessible接口的IDispatch部分).我尝试将我的示例控件的实际CLSID作为第三个参数传递给AccessibleObjectFromWindow,但这也没有帮助.似乎该功能真正符合其名称 - 您始终只能获得辅助功能界面.:-)

有人知道这样的"ActiveX间谍"是否可行?如果是这样,怎么样?

c++ com winapi activex

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

是否从"this"中抛弃constness然后更改成员值会调用未定义的行为?

在回答我对另一个问题中某些答案的评论时,有人建议像

void C::f() const
{
  const_cast<C *>( this )->m_x = 1;
}
Run Code Online (Sandbox Code Playgroud)

因为修改了const对象,所以会调用未定义的行为.这是真的?如果不是,请引用C++标准(请提及您引用的标准),这样可以实现此目的.

对于它的价值,我总是使用这种方法来避免制作成员变量,mutable如果只需要一两个方法就可以写入它(因为使用mutable它可以写入所有方法).

c++ const standards-compliance const-cast

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

如何找到激活时打开给定HMENU的菜单项(如果有)?

我想用原型实现一个功能

/* Locates the menu item of the application which caused the given menu 'mnu' to
 * show up.
 * @return true if the given menu 'mnu' was opened by another menu item, false
 * if not.
 */
bool getParentMenuItem( HMENU mnu, HMENU *parentMenu, int *parentMenuIdx );
Run Code Online (Sandbox Code Playgroud)

给定一个HMENU句柄,我希望能够找出应用程序中打开了哪个菜单项(如果有)。这基本上是与GetSubMenu函数相反的。

我当前的方法是查看应用程序顶级窗口中的每个HMENU,并检查是否可以找到一个菜单项,该菜单项在激活时会打开给定的子菜单。我使用GetMenuItemCount / GetSubMenu递归执行此操作

但是,这效率很低,并且对于由上下文菜单项打开的菜单而言,它会失败。因此,我想知道:

有谁知道如何找到激活菜单后打开给定HMENU的菜单项(如果有)?

更新:我刚刚想到一个主意;应该有可能(使用SetWindowsHookEx函数)安装一个钩子,该钩子会通知菜单中发生的所有输入事件。每当检测到菜单项激活时,请记住该菜单项(由(HMENU,int)对标识)和将通过全局菜单中的菜单项打开的HMENU。然后,getParentMenuItem上面的函数可以简单地对地图进行查找。

更新的更新:上面的更新中描述的挂钩想法照旧是行不通的,因为它当然只会识别菜单项->菜单关联,这些菜单项已在某个时候被激活。

但是,这感觉有点难看,因为它要求我保持很多状态(地图);有没有更简单的可能性?

c c++ winapi mfc menu

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

什么是可移植的轻量级 C/C++ 正则表达式库?

可能的重复:
用于 C/C++ 的轻量级且可移植的正则表达式库?

我正在寻找一个 C++(C 也可以)库来匹配正则表达式。图书馆应满足以下要求:

  • 可以在 Windows(MSVC 7 及更高版本)上构建
  • 可以在 Linux(g++ 3.4 及更高版本)上构建。
  • 没有外部依赖;只允许 C/C++ 运行时和 STL
  • 对于要匹配的小(约 200 个字符)字符串,工作速度相当快

我不需要特定的正则表达式风格(POSIX、PCRE 等),所以一切都很好。

到目前为止,我考虑了这些库:

  • re2:有趣,但显然不支持 Windows 版本
  • PCRE看起来并不是非常“小”(超过 1MB 的压缩源代码)并且似乎在其构建系统中不支持 Windows。
  • Boost Regex可能符合要求,但我没有花太多时间来尝试弄清楚是否可以独立构建它

也许还有别的事吗?

c c++ regex

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

如何在没有嵌套作业对象的情况下可靠地控制子流程生命周期?

Job Objects上MSDN页面解释了:

进程只能与一个作业相关联.乔布斯不能嵌套.Windows 8 Consumer Preview和Windows Server 8 Beta中添加了嵌套作业的功能.

不幸的是,这似乎正是我所需要的.我正在处理这样的进程树:

server.exe
  |
  +--+ utility.exe
  |
  +--+ launcherA.exe
  |      |
  |      +--+ programA.exe
  |             |
  |             +--+ subProcessA.exe
  |
  +--+ launcherB.exe
         |
         +--+ programB.exe
Run Code Online (Sandbox Code Playgroud)

我尝试实现以下行为:

  1. 如果server.exe以某种方式终止(因为它崩溃,或者因为用户决定使用任务管理器终止它,或者仅仅因为它完成了执行),它会取消它下面的所有进程.我为此使用了一个工作对象.

  2. 如果由于某种原因终止launcherA.exelaunchedB.exe终止,他们会删除它们下面的所有进程.不幸的是我不能在这里使用作业对象,因为作业对象不嵌套.

事实上,我经常设法通过杀死上面树中的任意进程来创建"悬空"进程.我试图避免留下任何陈旧的过程,但到目前为止我提出的所有解决方案都依赖于监视其他进程的某种监视程序 - 但如果监视程序本身被杀死,所有希望都会丢失.

c c++ winapi

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

如何让编译器推导出模板的返回类型?

我来自Haskell,目前正在修补C++ 11以了解它能做些什么.我的一个玩具是一个小模板,试图模仿Haskell map函数,即它需要一个容器的值X和一个函数映射X到a Y并产生一个容器的值Y.我知道我可以轻松地使用std::transform,但这会破坏乐趣.

现在,我的模板看起来像这样:

template <typename T, typename U>
void myMap( const T &input,
            U &output,
            std::function<typename U::value_type (typename T::value_type)> f );
Run Code Online (Sandbox Code Playgroud)

现在,我的qustion是:是否有可能调整的签名,以便而不是按引用以输出容器(第二个参数)通过我的返回值产生一个新的容器,但编译器可以推断的返回类型?就像是

template <typename T, typename U>
U myMap( const T &input,
       std::function<typename U::value_type (typename T::value_type)> f );
Run Code Online (Sandbox Code Playgroud)

不幸的是不能称之为

std::vector<int> x = { 1, 2, 3, 4 };
std::list<bool> y = myMap( x, []( int x ) { return x % 2 == 0; } );
Run Code Online (Sandbox Code Playgroud)

......至少Clang在这里没有推断出返回类型.

我有一个想法是,由于输入容器类型和函数类型是已知的,您可以从中构造输出类型.就是这样的 …

c++ templates c++11

5
推荐指数
2
解决办法
539
查看次数

如何正确启动进程并转发stdin/stdout/stderr?

我正在使用CreateProcess启动交互式脚本解释器,并希望透明地将stdin/stdout/stderr转发给解释器.

我的第一次尝试是设置STARTUPINFO传递给CreateProcess喜欢的结构

STARTUPINFOA si = { sizeof( si ) };
si.hStdError = ::GetStdHandle( STD_ERROR_HANDLE );
si.hStdOutput = ::GetStdHandle( STD_OUTPUT_HANDLE );
si.hStdInput = ::GetStdHandle( STD_INPUT_HANDLE );
si.dwFlags |= STARTF_USESTDHANDLES;
Run Code Online (Sandbox Code Playgroud)

即我试图让脚本解释器进程使用与我的启动程序进程使用的读/写相同的句柄.这似乎不起作用(我甚至不确定那些标准句柄是否可以继承).

基于创建具有重定向输入和输出的子进程示例的第二个想法是设置三个管道以转发写入任何管道的所有数据.由于我不知道如何等待数据写入多个文件(WaitForMultipleObjects无法在管道上同步),我考虑有三个线程,每个线程ReadFile在管道上进行阻塞调用.

我怀疑这可能有点矫枉过正,所以我想知道:有更简单的方法吗?我根本不需要对从脚本解释器传递的数据进行任何处理.

作为旁注,在Linux上我只是用execvp脚本解释器进程替换当前进程,但在Windows上我需要启动脚本解释器,主线程处于挂起状态(这样我就可以进行一些字节码修补) - 所以即使因为_execvp似乎可以在Windows上使用,我显然必须使用CreateProcess.

c++ windows winapi pipe createprocess

5
推荐指数
2
解决办法
1266
查看次数

我如何'需要'由子例程返回的路径寻址的Perl库?

我可以用它来包含一个文件a.pl:

require 'a.pl';
Run Code Online (Sandbox Code Playgroud)

或者我可以用这个:

$fn = 'a.pl';
require $fn;
Run Code Online (Sandbox Code Playgroud)

但是,子程序不起作用:

sub fn { return 'a.pl'; }
require fn(); # This is a syntax error
Run Code Online (Sandbox Code Playgroud)

是否有允许这样的语法?我注意到我可以解决这个问题

sub fn { return 'a.pl'; }
require eval("fn()");
Run Code Online (Sandbox Code Playgroud)

......但那并不是非常漂亮.

perl

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