考虑非常简单:
int main(void) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我编译它(使用mingw32-gcc)并执行它main.exe foo bar.
现在,我曾预料到由明确声明为丧失生命参数的主函数引起的某种崩溃或错误.缺乏错误导致了这个问题,这实际上是四个问题.
为什么这样做?答:因为标准是这样说的!
输入参数是否被忽略或者是否使用argc&argv静默编写堆栈?答:在这种特殊情况下,堆栈已准备就绪.
我如何验证以上内容?答:请参阅rascher的回答.
这个平台依赖吗?答:是的,不.
我有一个2端口信号继电器通过USB串行接口连接到我的电脑.使用pyserial模块,我可以轻松控制这些继电器.但是,这是基于我事先知道设备分配给哪个COM端口(或/ dev-node)的假设.
对于我正在做的项目,这是不够的,因为我不想假设设备总是被分配给例如Windows中的COM7.我需要能够使用python在可能的平台(Win,Linux,OSX(我想这将类似于Linux方法))上以编程方式识别设备.或许正如标题所示,在系统中枚举USB设备并以某种方式获得更友好的名称.Windows和Linux是最重要的支持平台.
任何帮助将不胜感激!
编辑:
似乎pyudev模块非常适合Linux系统.有没有人有过这方面的经验?
我正在写一个应用程序.没有花哨的GUI:s或任何东西,只是一个普通的旧控制台应用程序.这个应用程序,让我们称之为App,需要能够在启动时加载插件.所以,很自然地,我创建了一个继承的插件类:
class PluginBase(object):
def on_load(self):
pass
def on_unload(self):
pass
def do_work(self, data):
pass
Run Code Online (Sandbox Code Playgroud)
想法是在启动时,App会遍历当前目录,包括子目录,搜索包含本身是其子类的类的模块PluginBase.
更多代码:
class PluginLoader(object):
def __init__(self, path, cls):
""" path=path to search (unused atm), cls=baseclass """
self.path=path
def search(self):
for root, dirs, files in os.walk('.'):
candidates = [fname for fname in files if fname.endswith('.py') \
and not fname.startswith('__')]
## this only works if the modules happen to be in the current working dir
## that is not important now, i'll fix that later
if candidates: …Run Code Online (Sandbox Code Playgroud) 这个问题与我之前提出的一个问题有关。即这一项,如果有人有兴趣。基本上,我想要做的是使用Py_buffer包装在memoryview-object 中的 C 数组向 Python 公开。我已经使用PyBuffer_FillInfo(工作 = 我可以在 Python 中操作数据并将其写入 C 中的标准输出),但是如果我尝试滚动我自己的缓冲区,我会在 C 函数返回后得到一个段错误。
我需要创建自己的缓冲区,因为 PyBuffer_FillInfo 假定格式为 char,使 itemsize 字段为 1。我需要能够提供大小为 1、2、4 和 8 的项目。
一些代码,这是一个工作示例:
Py_buffer *buf = (Py_buffer *) malloc(sizeof(*buf));
int r = PyBuffer_FillInfo(buf, NULL, malloc(sizeof(char) * 4), 4, 0, PyBUF_CONTIG);
PyObject *mv = PyMemoryView_FromBuffer(buf);
//Pack the memoryview object into an argument list and call the Python function
for (blah)
printf("%c\n", *buf->buf++); //this prints the values i set …Run Code Online (Sandbox Code Playgroud) 天哪.
有人可以解释这两个字节反转函数实现的逻辑差异.
例1:
uint32_t byte_reverse_32(uint32_t num) {
static union bytes {
uint8_t b[4];
uint32_t n;
} bytes;
bytes.n = num;
uint32_t ret = 0;
ret |= bytes.b[0] << 24;
ret |= bytes.b[1] << 16;
ret |= bytes.b[2] << 8;
ret |= bytes.b[3];
return ret;
}
Run Code Online (Sandbox Code Playgroud)
例2:
uint32_t byte_reverse_32(uint32_t num) {
static union bytes {
uint8_t b[4];
uint32_t n;
} bytes;
bytes.n = num;
uint32_t ret = 0;
ret |= (bytes.b[0] << 24) || (bytes.b[1] << 16) || (bytes.b[2] << 8) …Run Code Online (Sandbox Code Playgroud) 我只是略读C99标准,寻找我现在不记得的东西,当我注意到从strerror函数返回的指针(第7.12.6.2节)不是const限定的,即使标准说:
strerror函数返回一个指向字符串的指针,该字符串的内容是
特定于语言环境的.指向的数组不应被程序修改,
但可能会被后续的strerror函数调用覆盖.
是否有一个明显的原因,这个函数返回一个可修改的字符串,而不是像:
char const * const strerror(int errnum);
Run Code Online (Sandbox Code Playgroud)
或者至少
char const * strerror(int errnum);
Run Code Online (Sandbox Code Playgroud)
谢谢.
我今天正在阅读一些代码(C,如果它对任何人有所影响),并对开关块感到好奇.
switch (c_type) {
case -1:
some_function(some_var);
break;
[...]
default:
abort();
}
Run Code Online (Sandbox Code Playgroud)
现在,这是一个非常简单的开关块.这是 - some_function(some_var)我很好奇:如果你,程序员,绝对的,积极的,超级的,确保调用会导致进程退出,你是否仍然将break-statement放在下面,即使它完全没必要?你会说这是最好的做法吗?