小编Dav*_*ven的帖子

事务性,内存中,对象/键/值存储库?

我有一个C++应用程序,其内存数据集由一组对象组成,每个对象都附加一个键/值集.对象和键由int id引用,值始终是单个类的实例.关键ID在对象中是唯一的,对象ID在Universe中是唯一的.

几乎是一个,map<pair<int, int>, value>除了我有额外的要求,我需要能够枚举附加到特定对象的键.这一切都需要是事务性的,所以如果出现问题我可以回滚更改.

这一切都让我觉得这是一个完全标准的问题,我应该能够获得现成的代码,但我一直无法找到任何东西.谁能:

(a)告诉我这个问题究竟叫什么,所以我知道要找什么;

(b)建议我应该看的任何代码.

请注意,我希望这只是一个内存中的数据存储,因此像Berkeley DB这样的NoSQL方法并不合适 - 我不想继续读取和写入值对象(它们是中等复杂的).

到目前为止,我发现了不做事务的简单方法(如boost_multi_index,甚至只是嵌套的STL映射),或使用持久存储的复杂方法,但两者之间没有任何内容.我可以在基本存储上实现自己的事务层,但说实话,我宁愿不这样做.

我错过了什么?

编辑:好吧,似乎没有人能够建议一个; 所以我写了自己的.这是令人惊讶的,但实际上并不是很多代码.现在它只是一个使用嵌套映射进行存储的模板类,但我正在考虑改为使用boost :: multi_index_container来简化.它没有抛光,可能充满了虫子,但如果有人认为他们可以使用它,请告诉我.

更多编辑:作为参考,事实证明,我正在寻找的Googleable名称是实体/属性/值数据库(EAV).

c++ database key-value

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

密钥不被ncurses解释

我有一个基于curses的应用程序(WordGrinder).我刚刚收到用户的错误报告,说某些键在键盘上无法正常工作.在调查中,他是对的.

有问题的键是SHIFT +光标键和一些键盘导航键,例如END.调查正在发生的事情,似乎诅咒并没有向我发送这些密钥的事件.在SHIFT +光标键的情况下,我根本没有得到任何东西,而对于END,我得到一个原始的转义序列.

这让我感到惊讶.所有其他键正在被解释并正确地转换为键盘.我期望得到KEY_SLEFTKEY_END.为什么不是我?

我已经看了一些其他应用程序,这些键可以工作,但没有发现任何明显的我做错了; 和像nano这样的应用程序做了很多邪恶的事情,比如处理他们自己的转义键解析,所以我不知道它们是否是一个很好的源代码候选者.

我正在初始化ncurses如下:

initscr();
raw();
noecho();
meta(NULL, TRUE);
nonl();
idlok(stdscr, TRUE);
idcok(stdscr, TRUE);
scrollok(stdscr, FALSE);
intrflush(stdscr, FALSE);
keypad(stdscr, TRUE);
Run Code Online (Sandbox Code Playgroud)

我使用gnome-terminal作为终端模拟器,xterm作为终端类型.Locale是UTF-8,我有这个库的ncursesw变体.

有任何想法吗?

更新:

好吧,几个月后,我尝试使用Gnome 3的gnome-terminal的Wordgrinder,并发现所有这些古怪的密钥生成有效的ncurses密钥代码.例如,SHIFT + LEFT现在生成键码393.xterm产生完全相同的结果.不幸的是,CTRL + LEFT生成密钥代码539,并且Curses文档明确指出有效密钥代码在KEY_MIN到KEY_MAX --- 257到511的范围内......

所以至少事情现在起作用,但这些奇怪的新密钥代码如何工作?他们在任何地方定义?他们肯定不在标题中.

c unix curses terminal ncurses

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

从NativeActivity获取上下文

我有一个使用NativeActivity的应用程序.我想调用Java来做一些需要Context的事情(例如,访问TelephonyManager来查询IMEI).

如何为我的活动获得有效的上下文?

ANativeActivity结构包含我的应用程序的各种有用数据,例如JavaVM和JNI环境等.它还包含指向NativeActivity的类对象的jobject.它不包含的是指向NativeActivity 实例的jobject .我也没有看到任何有用的东西struct android_app.

必须有可能这样做; 任何想法怎么样?

java-native-interface android android-ndk native-activity

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

轮询 ACTION_BATTERY_LOW

当电池电量不足时,Android 将发送 ACTION_BATTERY_LOW 意图。然后,当再次正常时,它会发送 ACTION_BATTERY_OKAY。

不幸的是,如果我的应用程序在电池电量低时启动,那么我不会收到意图;它不粘,所以我无法检测当前是否存在电池警报。ACTION_BATTERY_CHANGED粘性的,但它只告诉我当前的电池充电状态,而不告诉我系统是否已声明低电池警报。

有什么方法可以检测任意给定时刻电池电量是否低吗?

android battery

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

Android:枚举游戏手柄上的按钮

我有一个可以连接游戏手柄的Android设备(它是一个完全标准的XBox 360控制器,但我也需要支持其他品种).游戏手柄显示为带有一些模拟轴和一些按钮的InputDevice.

