我正在用C语言编写一个shell.虽然我不希望其他人使用它,但我还是想练习编写可维护且组织良好的代码.我在一些函数中注意到了以下模式,所以在它固化之前,我希望它能够经过全面审查.
例如,请考虑以下功能:
int foo(int param...) {
// declare variables
struct bar *a, *b, *c;
// do some work
a = bar_creator();
b = bar_modifier(a);
c = bar_modifier(b);
// cleanup
free(a);
free(b);
free(c);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
注意事项:
三个阶段:声明,启动/修改,清理
新分配的结构通常从函数返回,作为其他对象的修改副本
不需要大量的对象,因此内存使用不是问题
目前,这三个部分相对不同.这允许我匹配第一个和最后一个部分并确保一切都被考虑在内.现在我想知道一个更好的风格是否可以在不需要时立即解除分配.这样做的动机可能是最小化代码部分有意义的上下文.
您对资源重新分配的方法是什么?给定策略的优点是什么?
澄清关于函数行为的任何混淆:
/**
* returns a newly created bar
*/
struct bar *bar_creator();
/**
* takes a bar, and returns a _new_ copy of it that may have been modified.
* the original is not modified.
*/
struct bar …Run Code Online (Sandbox Code Playgroud) 我一直在为我的一个作业编写一些简单的测试用例,并使用宏构建了一些测试套件.我有run-test和run-test-section等.我想run-test-section采取一些参数作为run-test调用,并计算PASS和FAIL的数量.
run-test 在PASS上返回T,在FAIL上返回NIL.
我现在要做的是编写一个接受&REST参数的宏,并调用该列表的每个元素,最后返回TRUE值的数量.
这就是我目前拥有的:
(defmacro count-true (&rest forms)
`(cond
((null ,forms)
0)
((car ,forms)
(1+ (count-true (cdr ,forms))))
(T
(count-true (cdr ,forms)))))
Run Code Online (Sandbox Code Playgroud)
然而,这使我的REPL陷入无限循环.有人可能会指出我如何能更有效地操纵这些论点.这甚至是个好主意吗?有更好的方法吗?
编辑:
如在响应中所指出的,在这种情况下不需要宏.使用内置COUNT就足够了.但是,在递归宏调用的响应中有有用的信息.
我一直在研究不明确支持我的操作系统的设备库的实现.特别是,我有一个反汇编的DLL,以及相当数量的支持源代码.现在,函数表/导出表是如何构建的?
我的理解是该部分的第一个结构.data是一个RVAs表.接下来是通过索引链接到第一个地址表的字符串表.这对我来说很有意义,因为链接器可以在符号和地址之间进行转换.
序数引用的函数如何适合这张图片?如何知道哪个函数具有这样的序数,以及链接器如何解决这个问题呢?换句话说,鉴于其他一些DLL导入SOME_LIBRARY_ordinal_7,链接器如何知道要使用哪个函数?
谢谢,全部!
编辑 更多信息......
我正在使用FTDI库,并希望解决正在调用的函数.特别是,我看到类似的东西:
extern FTD2XX_Ordinal_28: near
我如何确定引用哪个函数,以及链接器如何执行此操作?
我们在AI课程中一直使用Lisp.我收到的作业涉及搜索和生成树状结构.对于每个作业,我最终都写了类似的东西:
(defun initial-state ()
(list
0 ; score
nil ; children
0 ; value
0)) ; something else
Run Code Online (Sandbox Code Playgroud)
并围绕这些"状态"构建我的函数,这些状态实际上只是具有一些松散定义结构的嵌套列表.
为了使结构更加严格,我尝试编写访问器,例如:
(defun state-score ( state )
(nth 2 state))
Run Code Online (Sandbox Code Playgroud)
这适用于读取值(这应该是我在一个功能良好的世界中需要做的全部.但是,随着时间的推移,我开始疯狂地破解,有时我想要一个可变的结构).我似乎无法SETF返回...的东西(地方?值?指针?).
我得到一个类似的错误:
(setf (state-score *state*) 10)
Run Code Online (Sandbox Code Playgroud)
有时我似乎有更多的运气将accessor/mutator写成宏:
(defmacro state-score ( state )
`(nth 2 ,state))
Run Code Online (Sandbox Code Playgroud)
但是我不知道为什么这应该是一个宏,所以我当然不应该把它写成一个宏(除了有时候它有效.巧合编程很糟糕).
建立这样的结构的适当策略是什么?
更重要的是,我在哪里可以了解到这里发生的事情(哪些操作以什么方式影响记忆)?
我正在为事件日志开发一个纯Python文件解析器,其大小范围可以从千字节到千兆字节.是否有一个模块将显式.open()/ .seek()/ .read()/ .close()调用抽象为一个类似缓冲区的简单对象?你可能会认为这是反过来的StringIO.我希望它可能看起来像:
with FileBackedBuffer('/my/favorite/path', 'rb') as buf:
header = buf[0:0x10]
footer = buf[0x10000000:]
Run Code Online (Sandbox Code Playgroud)
该mmap模块可满足我的要求; 但是,我有两个保留意见,我会感谢您的反馈意见:
mmap能否做到这一点.mmap构造取决于OS是不同的.这让我犹豫不决,因为我正在寻找编写漂亮的跨平台代码,而不想在操作系统细节中捣乱.如果我需要,我会这样做,但是这引发了一个警告,我可能会在错误的地方寻找.如果mmap是任务的正确模块,它如何处理这两点?如果不是,那么什么是合适的模块?
我一直在讨论一些x86程序集,因为它出现在我的许多课程中.特别是,我想将比较和交换(CAS)作为用户函数公开.这是为了我可以实现自己的锁.
我在Intel CPU上使用Linux 2.6.31和GCC 4.1.1.
我有以下内容:
// int cmpxchg(int *dest, int expected, int update)
.globl cmpxchg
cmpxchg:
pushl %ebp
movl %esp, %ebp
// edx holds dest
movl 8(%ebp), %edx
// eax holds expected value
movl 12(%ebp), %eax
// ecx holds the new value
movl 16(%ebp), %ecx
// cmpxchg dest_addr, exp_value
// compare to %eax is implicit
lock cmpxchgl %edx, %ecx
leave
ret
Run Code Online (Sandbox Code Playgroud)
这是在*.s文件中,我用我的驱动程序编译.当我包括该行
lock cmpxchgl %edx, %ecx
Run Code Online (Sandbox Code Playgroud)
并执行,我收到"非法指令"错误.当我用线替换
cmpxchgl %edx, %ecx
Run Code Online (Sandbox Code Playgroud)
我的代码似乎运行正常.
首先,有lock必要吗?我不确定是否cmpxchgl是天然的原子,所以我曾经lock确定过.作为用户地计划,我甚至被允许使用lock …
我正在开发一个适用于32位和64位体系结构的PE文件的库。一些结构将同时引用虚拟地址(例如VA ImageBase)和相对虚拟地址(RVA例如节偏移),例如:
type VA32 = u32;
type RVA32 = i32;
struct Header32 {
image_base: VA32,
section_offsets: Vec<RVA32>,
}
let hdr = Header32 { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
当处理32位PE文件时,VA应该是32位且无符号,而RVA应该是32位且有符号。对于64位PE文件,两种类型都应为64位。
我希望我的结构为这些类型使用适当的宽度,可能是通过使它们通用:
struct Header<VA, RVA> {
image_base: VA,
section_offsets: Vec<RVA>,
}
type VA32 = u32;
type RVA32 = i32;
let hdr: Header<VA32, RVA32> = Header { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
但是VA32只有永远伴随下去RVA32,并且VA64应该永远被提供RVA64。有没有一种我可以表达的惯用方式?
我希望使用完整的语法,例如:
struct Header<Arch> {
image_base: arch.VA,
section_offsets: Vec<arch.RVA>,
}
type Arch32 = { …Run Code Online (Sandbox Code Playgroud) 我最近切换到emacsclient进行大多数文本编辑.我正在尝试将一些设置迁移到新的(略有不同)环境.
特别是,在我的.emacs文件中,我有一个设置窗口大小的函数,并准备一些主题.但是,每次调用emacsclient时都不会执行.emacs文件中的代码,因此这些设置不适用于这些窗口.根据这里的问题,我添加了一个钩子'server-visit-hook,称为一个执行我的设置的函数.但是,重新启动服务器并调用emacsclient时,不会应用这些设置.
如何设置新的emacsclient窗口的样式和定位?我的.emacs的相关部分包含在下面:
(defun gui-mode()
(set-face-attribute 'default nil :font "Monospace-8")
(require 'theme-wombat)
(set-frame-size-according-to-resolution))
(add-hook 'server-visit-hook 'gui-mode)
(when window-system
(gui-mode))
Run Code Online (Sandbox Code Playgroud) 我正在构建一组公共库,用于Lua解释器的嵌入式实例(目标受众是特定产品的用户).假设我无权更改Lua可执行文件的功能,并且只有基本的标准Lua库(数学,字符串,...,异常是没有io).
在纯Lua库中处理运行时错误的惯用方法是什么?
我考虑过返回nil,但这并不表示出现了什么问题,特别是如果错误发生在某个深层嵌套的地方.我的下一个想法是返回两个值,nil以及错误代码或描述.我还考虑了一组类似于Windows API的GetLastError(和相应的SetError)的全局函数.
你用什么?您认为各种方法的各种利弊是什么?我应该考虑一些更激进的事情,比如包装所有内容pcall并故意编制索引userdata以导致错误吗?
我正在使用CheckListCtrlMixin让用户为我的应用程序启用和禁用插件.我想在用户检查/取消选中列表中的项目后立即更新我的内部模型.检查项目时,CheckListCtrlMixin发出什么事件?
class CheckListCtrl(wx.ListCtrl,
CheckListCtrlMixin, ListCtrlAutoWidthMixin):
def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, -1,
style=wx.LC_REPORT | wx.SUNKEN_BORDER)
CheckListCtrlMixin.__init__(self)
ListCtrlAutoWidthMixin.__init__(self)
Run Code Online (Sandbox Code Playgroud)
选中或取消选中某个项时,以下任何一项都不会发出:
self.pluginlist = CheckListCtrl(win)
... add a bunch of items to the list ...
self.pluginlist.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.on_item_activated)
self.pluginlist.Bind(wx.EVT_LIST_ITEM_SELECTED, self.on_item_selected)
Run Code Online (Sandbox Code Playgroud)