小编z32*_*7ul的帖子

C++ std :: tuple破坏顺序

有一条规则说明std :: tuple的成员被破坏了吗?

例如,如果Function1返回一个std::tuple<std::unique_ptr<ClassA>, std::unique_ptr<ClassB>>to Function2,那么我可以确定(当Function2剩下的范围时)ClassB第二个成员ClassA引用的实例在第一个成员引用的实例之前被销毁吗?

std::tuple< std::unique_ptr< ClassA >, std::unique_ptr< ClassB > > Function1()
{
    std::tuple< std::unique_ptr< ClassA >, std::unique_ptr< ClassB > > garbage;
    get<0>(garbage).reset( /* ... */ );
    get<1>(garbage).reset( /* ... */ );
    return garbage;
}

void Function2()
{
    auto to_be_destroyed = Function1();
    // ... do something else

    // to_be_destroyed leaves scope
    // Is the instance of ClassB destroyed before the instance of ClassA?
}
Run Code Online (Sandbox Code Playgroud)

c++ std c++11 stdtuple

46
推荐指数
3
解决办法
2752
查看次数

VBA中引用/指针的一个很好的替代品?

你能推荐我在VBA中作为参考或指针类型的一个很好的替代品吗?我一直在努力与这样的表达:

dblMyArray( i * lngDimension0 + j * lngDimension1 + k * lngDimension2, l * lngDimension3 + m * lngDimension4 ) = dblMyArray( i * lngDimension0 + j * lngDimension1 + k * lngDimension2, l * lngDimension3 + m * lngDimension4 ) + 1
Run Code Online (Sandbox Code Playgroud)

如果我想在例如C++中的多维数组中累积值,我可以这样写:

double& rElement = dblMyArray[ i * lngDimension0 + j * lngDimension1 + k * lngDimension2 ][ l * lngDimension3 + m * lngDimension4 ];
rElement += 1;
Run Code Online (Sandbox Code Playgroud)

要么

