小编sho*_*nex的帖子

Python:可以返回布尔值和字符串吗?

原始问题

我已经创建了一个函数,它等待特定字符串出现在串行端口上,并返回所有字符读取,直到找到该字符串,否则返回false.这很方便,但我想知道它是否被认为是不好的做法?

澄清:

主要目标是等待特定字符串在给定的时间内出现.除了IO错误,可能的结果是True(字符串确实出现)或False次要目标是获取整个输出,因为在寻找的实际答案之前可能存在我想要解析的信息.我想可能是我可以在一个返回值中合并主要和次要目标.

def MyFunc(s, timeout) :
    test = get_some_input(timeout)
    if test.endswith(s)
        return test
    else
        return False
Run Code Online (Sandbox Code Playgroud)

编辑:另一个建议的答案是提出异常.我不认为这是一个好主意,因为超时是预期的行为.我的意思是,如果有一个用于指定超时的参数,那么超时是可能的结果,而不是例外.

编辑2:因为我需要存储输入,所以使用类是正确的解决方案.wait for函数具有明确的返回值,但是也可以访问在超时之前读取的整个字符串.

class Parser :
        def __init__(self, sport_name):
                self.currentMsg = ''
                self.ser = serial.Serial(sport_name, 115200)
        def WaitFor(self, s, timeOut=None):
                self.ser.timeout = timeOut
                self.currentMsg = ''
                while self.currentMsg.endswith(s) != True :
                        # should add a try catch here
                        c=self.ser.read()
                        if c != '' :
                               self.currentMsg += c
                        else :
                                print 'timeout waiting for ' + s
                                return False
                return True
Run Code Online (Sandbox Code Playgroud)

python

8
推荐指数
5
解决办法
4456
查看次数

目标文件为二进制代码

假设我有一个没有外部依赖关系的C文件,只有const数据部分.我想编译这个文件,然后得到一个二进制blob,我可以在另一个程序中加载,该函数将通过函数指针使用.

我们举一个例子,这是一个虚构的二进制模块,f1.c

static const unsigned char mylut[256] = {
    [0 ... 127] = 0,
    [128 ... 255] = 1,
};

