小编1k5*_*1k5的帖子

解开Lua和C代码以使Lua依赖可选

我在C中编写了一个小程序来管理SQLite3中的参考书目数据库.到目前为止,这只是一个允许导入和导出BibTeX数据的命令行工具.为了使导出/导入功能更具可定制性(例如,总是在导入时将日期和月份字段组合在一起,或者在导出时跳过某些字段),这些函数用Lua编写并从C调用. 现在我希望Lua成为可选的依赖项.有什么好办法呢?即如果在编译时没有找到Lua,则回退到更基本的导入/导出功能.

现在,例如在导出时,我从SQL(sqlite3_exec)获取数据并将其直接写入回调函数中的Lua表,就像这样(stripped stackoverflow-handling ;-)):

int db_meta_cb(void *udata, int n, char **cval, char **ckey) {
  while (n-- > 0) {
    lua_pushstring(L, cval[n]);
    lua_setfield(L, -2, ckey[n]);
  };
};
Run Code Online (Sandbox Code Playgroud)

然后有一个Lua函数,它将这样一个表作为参数并漂亮地打印一个BibTeX条目.类似的导入故事:BibTeX解析器(Lex/YACC生成的C代码)编写Lua表并调用'cleanup'Lua函数,然后从同一个Lua表读取结果并将其插入数据库.

现在这在我使用Lua太多的意义上感觉不对,我猜因为数据包含(键,值) - pairs.

请注意,这个项目的一个原因是试验/了解在C中嵌入Lua,所以请不要建议(a)使用一个可用的参考书目管理器,或者(b)完全重写Python或Lua中的所有内容...... (我已经完成了btw)

c sqlite lua

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

Lua userdata数组访问和方法

我用C语言编写了一个用于Lua的userdata类型.它有一些数组类型属性和各种方法.现在,如果你是这种类型,我使用u:set(k,v)resp.u:get(k)访问数据和例如u:sort()作为方法.为此,我设置__index了一个包含这些方法的表.现在,如果我想用访问数据u[k] = v或者u[k],我需要设置__newindex__indexsetRESP get.但是其他方法再也无法访问了......

在C中处理这个问题的最佳方法是什么?我猜我需要在C中编写一个函数来注册,__index并以某种方式在那里处理它.也许检查密钥是否属于Lua方法表,如果是,则调用它.

任何帮助/提示将不胜感激.我没有找到这样的例子,虽然这对我来说似乎是很自然的事情.

编辑: 在Lua中添加了我的C版解决方案,在下面的答案中发布.这或多或少都是直接翻译,所以所有功劳都归功于@ gilles-gregoire.

以下C函数注册为__index元方法.

static int permL_index(lua_State *L) {
  struct perm **pp = luaL_checkudata(L, 1, PERM_MT);
  int i;

  luaL_getmetatable(L, PERM_MT);
  lua_pushvalue(L, 2);
  lua_rawget(L, -2);

  if ( lua_isnil(L, -1) ) {
    /* found no method, so get value from userdata. */
    i = luaL_checkint(L, 2);
    luaL_argcheck(L, 1 <= i && i <= (*pp)->n, 2, …
Run Code Online (Sandbox Code Playgroud)

c lua lua-api lua-userdata

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

在scipy.sparse矩阵中查找第一个非零列

我正在寻找稀疏矩阵(scipy.sparse.csc_matrix)中包含非零元素的第一列.实际上,第一列以i-th 开头,包含非零元素.

这是某种线性方程求解器的一部分.对于密集矩阵,我有以下内容:(相关行pcol = ...)

import numpy

D = numpy.matrix([[1,0,0],[2,0,0],[3,0,1]])
i = 1

pcol = i + numpy.argmax(numpy.any(D[:,i:], axis=0))
if pcol != i:
    # Pivot columns i, pcol
    D[:,[i,pcol]] = D[:,[pcol,i]]

print(D)
# Result should be numpy.matrix([[1,0,0],[2,0,0],[3,1,0]])
Run Code Online (Sandbox Code Playgroud)

上面应该交换第1列和第2列.如果我们设置i = 0,D则保持不变,因为第0列已经包含非零条目.

为scipy.sparse矩阵执行此操作的有效方法是什么?是否有类似物的numpy.any()numpy.argmax()功能?

python numpy scipy

2
推荐指数
1
解决办法
563
查看次数

标签 统计

c ×2

lua ×2

lua-api ×1

lua-userdata ×1

numpy ×1

python ×1

scipy ×1

sqlite ×1