double* pElement = &dblMyArray[ i * lngDimension0 …
Run Code Online (Sandbox Code Playgroud)

vba excel-vba access-vba word-vba powerpoint-vba

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

PowerShell标准错误输出中的随机换行符

我想用HandBrake将许多.iso文件转换为.mp4,所以我试图使用命令行界面.我更愿意在powershell而不是批处理文件中编写我的脚本.但是,如果我使用PowerShell,则标准错误包含随机位置的换行符.

为了排除故障,我在PowerShell和批处理中创建了一个简化的脚本.

电源外壳:

& "$Env:ProgramFiles\HandBrake\HandBrakeCLI.exe" @(
    '--input', 'V:\',
    '--title', '1', '--chapter', '1',
    '--start-at', 'duration:110', '--stop-at', 'duration:15',
    '--output', 'pmovie.mp4',
    '--format', 'av_mp4'
    ) > ".\pstd.txt" 2> ".\perr.txt"
Run Code Online (Sandbox Code Playgroud)

批处理文件:

"%ProgramFiles%\HandBrake\HandBrakeCLI.exe" --input V:\ --title 1 --chapter 1 --start-at duration:110 --stop-at duration:15 --output ".\cmovie.mp4" --format av_mp4 > ".\cstd.txt" 2> ".\cerr.txt"
Run Code Online (Sandbox Code Playgroud)

两个脚本都创建相同的.mp4文件,区别仅在于它们创建的标准错误输出:

电源外壳:

HandBrakeCLI.exe : [10:41:44] hb_init: starting libhb thread
At C:\Test\phandbrake.ps1:1 char:2
+ & <<<<  "$Env:ProgramFiles\HandBrake\HandBrakeCLI.exe" @(
    + CategoryInfo          : NotSpecified: ([10:41:44] hb_i...ng libhb thread 
   :String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

[10:41:44] thread 541fc20 …
Run Code Online (Sandbox Code Playgroud)

powershell powershell-1.0 io-redirection redirectstandardoutput handbrake

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

将 C++ 预处理器宏替换为可以初始化结构的宏

我正在使用 WinAPI 的CreateDialogIndirect函数,该函数对第二个参数指向的DLGTEMPLATEDLGTEMPLATEEX结构有一些要求。我的代码运行良好,但是,我想摆脱宏#define

我创建了一个简化的示例来重点关注宏。这是一个带有宏的工作程序,可以编译它,并输出预期的内容:

#include <iostream>

int wmain()
{
#define TITLE L"Title"
    struct {
        wchar_t title[ sizeof( TITLE ) / sizeof( TITLE[ 0 ] ) ];
        int font_size;
    } s = {
        TITLE,
        12,
    };

    std::wcout
        << L"s.title = "     << s.title     << std::endl
        << L"s.font_size = " << s.font_size << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 Visual Studio 2022 中,我在宏处看到三个点#define,并且可以阅读以下工具提示:

  • 宏可以转换为 constexpr
  • 显示潜在的修复
  • 将宏转换为 constexpr

我希望看到它转换为避免宏的东西,所以我点击它,代码更改为:

#include <iostream>

int wmain() …
Run Code Online (Sandbox Code Playgroud)

c++

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

Timsort 的合并模式

我想了解 Timsort。包括所有细节,所以像“只需在 Java 或 Python 中调用”这样的答案.sort()不是我想要的。

我已经阅读了Wikipedia 文章Java 实现CPython 实现、这些来源提到的listsort.txt以及出版物 listsort.txt 参考资料:近乎最优的合并排序:最佳地适应现有运行的快速、实用的排序方法。我还浏览了近乎最优归并排序的一些参考资料,即几何问题的缩放和相关技术数据结构的统一视图以及查找最近共同祖先的快速算法;我不会说我完全理解后三个,但我很确定他们没有回答我的问题。

我了解大多数子算法:运行计数、反转运行、二进制插入排序、合并(保存头/尾部分)、驰骋。请不要试图解释这些,我知道它们是什么、如何以及为什么。

我怀念的是合并模式。实际上,我通过维护运行堆栈并根据反复检查不变量来决定何时合并来了解它的工作原理;我还看到目标是:适应自然运行、实现排序稳定性、平衡合并、利用时间局部性并保持算法简单。但我不明白为什么重新建立这些不变量会产生有效的算法。

文件 listsort.txt 指出(第 346 行):

该代码现在使用“powersort”合并策略:“近乎最优的合并排序:快速、实用的排序方法,最佳地适应现有运行”J. Ian Munro 和 Sebastian Wild

我理解 Munro 和 Wild 的 powersort 是如何工作的,并且我发现他们的解释涉及“近乎最优的字母树”和“二分启发式”和“沿着笛卡尔树边缘的移动”就足够了。

我无法理解 powersort 和 Timsort 合并模式之间的联系。

显然,它们是不同的:

  • powersort 考虑节点功率,而 Timsort 考虑游程长度,
  • powersort 有一个不变量:B <= A,而 Timsort 有两个:Y > X 和 Z > Y + X(其中 X 是最近读取的运行,它在数组中具有最高的起始索引,并且位于顶部或将放置在堆栈的顶部,A 是运行 Y 和 X 之间的节点), …

python java sorting algorithm timsort

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

glibc 文档中缺少格式说明符 %F

我偶然发现GNU C 库文档中存在以下缺陷:

\n
\n

\xe2\x80\x98%f\xe2\x80\x99

\n

以正常(定点)表示法打印浮点数。有关详细信息,请参阅浮点转换。

\n
\n

%F尽管根据C99 标准,但它没有在任何地方提到:

\n
\n

F 转换说明符分别生成 INF、INFINITY 或 NAN,而不是 inf、infinity 或 nan。

\n
\n

一个简单的例子来测试这一点:

\n
double inf = 1.0 / 0.0;\nprintf( "Testing on %ld.%ld, %%f: %f and %%F: %F.\\n", __GLIBC__, __GLIBC_MINOR__, inf, inf );\n
Run Code Online (Sandbox Code Playgroud)\n

这输出:

\n
Testing on 2.24, %f: inf and %F: INF.\n
Run Code Online (Sandbox Code Playgroud)\n

所以它应该按其应有的方式工作,而不是像文档所说的那样。

\n

F我在想为什么文档中没有大写功能。是否有意义?是的。符合标准吗?是的。是否能够实施?是的。所以,我不明白原因。

\n

是否有约定将标准规定的问题自动视为库文档的一部分?使用安全吗%F以 printf 格式

\n

c printf glibc

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

全局命名空间的C++别名

我使用Visual Studio在C++ for Windows中创建程序.我想知道编写Windows API函数(包括宏)的最佳方法是什么,就好像它们是命名空间的一部分,例如WinAPI.我曾经定义一个空的宏,所以预处理器删除它,只有::将留在代码中,这意味着全局范围:

#define WinAPI
BOOL bResult = WinAPI::SetWindowText( hwnd, L"Test Text" );

// After preprocessing:
BOOL bResult = ::SetWindowText( hwnd, L"Test Text" );
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了一些问题,比如ListBox_AddString; 而且我不认为我的解决方案很整洁.

我想首先看一下函数调用是否是Windows API的一部分,或者是我的一个具有类似名称的函数.是否存在以某种方式使用命名空间而不是空宏的解决方案?

更新

我试图实现Richard Hodges的提议(使用Visual Studio 2010):

namespace MyNamespace
{
    int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR szCmdLine, int iShowCmd )
//...
}
Run Code Online (Sandbox Code Playgroud)

首先我收到LNK1561:必须定义入口点,所以我设置Project Properties> Linker> Linker> Advanced> Entry Point = MyNamespace :: wWinMain

然后我收到了LNK1221:一个子系统无法推断,必须定义,所以我设置项目属性>链接器>链接器>系统>子系统= Windows(/ SUBSYSTEM:WINDOWS)

现在它编译,链接和运行,但iShowCmd是0x7efde000(我无法解释的值)而不是通常的(SW_SHOW = 0x00000001).

怎么了?

c++ namespaces

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

setjmp / longjmp 没有跳到我认为应该跳的地方

我想了解 setjmp / longjmp 的工作原理,因此我创建了一个示例程序,其中例程 A 打印偶数,例程 B 打印奇数,并且它们使用 longjmp 相互跳转:

#include <setjmp.h>
#include <stdio.h>

#define COUNTER_BEGIN 0
#define COUNTER_END   6

void routineA( jmp_buf* pEnvA, jmp_buf* pEnvB );
void routineB( jmp_buf* pEnvA, jmp_buf* pEnvB );

int main() {
    const char message[] = "main      [ &envA=0x^%016lx &envB=0x^%016lx ]  -- %s\n";
    jmp_buf envA;
    jmp_buf envB;

    fprintf( stdout, message, &envA, &envB,
             "Started; Before calling routineA" );
    routineA( &envA, &envB );
    fprintf( stdout, message, &envA, &envB,
             "After routineA returned; Exiting" );

    return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c setjmp

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