void f1(unsigned char * src, unsigned char * dst, int len)
{
    while(len) {
        *dst++ = mylut[*src++];
        len--;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将它编译为f1.o,然后f1.bin,并在prog.c中使用它

int somefunc() {
    unsigned char  * codedata;
    f1_type_ptr  f1_ptr;
    /* open f1.bin, and read it into codedata */

    /* set function pointer to beginning of loaded data */
    f1_ptr =(f1_type_ptr)codedata;

    /* call !*/
    f1_ptr(src, dst, len);
}
Run Code Online (Sandbox Code Playgroud)

我想从f1.c到f1.o涉及-fPIC以获得位置独立性.我可以使用从f1.o到f1.bin的标志或链接描述符是什么?

澄清: …

c gcc ld

8
推荐指数
2
解决办法
3732
查看次数

如何给出关于循环计数的gcc的提示

知道循环将经历的迭代次数允许编译器进行一些优化.考虑下面的两个循环:

未知的迭代次数:

static void bitreverse(vbuf_desc * vbuf)
{
    unsigned int idx = 0;
    unsigned char * img = vbuf->usrptr;

    while(idx < vbuf->bytesused) {
        img[idx] = bitrev[img[idx]];
        idx++;
    }

}
Run Code Online (Sandbox Code Playgroud)

已知的迭代计数

static void bitreverse(vbuf_desc * vbuf)
{
    unsigned int idx = 0;
    unsigned char * img = vbuf->usrptr;

    while(idx < 1280*400) {
        img[idx] = bitrev[img[idx]];
        idx++;
    }

}
Run Code Online (Sandbox Code Playgroud)

第二个版本将编译为更快的代码,因为它将被展开两次(在ARM上使用gcc 4.6.3和至少-O2).有没有办法对gcc在优化时考虑的循环计数进行断言?

c optimization gcc

8
推荐指数
1
解决办法
3795
查看次数

简单可靠的UDP C++库

我需要一个可靠的UDP库.我写的那个不太好用,我想看看第三方在同样情况下能做些什么.

由于xcode中的一些"有趣的"编译问题,Enet将无法工作(我还有关于堆栈溢出的另一个问题).

对于便携,可靠的UDP库的任何建议将不胜感激.

c++ udp

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

主/工作线程和信号处理

我正在编写一个程序,有一个主线程和一些工作线程,我想让信号处理正确.我的问题如下:

主线程启动并执行所有分配

主线程设置SIGINT信号处理程序

主线程启动工作线程.工作线程不需要特殊清理,但是它们可以在系统调用或信号量上休眠.

收到SIGINT时,我的理解是只有一个线程收到它.因此,如果线程在系统调用或信号量上休眠,它们就不会被唤醒,我将无法pthread_join我的工作线程并在我的主线程中进行所有必要的清理.

以下信号处理程序可以解决我的问题吗?

void term(int sig)
{
    g_do_cleanup = 1;
    pthread_kill(worker_1_id, some_other_signal);
    ...
    pthread_kill(worker_2_id, some_other_signal);
}
Run Code Online (Sandbox Code Playgroud)

我期待的是,一旦接收到SIGINT,所有线程将用另一个信号发出信号,退出阻塞呼叫,看到g_do_cleanup标志并优雅地退出.

欢迎任何关于如何正确执行此操作的评论或链接.

编辑:我不是在寻找一种方法来唤醒多个线程等待特定条件,所以我不认为pthread_cond_signal方法是我正在寻找的.我想要的是:

  • 找到阻塞调用上阻塞的所有线程从这些调用返回的方法.
  • 或者杀死除主要线程之外的所有线程.

c linux multithreading posix pthreads

6
推荐指数
1
解决办法
6936
查看次数

为什么有这么多的工具/技术可以在开源社区中完成同样的任务

我最近开始学习开源技术,很快就感到沮丧,因为有成千上万的技术和工具(每个都有自己的优点和缺点).我想知道Windows的"All in One"方法是否真的更好.

open-source

6
推荐指数
2
解决办法
402
查看次数

奇怪的unsigned char cast

使用的目的/优势/区别是什么?

/* C89 compliant way to cast 'char' to 'unsigned char'. */
static inline unsigned char
to_uchar (char ch)
{
  return ch;
}
Run Code Online (Sandbox Code Playgroud)

与标准演员相比?

编辑:在gnulib中的base64代码中找到

c

6
推荐指数
1
解决办法
353
查看次数

SD卡写性能

我正在编写一个小应用程序,它在SD卡上以恒定速率写入jpeg图像.我选择了一个EXT3文件系统,但是在EXT2文件系统中观察到了相同的行为.

我的写循环看起来像这样:

get_image()
fwrite()
fsync()
Run Code Online (Sandbox Code Playgroud)

或者像这样:

get_image()
fopen() 
fwrite()
fsync()
fclose()
Run Code Online (Sandbox Code Playgroud)

我还显示了一些时序统计信息,我可以看到我的程序有时会被阻止几秒钟.平均速率仍然很好,因为如果我将传入的图像保持为fifo,那么我将在这样的停顿之后的短时间内写出许多图像.您知道操作系统是否存在问题,或者它是否与SD卡本身有关?我怎么能接近实时?我不需要强大的实时性,但是停滞几秒钟是不可接受的.

一些精度:是的,每个文件后都需要fsync,因为我希望图像在磁盘上,而不是在某些用户或内核缓冲区中.没有fsyncing,我有更好的吞吐量,但仍然是不可接受的失速.我不认为这是一个缓冲区问题,因为第一次失速发生在写入50 MB之后.根据手册页,fsync正是为了确保没有数据缓冲.

关于平均写入速率的精确度:我正在以我正在使用的卡可持续的速率写入.如果我在等待fsync完成时堆叠传入的图像,那么在此停顿之后写入传输速率将增加,我将很快回到平均速率.平均传输速率约为1.4 MB/s.

系统是一台现代笔记本电脑运行ubuntu 8.04与库存记录(2.6.24.19)

linux real-time sd-card fsync ext3

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

Doxygen:如何使用 EXPAND_AS_DEFINED

我定义了以下宏,并尝试在生成文档时扩展它。

#define GETSET(param) \
bool CYNOVE_Enable##param(postproc_ctx_t ctx, bool enable)  \
{                                                           \
 struct postproc_ctx * c;                                   \
 c = (struct postproc_ctx *)ctx;                            \
 c->do_##param = enable?1:0;                                \
 return TRUE;                                               \
}                                                           \
Run Code Online (Sandbox Code Playgroud)

在 doxygen 中,如果我使用:

MACRO_EXPANSION = YES
Run Code Online (Sandbox Code Playgroud)

然后当我使用宏时它会被扩展。但是如果设置:

MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
EXPAND_AS_DEFINED = GETSET
Run Code Online (Sandbox Code Playgroud)

宏未展开

因为我认为,其中一个答案是错误的,但评论对于任何冗长的解释来说都很糟糕,让我补充一下我认为这应该如何工作。

根据 doxygen 文档和此链接,PREDEFINED 和 EXPAND_AS_DEFINED 有不同的用途。我理解 EXPAND_AS_DEFINED 用于选择性地扩展给定的宏“因为它是在源代码中定义的”,因此得名,而 PREDEFINED 在这里赋予 Doxygen 宏的含义。

c doxygen

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

是什么让GCC __restrict__资格赛停止工作

这是一些相当简单的代码,用-O2(gcc 4.8.5)编译:

unsigned char  * linebuf;
int yuyv_tojpegycbcr(unsigned char * buf, int w)
{
    int  col;
    unsigned char * restrict pix = buf;
    unsigned char * restrict line = linebuf;

    for(col = 0; col < w - 1; col +=2)
    {
            line[col*3] = pix[0];
            line[col*3 + 1] = pix[1];
            line[col*3 + 2] = pix[3];
            line[col*3 + 3] = pix[2];
            line[col*3 + 4] = pix[1];
            line[col*3 + 5] = pix[3];
            pix += 4;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是相应的程序集:

0000000000000000 <yuyv_tojpegycbcr>:
   0: …
Run Code Online (Sandbox Code Playgroud)

c gcc

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

标签 统计

c ×6

gcc ×3

linux ×2

c++ ×1

doxygen ×1

ext3 ×1

fsync ×1

ld ×1

multithreading ×1

open-source ×1

optimization ×1

posix ×1

pthreads ×1

python ×1

real-time ×1

sd-card ×1

udp ×1