我想做一些关于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) 我想知道如何通过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) 为什么C不允许具有可变长度参数列表的函数,例如:
void f(...)
{
// do something...
}
Run Code Online (Sandbox Code Playgroud) Cross posted:需要对简洁数据结构算法有一个很好的概述
由于我了解简洁数据结构,因此迫切需要对该领域的最新发展进行良好的概述.
我谷歌搜索并阅读了很多文章,我可以在google结果的顶部看到我的头顶请求.我仍然怀疑我错过了一些重要的事情.
以下是我特别感兴趣的主题:
二进制树的简洁编码,具有获得父,左/右子,子树中元素数的有效操作.
这里的主要问题如下:我所知道的所有方法都假设以节点优先顺序枚举的树节点(就像在这个领域的先驱工作中Jacobson,G.J(1988).简洁的静态数据结构),它没有似乎适合我的任务.我处理深度优先布局中给出的巨大二叉树,深度优先节点索引是其他节点属性的关键,因此更改树形布局对我来说有一些成本,我想最小化.因此,有兴趣参考考虑其他BF树布局的工作.
外部存储器中的大型可变长度项目数组.数组是不可变的:我不需要添加/删除/编辑项目.唯一的要求是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上有几个很好的链接.
如果我使用len(np.array([[2,3,1,0], [2,3,1,0], [3,2,1,1]])),我会回来3.
为什么len()关于哪个轴我想要多维数组的长度没有争论?这令人震惊.还有其他选择吗?
以下代码行,在堆栈上创建一个可变长度数组:
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函数,它应该char* word通过哈希表搜索并写入true或false在文件中搜索,如果指定,则是第二个参数; 否则就是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 != NULL和strlen(fname) > 0 …
当我在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)
谢谢你的帮助!
所以,这可能是一个简单的问题,但我在任何地方都找不到答案。
举个例子,我有一个简单的程序,我想将 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忽略简化我的数字并只给我整个数字?
预先感谢,抱歉,如果它真的很基本,我不会问我是否可以通过谷歌找到它。
背景:在传统的 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
variable-length ×10
c ×4
python ×2
algorithm ×1
arguments ×1
arrays ×1
binary-tree ×1
gcc ×1
large-data ×1
list ×1
loops ×1
matlab ×1
numbers ×1
numpy ×1
packet ×1
performance ×1
php ×1
rpn ×1
stdout ×1
struct ×1