这似乎是一个相当常见的模式,例如在hexchat中(可能无法编译,另请参阅插件文档.还请注意,这些文档hexchat_plugin_get_info尚未永久使用,因此我为了简单起见省略了它):
static hexchat_plugin *ph;
static int timer_cb(void *userdata) {
if (hexchat_set_context(ph, userdata)) { /* <-- is this line UB? */
/* omitted */
}
return 0;
}
static int do_ub(char *word[], char *word_eol[], void *userdata) {
void *context = hexchat_get_context(ph);
hexchat_hook_timer(ph, 1000, timer_cb, context);
hexchat_command(ph, "close"); /* free the context - in practice this would be done by another plugin or by the user, not like this, but for the purposes of this example this …Run Code Online (Sandbox Code Playgroud) 我想,为什么他们有一个悬摆指针向别人解释和自由是如何工作(以及指针的值,因此是通过按值),但我认为我需要一种方法来打印指针与工作不" t"不确定"(如同printf("%p", ptr)).
memcpy会不会这样做?
char buf1[sizeof(char *)];
char buf2[sizeof(char *)];
char *malloced = malloc(10);
memcpy(buf1, &malloced, sizeof(char *));
free(malloced);
memcpy(buf2, &malloced, sizeof(char *));
for (int i=0; i<sizeof(char *); i++) {
printf("%hhd %hhd / ", buf1[i], buf2[i]);
}
Run Code Online (Sandbox Code Playgroud) (也发布在Lua邮件列表上)
所以我一直在编写深度复制算法,我想测试它们是否按照我希望的方式工作.虽然我可以访问原始 - >复制映射,但我想要一个通用的深度比较算法,它必须能够比较表键(表作为键?).
我的深拷贝算法在这里是可用的:https://gist.github.com/SoniEx2/fc5d3614614e4e3fe131(它不是很有条理,但有3个,一个使用递归调用,另一个使用todo表,另一个模拟一个调用堆栈(以非常丑陋但5.1兼容的方式))
递归版:
local function deep(inp,copies)
if type(inp) ~= "table" then
return inp
end
local out = {}
copies = (type(copies) == "table") and copies or {}
copies[inp] = out -- use normal assignment so we use copies' metatable (if any)
for key,value in next,inp do -- skip metatables by using next directly
-- we want a copy of the key and the value
-- if one is not available on the copies …Run Code Online (Sandbox Code Playgroud) 所以我正在使用 github 页面,目前没有办法强制使用 HTTPS,所以我有一个“聪明”的想法,将 HSTS 标头放在元标记上。因此,我将其添加到页面中:
<meta http-equiv="Strict-Transport-Security" content="max-age=31536000" />
Run Code Online (Sandbox Code Playgroud)
Aaand它没有用。为什么它不起作用?!乙:
我的浏览器是 Firefox Nightly。
我编写了这个C代码,我假设它提供了可移植的标记指针:
typedef struct {
char tag[2];
int data;
} tagged_int;
#define TAG(x,y) (&(x)->tag[(y)])
#define UNTAG(x) (&(x)[-*(x)])
int main(void) {
tagged_int myint = {{0,1}, 33};
tagged_int *myptr = &myint;
char *myint_tag_1 = TAG(myptr,1);
char *myint_tag_0 = TAG(myptr,0);
char tag_1 = *myint_tag_1;
char tag_0 = *myint_tag_0;
tagged_int *myint_1 = UNTAG(myint_tag_1);
tagged_int *myint_0 = UNTAG(myint_tag_0);
}
Run Code Online (Sandbox Code Playgroud)
但是,我很好奇它是否真的可携带.
虽然数组操作部分是可移植的,但是转换是char *可struct *移植的,假设char *指的是第一个字段/元素struct *?(这很遗憾地输出编译器警告,但我猜你会得到带有"正常"标记指针的那些......)
我有一个,&[u8]并希望把它变成一个&[u8; 3]没有复制.它应该引用原始数组.我怎样才能做到这一点?
假设我有一个i来自外部来源的变量:
int i = get_i();
Run Code Online (Sandbox Code Playgroud)
假设i是INT_MIN和的补码表示形式,是-i不确定的吗?
我有一个 SQLite 查询,如:
SELECT max(e), url, branch FROM (SELECT max(T1.entry) e, T1.url, T1.branch FROM repo_history T1
WHERE (SELECT active FROM repos T2 WHERE url = T1.url AND branch = T1.branch AND project = ?1)
GROUP BY T1.url, T1.branch
UNION
SELECT null, T3.url, T3.branch FROM repos T3 WHERE active AND project = ?1 )
GROUP BY url ORDER BY e
Run Code Online (Sandbox Code Playgroud)
请注意,该?1参数出现了两次。无论如何,在某些情况下,它可以为空(None在 python 中,据我所知,NULL在 SQLite 中变成了)。这是一个问题,因为我不了解 null 处理,但基本上我没有得到任何回报。
那么,我如何处理where "project" = ?1什么时候?1是 …
我正在查看git docs,但没有地方说“ HEAD”是无效的分支名称。但是,尝试建立一个名为“ HEAD”的分支会给我:
fatal: 'HEAD' is not a valid branch name.
Run Code Online (Sandbox Code Playgroud)
如果在任何地方都有记录,则看不到。就文档而言,我应该能够做到吗?但是我为什么不能呢?
这是一个相对简单的问题.PCRE(没有扩展功能,例如能够调用主机的功能)可以进行基本算术吗?也就是说,我可以使用PCRE对一元非负整数进行加,减,除和乘以?如果是这样,怎么样?(注意:我可以控制输入,正则表达式和替换字符串)
我有这种整洁的数据格式,最好用对象作为键表示.所以我尝试使用以下JSON:
{
"blocks": {
"stone": {
{
"variant": ["bricks", "smooth"]
}: {
"sound": "guitar",
"particle": "guitar",
}
},
"dirt": {
{
"variant": "dirt"
}: {
"sound": "square",
"particle": "note",
"volume": 0.5
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它给了我一个JsonSyntaxException.我正在使用GSON btw.我怎样才能做到这一点?
数据结构:
import java.util.*;
public class Instrument {
private final String name;
private final String particle;
private final float volume;
public Instrument(String name, Optional<String> particle, Optional<Float> volume) {
this.name = name;
this.particle = particle.orElse("note");
this.volume = volume.orElse(1.0f);
}
/* getters and stuff */
} …Run Code Online (Sandbox Code Playgroud) 我有一个排序v: Vec<EventHandler<T>>,我想在保持排序的同时插入一个元素.最有效的方法是什么?Rust似乎没有内置的方法来做到这一点.
EventHandler<T> 如下:
struct EventHandler<T: Event + ?Sized> {
priority: i32,
f: fn(&mut T),
}
Run Code Online (Sandbox Code Playgroud)
由于排序如何工作,插入和排序将是低效的,具有O(n log n)时间复杂性和2*n分配成本.
我一直在研究排序算法.到目前为止,我发现的所有排序算法要么依赖于已知长度(几乎所有排序算法.我不能使用它们,因为"正确"长度是O(n)),或者比快速排序慢(例如插入分类).
在Lua中,有两个长度概念:
我已经研究过heapsort,但是heapsort需要构建一个堆,然后排序.它不能同时作为单个操作,这意味着它仍然存在O(n)长度问题.
使用插入排序,您只需运行插入排序算法,直到您点击第一个nil.这只排序表的"正确序列"部分(即,从1到n的键没有任何nil值),但插入排序比quicksort慢.
是否有任何就地排序算法,如插入排序,不依赖于长度,但性能可与快速排序相媲美?
示例插入排序代码(在维基百科的帮助下):
function isort(t)
-- In-place insertion sort that never uses the length operator.
-- Stops at the first nil, as expected. Breaks if you use "for i = 1, #t do"
for i in ipairs(t) do
local j = i
while j > 1 and t[j-1] > t[j] do
t[j], t[j-1] = t[j-1], t[j]
j = j - 1
end
end
end
local …Run Code Online (Sandbox Code Playgroud)