我需要能够查询Android以找出游戏手柄支持的按钮.有谁知道如何做到这一点?

我知道系统有这个信息,因为如果我编写一个打开的命令行应用程序/dev/input/event...并使用EVIOCGBITioctl 查询按钮,我会从内核中获得一个很好的支持按钮列表.但我无法从Android应用程序执行此操作,因为我无权直接访问输入设备.

看起来应该可以获取InputDevice的KeyCharacterMap对象并进行查询; 但看起来Android已将默认的QWERTY键盘键映射附加到游戏手柄,而不是构建一个实际匹配游戏手柄支持的键盘.这将很高兴地告诉我游戏手柄有一个Q键,它没有,并且它没有BUTTON_X键,它所做的,并且我正在接收关键事件.所以这没有帮助.

有没有办法做到这一点?

android input-devices gamepad-api

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

LLVM IR:有效地对矢量求和

我正在编写一个生成LLVM IR指令的编译器.我正在广泛地使用矢量.

我希望能够将向量中的所有元素相加.现在我只是单独提取每个元素并手动添加它们,但它让我觉得这正是硬件应该能够帮助的东西(因为它听起来像一个非常常见的操作).但似乎并没有做到这一点.

最好的方法是什么?我正在使用LLVM 3.2.

llvm llvm-ir llvm-3.2

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

内联 mathjax 公式后出现不需要的断词

我正在使用 Mathjax 将公式嵌入到 Jekyll 站点中,并使用 Kramdown 作为渲染器。

它工作得很好,只是在内联公式之后总是插入隐式分词符,这意味着换行可以在公式和标点符号之间插入换行符。这会导致这样的事情:

Where this fell down was that my representation was very limited as to what
numbers it can represent. The _smallest_ number possible was the integer `1`,
which represented $$\frac{1}{64} \approx 0.016$$; the _largest_ number was
the integer `127` (the top bit is used for the sign), which represented $$1
\frac{63}{64} \approx 1.98$$.
Run Code Online (Sandbox Code Playgroud)

...呈现如下:

在此输入图像描述

这看起来很糟糕。

有什么办法可以防止这种情况发生吗?

markdown mathjax

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

如何在 8080 上高效地进行签名比较?

我想比较两个 16 位数字并根据结果进行分支:相当于if (a<b) goto negative. 我使用的是英特尔 8080。

Z80 有一个有符号算术溢出标志,可以通过一定程度的努力来实现此目的。标准代码是:

ld de, _left
ld hl, _right
ld a, e
sub a, l
ld a, d
sbc a, h
jp po, $+5  ; branch on overflow flag not set
xor a, 0x80 ; flip sign bit
jm negative ; actually do the test
Run Code Online (Sandbox Code Playgroud)

但8080并不是Z80的严格子集,上面的代码在那里不起作用——在8080上,算术指令根据结果的奇偶校验设置P标志,结果很搞笑。

那么在 8080 上进行带符号比较的惯用方法是什么?

实际上计算溢出标志是可能的,但确实很痛苦,因为它需要对操作数和结果进行位操作,而且我的寄存器已经用完了。而且,这实际上并不是我想要的;我实际上并不关心溢出。我只是想做个比较。

(如果结果为负,我不能简单地进行减法和分支,因为这并不适用于所有情况。考虑 INT_MIN < INT_MAX。即 0x8000 - 0x7fff = 1,这显然是正数。)

comparison assembly signed intel-8080

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

正面与负面的nans

我有一些在AMD64 Linux上开发的数字代码(使用LLVM 3.2).

我最近用XCode将它移植到OSX 10.9.它运行正常,但它失败了许多单元测试:似乎Linux上返回NaN(或-NaN)的一些计算现在返回OSX,-NaN(或NaN).

我能否安全地假设正负NaN是等价的并调整我的单元测试以接受成功,或者这是更严重的错误的标志?

math floating-point nan

4
推荐指数
2
解决办法
1211
查看次数

使用超类的实例覆盖子类的实例

试图找出一些东西(实际上是在Ada中)我想出了以下代码.为什么合法?

class Superclass {
public:
    virtual void Announce() {
        printf("I am the superclass\n");
    }
};

class Subclass : public Superclass {
public:
    void Announce() {
        printf("I am the subclass\n");
    }
};

int main() {
    Superclass osuper;
    Subclass osub;

    Superclass* p = &osub;
    *p = osuper;
    osub.Announce();

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

main(),我创建一个实例Subclass,然后用一个实例覆盖它Superclass.然后,我成功调用了一个Subclass覆盖(和如此损坏)对象的方法.

我无法直接分配osub = osuper,因为这没有任何意义,但通过指针我似乎绕过了那个.上面的代码编译好没有警告,但是当我调用osub.Announce()内存时osub不再包含有效Subclass对象.

这可能不是类型安全的(甚至,通常是安全的),但编译器似乎非常高兴.为什么?

c++ types casting

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