小编Vic*_*cky的帖子

Bash:用字符串操作(百分号)

操纵字符串时,百分号在bash中意味着什么?例如,什么${0%/*}意思?

string parameters bash

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

字符串到唯一整数散列

我正在尝试开发一个系统,可以将我的字符串更改为唯一的整数值,这意味着例如单词"account"具有加密的数值0891,并且没有其他字可能转换为0891具有相同的转换过程,它但是需要能够产生的整数转换回字符串.

同时它将依赖于单词结构规则,意味着诸如"准确性"和"公告"之类的单词将具有大于0891的生成数字,并且诸如"a","abacus"和"abbreviation"之类的单词将具有生成的数字小于0891.

此应用程序的目的是提供类似于索引或主键的服务.我没有使用增量索引的原因是出于安全目的,并且是由于索引依赖于集合中的数据数量

(例如)

[0] A, [1] B, [2] C, [3] D, [4] E, [5] F
Run Code Online (Sandbox Code Playgroud)

上面的字母有各自对应的索引,E的索引为4

但是,如果数据突然增加或减少,则排序

[0] A, [1] AA, [2] AAB, [3] C, [4] D, [5] DA, [6] DZ, [7] E, [8] F
Run Code Online (Sandbox Code Playgroud)

E现在的指数为7

每个单词必须具有唯一的独立整数等价物并具有相应的权重.

我需要知道是否存在可以执行上述操作的算法.

任何帮助将不胜感激.

algorithm hash search

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

哈佛架构平台上的NULL指针问题

我们本周在这里遇到了有趣的问题.

我们在C上使用哈佛架构嵌入式平台,该平台具有16位数据地址和32位代码地址.

使用函数指针时会出现此问题.如果你有像这样的代码

if (fp) fp();
Run Code Online (Sandbox Code Playgroud)

要么

if (fp != 0) fp();
Run Code Online (Sandbox Code Playgroud)

一切都好.

但是如果你有像这样的代码

if (fp != NULL) fp();
Run Code Online (Sandbox Code Playgroud)

然后,因为NULL定义为(void *) 0,编译器(在这种情况下为gcc)a)不警告,b)对函数指针进行16位比较而不是32位比较.只要你的函数指针没有发生在64k边界上,所以所有底部的16位都是0就很好.

目前我们有大量的代码包含对NULL的显式检查.它们中的大多数将是数据指针,但其中一些将是函数指针.快速grep != NULL== NULL显示超过3000个结果,许多人通过手动检查.

那么,我们现在想要的也是

  1. 找到比较函数指针(但不是数据指针)的所有情况的方法(所以我们可以将它们与我们定义为32位0的FP_NULL进行比较),或者

  2. 以这样的方式重新定义NULL,以便它做正确的事情.

  3. (或者,我想,更新我们的gcc端口以检测并正确处理这种情况).

我无法想到任何适用于1的方法.我能想到的唯一方法是将NULL重新定义为0函数指针,这对于绝大多数针对数据指针的比较来说都是非常浪费的.(32位比较是4条指令,16位比较是1条指令).

有什么想法或建议吗?

c null harvard-architecture

17
推荐指数
1
解决办法
766
查看次数

什么是Pythonic实现简单FSM的方法?

昨天我不得不解析一个非常简单的二进制数据文件 - 规则是,连续查找两个字节都是0xAA,然后下一个字节将是一个长度字节,然后跳过9个字节并输出给定​​数量的数据那里.重复到文件末尾.

我的解决方案确实有效,而且很快就能组合在一起(尽管我是一名C程序员,但我仍然认为用Python写这个比用C语言更快) - 但是,很明显根本不是Pythonic,它看起来像一个C程序(并不是一个非常好的程序!)

什么是更好/更Pythonic方法呢?像这样的简单FSM在Python中仍然是正确的选择吗?

我的解决方案

#! /usr/bin/python

import sys

f = open(sys.argv[1], "rb")

state = 0

if f:
    for byte in f.read():
        a = ord(byte)       
        if state == 0:
            if a == 0xAA:
                state = 1
        elif state == 1:
            if a  == 0xAA:
                state = 2
            else: 
                state = 0
        elif state == 2:
            count = a;
            skip = 9
            state = 3
        elif state == 3:
            skip = skip -1
            if skip == 0:
                state …
Run Code Online (Sandbox Code Playgroud)

python fsm

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

头文件中的函数原型与定义不匹配,如何捕获这个?

(我发现这个问题类似但不重复: 如何检查C编程语言中头文件的有效性)

我有一个函数实现,以及一个头文件中的不匹配原型(相同名称,不同类型).头文件包含在使用该函数的C文件中,但不包含在定义该函数的文件中.

这是一个最小的测试用例:

header.h:

void foo(int bar);
Run Code Online (Sandbox Code Playgroud)

FILE1.C:

#include "header.h"
int main (int argc, char * argv[])
{
    int x = 1;
    foo(x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

档案2.c:

#include <stdio.h>

typedef struct {
    int x;
    int y;
} t_struct;

void foo (t_struct *p_bar)
{
    printf("%x %x\n", p_bar->x, p_bar->y);
}
Run Code Online (Sandbox Code Playgroud)

我可以使用VS 2010编译它,没有任何错误或警告,但不出所料,当我运行它时会出现段错误.

  • 编译器很好用(我明白了)
  • 链接器没有捕获它(我有点惊讶)
  • 静态分析工具(Coverity)没有抓住它(我非常惊讶).

我怎样才能发现这些错误?

[编辑:我意识到如果我在file2.c中#include"header.h",编译器会抱怨.但是我有一个巨大的代码库,并不总是可能或适当的保证函数原型的所有头都包含在实现文件中.

c linker static-analysis function-prototypes

9
推荐指数
2
解决办法
5014
查看次数

考虑C++引用的好方法是什么?

我已经编程C,主要是在嵌入式环境中,多年来一直有一个非常好的指针心理模型 - 我不必明确考虑如何使用它们,我对指针算法100%舒适,数组指针,指针指针等.

我写了很少的C++,并且没有很好的思考引用的方法.我过去曾被告知"将它们视为不能为空的指针",但这个问题表明这远不是完整的故事.

因此,对于更有经验的C++程序员 - 您如何看待参考?你认为它们是一种特殊的指针,还是完全属于自己的东西?对于C程序员来说,理解这个概念的好方法是什么?

c++ reference

7
推荐指数
4
解决办法
547
查看次数

C结构指针解除引用速度

我有一个关于指针解除引用速度的问题.我有这样的结构:

typedef struct _TD_RECT TD_RECT;
struct _TD_RECT {
  double left;
  double top;
  double right;
  double bottom;
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,哪一个更快,为什么?


情况1:

TD_RECT *pRect;
...
for(i = 0; i < m; i++)
{
   if(p[i].x < pRect->left) ...
   if(p[i].x > pRect->right) ...
   if(p[i].y < pRect->top) ...
   if(p[i].y > pRect->bottom) ...
}
Run Code Online (Sandbox Code Playgroud)

案例2:

TD_RECT *pRect;
double left = pRect->left;
double top = pRect->top;
double right = pRect->right;
double bottom = pRect->bottom;
...
for(i = 0; i < m; i++)
{
   if(p[i].x < left) ...
   if(p[i].x …
Run Code Online (Sandbox Code Playgroud)

c c++ pointers local dereference

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

奇数位的位奇偶校验码

我试图找到一个位串的奇偶校验,如果x有一个奇数#为0,它返回1.
我只能使用基本的按位运算,到目前为止,我已经通过了大部分测试,但我想知道两件事:

  1. 为什么x ^(x + ~1)有效?我偶然发现了这个问题,但如果有奇数个位,那么它似乎会给你1,如果是偶数则会给你一些东西.像7 ^ 6 = 1,因为7 = 0b0111

  2. 这是解决问题的正确方向吗?我假设我的问题源于第一次操作,特别是(x + ~1),因为它会溢出某些2的补码数.谢谢

码:

int bitParity(int x) {
    int first = x ^ (x + ~1);
    int second = first ^ 1; // if first XOR gave 1 you'll return 0 here
    int result = !!second;
return result;
}
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation bit parity

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

无法迭代Python中的列表类

我正在尝试使用pyplurk为Plurk编写一个简单的GUI前端.

我已经成功地创建了API连接,登录,并检索并显示了一个朋友列表.现在我正在尝试检索并显示Plurks列表.

pyplurk提供了一个GetNewPlurks函数,如下所示:

  def GetNewPlurks(self, since):
    '''Get new plurks since the specified time.
    Args:
      since: [datetime.datetime] the timestamp criterion.
    Returns:
      A PlurkPostList object or None.
    '''
    offset = jsonizer.conv_datetime(since)
    status_code, result = self._CallAPI('/Polling/getPlurks', offset=offset)
    return None if status_code != 200 else \
           PlurkPostList(result['plurks'], result['plurk_users'].values())
Run Code Online (Sandbox Code Playgroud)

如您所见,这会返回一个PlurkPostList,后者又定义如下:

class PlurkPostList:
  '''A list of plurks and the set of users that posted them.'''
  def __init__(self, plurk_json_list, user_json_list=[]):
    self._plurks = [PlurkPost(p) for p in plurk_json_list]
    self._users = [PlurkUser(u) for u in user_json_list]
  def __iter__(self):
    return …
Run Code Online (Sandbox Code Playgroud)

python

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

C中的括号是否可以更改按位运算的操作数的结果类型?

我通过静态分析工具提供了以下代码:

u1 = (u1 ^ u2); // OK

u1 = (u1 ^ u2) & u3;  // NOT OK

u1 = (u1 ^ u2) & 10; // NOT OK

u1 = (u1 ^ u2) & 10U; // NOT OK

u1 = (unsigned char)(u1 ^ u2) & 10U; // OK

u1 = (unsigned char)(u1 ^ u2) & u3;  // OK
Run Code Online (Sandbox Code Playgroud)

"OK"表示静态分析工具没有抱怨."不OK"指的是静态分析工具没有抱怨 - 声称按位操作的某些操作数不是一个无符号整数.

最后两行的结果表明括号正在引起

一个.要签名的实际类型转换

湾 静态分析工具认为是签名的类型转换

我将向静态分析工具开发人员询问(b).

但在此之前,我想知道C语言是否可以做(a)?

c type-conversion bitwise-operators parentheses

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