小编Sev*_*yev的帖子

C++中的闭包

我发现自己处在一个陌生的地方,精神上.在C++项目中,我渴望关闭.

背景.有一个Document类型的类,它有一个公共Render方法,它产生一个深度调用树.有一些瞬态只在渲染过程中才有意义.现在它像常规成员变量一样驻留在类中.但是,这在某些级别上并不令人满意 - 这些数据仅在渲染调用期间有意义,为什么要一直存储它?在参数中传递它将是丑陋的 - 那里有大约15个变量.绕过一个结构会在低级方法中添加很多"RenderState - > ...".

那我想要什么?我想要世界,就像我们所做的一样.具体来说,一组变量是:

  • 可用于类中的某些方法(不是全部)
  • 只能通过名称访问(没有pState - > ......东西 - 所以重构很容易)
  • 没有在每个方法调用上复制
  • 只在方法调用期间生活并调用其调用树(假设树长大)
  • 住在一堆

我知道我可以使用C++获得一些属性 - 但不是全部.告诉我,我不会变得怪异.

哎呀,在帕斯卡尔,所有地方,嵌套功能给你所有......

那么,在C++中模拟闭包的好方法是什么,尽可能多地获得上述好处?

c++

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

AudioTrack:如何检测声音结束?

我正在AudioTrackAndroid上播放PCM WAV声音文件(另见此处).流模式,工作线程.我想知道如何检测声音的结束,以便我可以释放并释放声音AudioTrack.write()看起来,这个调用是阻塞的 - 但它会阻塞,直到所提供数据的回放完成为止?不太确定.

是我,还是这个班级的文件严重不足?如果你碰巧有一个很好的非官方指南的链接AudioTrack,我愿意看到一个.

audio android audiotrack

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

检索 RPM 的当前架构

我正在使用rpmbuild. 文件最终位于 下的架构子目录中RPMS

问题 - 如何从 shell 脚本中检索 RPM 正在使用的主机的体系结构名称?这和命令不一样arch

linux rpm rpmbuild

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

GCC警告初始化顺序与声明顺序不匹配

以下代码:

class C
{
    int a, b;
public:
    C()
    :b(0), a(0)
    {}
};
Run Code Online (Sandbox Code Playgroud)

导致GCC抱怨错误的初始化顺序.特别:

../AppSrc/MainForm.cpp: In constructor 'C::C()':
../AppSrc/MainForm.cpp:51:9: warning: 'C::b' will be initialized after
../AppSrc/MainForm.cpp:51:6: warning:   'int C::a'
Run Code Online (Sandbox Code Playgroud)

什么是重要的,为什么抱怨?这与成员之间的相互依赖性不一样,也可能不存在.原始人,呃.

哦,如何关闭此警告或至少减少它的侵略性?

编辑:有很多方法可以用C++来自拍; 成员相互依赖就是其中之一.我知道这一点,无论如何我都避免这种情况,就像我会避免空指针解除引用一样.

任意初始化顺序可以非常安全,就像上面的代码片段一样.我不满意编译器没有认识到这种情况并抱怨无论如何.我的意思是,它并没有抱怨每一个指针取消引用都没有立即进行空检查,是吗?

c++ gcc constructor

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

NDK剥离调试信息吗?

我正在构建一个带有静态库(.a)的NDK共享库作为输入之一.静态库具有GDB格式的调试信息.调试信息最终会出现在最终的.SO中吗?我怎么检查?

linux linker gdb debug-symbols android-ndk

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

WP7 Silverlight中的自制控件?

在Windows Phone 7 Silverlight中,有没有办法从头开始设计自定义控件 - 即使用自定义绘图和自定义触摸处理?我为此做了什么子类?

silverlight windows-phone-7

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

PIC 不是意味着没有搬迁吗?

我正在使用 GCC 在 ARM 上为 bada 构建一个 ELF SO。编译器选项包括 -fpic。然而,在构建的文件中,当我这样做时readelf -r,有很多重定位记录,类型如下:

  • R_ARM_RELATIVE
  • R_ARM_REL32
  • R_ARM_ABS32
  • R_ARM_GLOB_DAT
  • R_ARM_JUMP_SLOT

我在这里误解了什么?

编辑:据我所知,编译器中的 PIC 实现不使用 GOT。相反,它们使用 PC 相对寻址,其中存储的常量是从使用点到符号地址的偏移量;这是由链接器解决的。像这样,读取一个全局变量:

    ldr r12, OffsetToVar
PointOfUse:
    ldr r0, [r12, pc] 
# r0 now has the value of MyVar

#...

# At function's end...
OffsetToVar:
    .long MyVar-PointOfUse-8
# Compiler can't resolve this, since it doesn't know
# the address of MyVar, but linker can
Run Code Online (Sandbox Code Playgroud)

跨模块函数调用的类似想法。但是,当项目混合使用 ARM 和 Thumb 代码时,后者可能会失火。但我已经解决了这个问题。

assembly gcc arm elf

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

C# 进程调用,与标准输入和标准输出交互

我有一个按钮,单击它即可执行命令。该命令可能会提示输入一些标准输入,我需要响应该输入,问题是程序运行的方式可能每天都不同,所以我需要解释标准输出并相应地重定向标准输入。

我有这段简单的代码,可以逐行读取标准输出,当它看到密码提示时,它会发送标准输入,但是程序只是挂起,因为它从未看到密码提示,但是当我运行时批处理文件中有密码提示。

这是我调用来执行此测试的批处理文件:

@echo off
echo This is a test of a prompt
echo At the prompt, Enter a response
set /P p1=Enter the Password: 
echo you entered "%p1%"
Run Code Online (Sandbox Code Playgroud)

以下是从命令行运行该批处理文件的输出:

C:\Projects\SPP\MOSSTester\SPPTester\bin\Debug>test4.bat
This is a test of a prompt
At the prompt, Enter a response
Enter the Password: Test1
you entered "Test1"
Run Code Online (Sandbox Code Playgroud)

这是我用来调用挂起的批处理文件的 C# 代码片段:

    var proc = new Process();
    proc.StartInfo.FileName = "cmd.exe";
    proc.StartInfo.Arguments = "/c test4.bat";
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.RedirectStandardInput = true;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.CreateNoWindow = …
Run Code Online (Sandbox Code Playgroud)

.net c# process batch-file

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

从TStream读取到动态数组

德尔福10.1柏林.我有一个动态的记录数组.我想从一个TStream数组中读取N条记录.我认为我需要打电话ReadBuffer,但第一个论点应该是什么样的?@MyArray不起作用.

delphi pascal

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

STP中的寄存器存储顺序

在AArch64程序集中,以下行

stp x25, x30, [sp,#48]
Run Code Online (Sandbox Code Playgroud)

将x25存储在sp + 48,将x30存储在sp + 56,对吗?

assembly arm arm64

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