标签: variable-length

如何替换va_list中的值?

我想做一些关于va_list的练习.这是我的代码.

int myscanf( char* fmt, ... ) {
  va_list ap;
  va_start ( ap, fmt );
  vfscanf ( stdin, fmt, ap );
  va_end ( ap );
}

int main() {
  int a, b;
  myscanf( "%d %d", &a, &b );
}
Run Code Online (Sandbox Code Playgroud)

如上所示,我写了一个scanf(),它是有效的.

现在我想重定向myscanf()中参数的值.

例如,我可以将fmt重定向到myscanf()中分配的空间

int myscanf( char* fmt, ... ) {
  char newFmt[10] = "%d %d";
  va_list ap;
  va_start ( ap, fmt );
  vfscanf ( stdin, newFmt, ap );
  va_end ( ap );
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试更改其他参数的值时,我感到困惑.

我可以通过va_arg()获取这些变量参数,但我不能修改它们,因为va_arg()是一个宏.

int myscanf( char* fmt, ... ) …
Run Code Online (Sandbox Code Playgroud)

c variable-length

7
推荐指数
2
解决办法
1766
查看次数

通过PHP的解包函数读取Struct中的Struct

我想知道如何通过php的unpack函数读取结构中的结构.当我得到一个IS_MCI数据包时,我检查它的类型以确保它等于ISP_MCI,然后检查NumC以找出该数据包中有多少个CompCar结构.问题是尝试通过单个函数将这些内容解压缩到一个数组中.我总是得到一个未定义的偏移量.所以,我正在寻找一些新的眼睛.

你会如何处理这个数据包?

有问题的结构是这样的:

struct IS_MCI // Multi Car Info - if more than 8 in race then more than one of these is sent
{
    byte    Size;       // 4 + NumC * 28
    byte    Type;       // ISP_MCI
    byte    ReqI;       // 0 unless this is a reply to an TINY_MCI request
    byte    NumC;       // number of valid CompCar structs in this packet

    CompCar Info[8];    // car info for each player, 1 to 8 of these (NumC)
};

struct CompCar …
Run Code Online (Sandbox Code Playgroud)

php struct variable-length packet

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

为什么C中不允许使用void f(...)?

为什么C不允许具有可变长度参数列表的函数,例如:

void f(...)
{
    // do something...
}
Run Code Online (Sandbox Code Playgroud)

c variable-length

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

需要对简洁数据结构有一个很好的概述

Cross posted:需要对简洁数据结构算法有一个很好的概述

由于我了解简洁数据结构,因此迫切需要对该领域的最新发展进行良好的概述.

我谷歌搜索并阅读了很多文章,我可以在google结果的顶部看到我的头顶请求.我仍然怀疑我错过了一些重要的事情.

以下是我特别感兴趣的主题:

  1. 二进制树的简洁编码,具有获得父,左/右子,子树中元素数的有效操作.

    这里的主要问题如下:我所知道的所有方法都假设以节点优先顺序枚举的树节点(就像在这个领域的先驱工作中Jacobson,G.J(1988).简洁的静态数据结构),它没有似乎适合我的任务.我处理深度优先布局中给出的巨大二叉树,深度优先节点索引是其他节点属性的关键,因此更改树形布局对我来说有一些成本,我想最小化.因此,有兴趣参考考虑其他BF树布局的工作.

  2. 外部存储器中的大型可变长度项目数组.数组是不可变的:我不需要添加/删除/编辑项目.唯一的要求是O(1)元素访问时间和尽可能低的开销,比直接的偏移和大小方法更好.以下是我收集的有关我的任务典型数据的一些统计信息:

    典型的物品数量 - 数亿,高达数十万;

    约30%的物品长度不超过1 ;

    40%-60%的项目长度小于8位;

    只有少数百分比的项目长度在32到255位之间(255位是限制)

    平均项目长度~4位+/- 1位.

    项目长度的任何其他分布在理论上是可能的,但所有实际上有趣的情况都具有接近上述的统计数据.

链接到任何复杂的文章,任何模糊的教程,或多或少记录的C/C++库, - 在类似的任务中对你有用的任何东西,或者你的教育猜测看起来像什么 - 所有这些都非常感谢.

更新:我忘了添加问题1:我正在处理的二叉树是不可变的.我没有改变它们的要求,我只需要以各种方式遍历它们,总是从节点移动到子节点或父节点,因此这种操作的平均成本是O(1).

此外,典型的树有毫秒的节点,不应完全存储在RAM中.

更新2如果有人感兴趣.我在https://cstheory.stackexchange.com/a/11265/9276上有几个很好的链接.

binary-tree variable-length large-data data-structures

6
推荐指数
0
解决办法
1235
查看次数

在python中的numpy数组的len()

如果我使用len(np.array([[2,3,1,0], [2,3,1,0], [3,2,1,1]])),我会回来3.

为什么len()关于哪个轴我想要多维数组的长度没有争论?这令人震惊.还有其他选择吗?

python numpy variable-length multidimensional-array

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

将动态大小的可变长度数组(VLA)初始化为0

以下代码行,在堆栈上创建一个可变长度数组:

char name[length] = {'\0'};
Run Code Online (Sandbox Code Playgroud)

生成以下编译器诊断:

error: variable-sized object may not be initialized
warning: excess elements in array initializer
warning: (near initialization for ‘name’)
Run Code Online (Sandbox Code Playgroud)

有哪些选项可用于初始化VLA?我被迫使用如下行:

memset(name, 0, sizeof(name));
Run Code Online (Sandbox Code Playgroud)

代替?

c arrays gcc initialization variable-length

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

C中参数数量可变的函数的奇数行为

我有以下带有可变数量参数的C函数,它应该char* word通过哈希表搜索并写入truefalse在文件中搜索,如果指定,则是第二个参数; 否则就是stdout.

如果我指定文件的名称,它的工作正常,问题是当我没有(例如find("foo"))时.在这种情况下,它将结果写入名为foo而不是的文件中stdout.

原因是什么?

void find(char* word, ...)
{
va_list list;
char *fname = NULL;
va_start(list, word);
FILE* f;
fname = strdup(va_arg(list, char*));
va_end(list);
if (<condition>)    // condition suited for the case in which the file name is received 
    f = fopen(fname, "a");
else
    f = stdout;
if (member(word))
    fprintf(f, "True\n");
else
    fprintf(f, "False\n");
}
Run Code Online (Sandbox Code Playgroud)

在地方的<condition>我试过fname != NULLstrlen(fname) > 0 …

c arguments stdout list variable-length

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

在循环中使用length()是否有效?

当我在MATLAB中迭代一个向量时,我有很多情况,

所以我这样做:

len = length(vector)
for i=1:len
 do_something();
end
Run Code Online (Sandbox Code Playgroud)

但这只是一种直觉,说" length()每次都要阻止调用函数".这是真的吗?或者在时间要求方面与此相同:

for i=1:length(vector)
 do_something();
end
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

performance matlab loops time-complexity variable-length

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

如何展开一个长数字(以 e+## 结尾)以展开形式显示?

所以,这可能是一个简单的问题,但我在任何地方都找不到答案。

举个例子,我有一个简单的程序,我想将 a 除以 b,如下所示:

def main():
    a = 12345678900000000
    b = 1.25

    answer = (a / b)
    print(answer)
main()
Run Code Online (Sandbox Code Playgroud)

这个特定示例的结果是 9.87654312e+15。如何让Python忽略简化我的数字并只给我整个数字?

预先感谢,抱歉,如果它真的很基本,我不会问我是否可以通过谷歌找到它。

python numbers variable-length

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

逆波兰表示法中的变长运算符(后缀)

背景:在传统的 Reverse Polish Notation 中,所有的操作符都必须有固定的长度,这使得 RPN 可以很容易地被代码评估和操作,因为每个标记、表达式和子表达式都是“自包含”的,以至于人们可以盲目地将yin替换x?y?*y?1?+to get x?y?1?+?*,这是另一个有效的表达式,它完全符合您的要求。这是一个带有命名变量支持的简单 RPN 计算器的交互式演示。请注意,演示试图展示算法的要点;它们与生产代码无关或不代表生产代码。

var rpn = prompt("Please enter RPN string, where each token is " +
  "separated by a space", "x 1 x + * 2 /").trim().split(/\s+/);

var stack = [], variables = [], values = [];
for (let i = 0, len = rpn.length|0; i < len; i=i+1|0) {
    if (/^\d*(\.\d*)?$/.test(rpn[i]) && rpn[i] !== "") {
        stack.push( rpn[i] );
    } else if (/^[a-z]$/i.test(rpn[i])) …
Run Code Online (Sandbox Code Playgroud)

algorithm rpn variadic-functions variable-length postfix-notation

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