标签: c

C库用于压缩顺序正整数

我有一个非常普遍的问题,就是为磁盘内的字符串数组创建一个索引.简而言之,我需要将每个字符串的位置存储在磁盘表示中.例如,一个非常天真的解决方案是索引数组,如下所示:

uint64 idx [] = {0,20,500,1024,...,103434};

其中第一个字符串位于第0位,第二个字符串位于第20位,第三个位于第500位,第n个位于第103434位.

这些位置总是按顺序排列为非负64位整数.虽然数字可能会有所不同,但实际上我认为典型的差异在2 ^ 8到2 ^ 20的范围内.我希望这个索引在内存中是mmap的,并且将随机访问这些位置(假设均匀分布).

我正在考虑编写自己的代码来进行某种块增量编码或其他更复杂的编码,但在编码/解码速度和空间之间有很多不同的权衡,我宁愿把工作库作为一个起点甚至可能在没有任何自定义的情况下解决问题.

任何提示?一个c库是理想的,但是c ++也可以让我运行一些初步的基准测试.

如果您还在关注,还有一些细节.这将被用来建立类似于CDB库(http://cr.yp.to/cdb/cdbmake.html顶部的库CMPH()http://cmph.sf.net).简而言之,它适用于基于磁盘的大型只读关联映射,内存中的索引很小.

既然是一个图书馆,我没有在输入控件,但我要优化典型的用例有数亿值的,在几KB平均值尺寸范围在2 ^ 31最大值.

为了记录,如果我没有找到准备使用的库,我打算在64个整数的块中实现delta编码,其中初始字节指定到目前为止的块偏移量.块本身将用树索引,给我O(log(n/64))访问时间.有太多其他选择,我宁愿不讨论它们.我真的很期待使用代码而不是如何实现编码的想法.我很乐意与大家分享我工作后的所作所为.

感谢您的帮助,如果您有任何疑问,请告诉我.

c database compression encoding data-structures

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

取消引用整数数组的指针

我有一个指向10的整数数组的指针.取消引用这个指针应该给我什么?

例如:

#include<stdio.h>

main()
{
    int var[10] = {1,2,3,4,5,6,7,8,9,10};
    int (*ptr) [10] = &var;

    printf("value = %u %u\n",*ptr,ptr);  //both print 2359104. Shouldn't *ptr print 1?


}
Run Code Online (Sandbox Code Playgroud)

c pointers

12
推荐指数
2
解决办法
3万
查看次数

在C中编写可移植的命令行包装器

我正在编写一个名为perl5i的perl模块.它的目标是在一个模块中修复一大堆常见的Perl问题(使用许多其他模块).

要在命令行上为一个内容调用它,你会写:perl -Mperl5i -e 'say "Hello"' 我认为这太冗长,所以我想提供一个perl5i包装器,这样你就可以写了perl5i -e 'say "Hello"'.我也希望人们能够编写脚本,#!/usr/bin/perl5i因此它必须是一个已编译的C程序.

我想我所要做的就是将"-Mperl5i"推到参数列表的前面并调用perl.这就是我尝试过的.

#include <unistd.h>
#include <stdlib.h>

/*
 * Meant to mimic the shell command
 *     exec perl -Mperl5i "$@"
 *
 * This is a C program so it works in a #! line.
 */

int main (int argc, char* argv[]) {
    int i;
    /* This value is set by a program which generates this C file */
    const char* perl_cmd = "/usr/local/perl/5.10.0/bin/perl";
    char* perl_args[argc+1]; …
Run Code Online (Sandbox Code Playgroud)

c windows perl command-line

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

在C左移(char)0xFF由8并将其转换为int

在(char)0xff的左移8,并将其转换为int,我们得到-256或0xffffff00.有人可以解释为什么会这样吗?

#include <stdio.h>
int main (void)
{   
    char c = 0xff;
    printf("%d %x\n", (int)(c<<8),(int)(c<<8));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

-256 ffffff00
Run Code Online (Sandbox Code Playgroud)

c signed char shift

12
推荐指数
2
解决办法
2万
查看次数

评估数学表达式

我正在寻找一种可以用来评估数学表达式的算法.我已经看到了几个关于SO的问题,但是答案是C#/ Delphi或python特有的.我需要用C编写算法:)

我试图解决的问题是给用户输入,如

3*(2*x + 1)/x
Run Code Online (Sandbox Code Playgroud)

我可以评估任何x值的表达式.

有什么算法可以做到这一点?如果您想建议一个已经这样做的库,那么我更喜欢C库

谢谢

c parsing

12
推荐指数
3
解决办法
7371
查看次数

有哪些方法来模块化C代码?

您知道在项目规模扩大时模块化C代码有哪些方法,实践和约定?

c encapsulation namespaces module scoping

12
推荐指数
3
解决办法
2618
查看次数

来自x86_64 Linux中的内联asm的Syscall?

为什么打印垃圾而不是优雅地退出我的程序?我在BSD上以这种方式使用系统调用,我想知道在Linux中它需要什么才能使它工作.

int
main(int argc, char **argv)
{
    __asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

c linux assembly x86-64 inline-assembly

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

什么应该发生在size_t的否定(即`-sizeof(struct foo)`))?

我正在处理一些包含表单表达式的代码

-(sizeof(struct foo))
Run Code Online (Sandbox Code Playgroud)

即a的否定,size_t我不清楚编译器在看到这个时C和C++标准需要什么.具体来说,从此处和其他地方四处查看,sizeof返回类型的无符号整数值size_t.当否定无符号整数时,我找不到任何指定行为的明确引用.有没有,如果有的话,它是什么?

编辑:好的,所以关于无符号类型的算术有一些很好的答案,但事实并非如此.如果否定,它是在无符号整数上运行,还是转换为有符号类型并对其执行某些操作?从标准中预期的行为是"想象它是相似幅度的负数,然后对无符号值应用'溢出'规则"?

c c++ unsigned sizeof size-t

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

C++:将double转换为字符串的最佳方法是什么?

实现同样目标的最佳方式是什么?

void foo(double floatValue, char* stringResult)
{
    sprintf(stringResult, "%f", floatValue);
}
Run Code Online (Sandbox Code Playgroud)

c c++

12
推荐指数
3
解决办法
8886
查看次数

如果我有一个void指针,我该如何将int放入其中?

我有一个任意值的数组,所以我将它定义为一个void指针数组,所以我可以指向任何类型的信息(如int字符数组等).但是,我如何实际分配int给它?

以这些初始化为例:

void* data[10];
int x = 100;
Run Code Online (Sandbox Code Playgroud)

我的直觉会想到这一点,但这会产生编译错误:

data[0] = malloc(sizeof(int));
*(data[0]) = x;
Run Code Online (Sandbox Code Playgroud)

我也考虑过使用&x,但我会考虑一个局部变量的地址,这个(据我的理解)将在退出程序后被清除.所以,如果我有一个局部变量x,我如何正确地将它变为void指针类型的变量?

c pointers void-pointers

12
推荐指数
2
解决办法
2万
查看次数