小编Foo*_*Bah的帖子

如何将指向c数组的指针转换为python数组

我有一个C++回调函数,使用ctypes调用Python.此函数的参数是指向double数组和元素数的指针.

有很多元素,大约2,000,000.我需要将它发送到scipy函数中.

C++原型是:

bool (*ptsetDataSource)(double*, long long);
Run Code Online (Sandbox Code Playgroud)

这是以下python代码:

CPF_setDataSource = CFUNCTYPE(c_bool, POINTER(c_double),c_longlong)
CPF_setSelection= CFUNCTYPE(c_bool,c_char_p, c_longlong,c_longlong)
CPF_ResetSequence = CFUNCTYPE(c_bool)

def setDataSource(Data, DataLength):
    Datalist=[0.0]*100
    for i in range(0,100):
        Datalist[i]=Data[i]

    print Datalist
    return True
Run Code Online (Sandbox Code Playgroud)

问题是print datalist返回:

[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, …
Run Code Online (Sandbox Code Playgroud)

python ctypes

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

C/C++无锁(或非阻塞)环形缓冲区,它覆盖了最旧的数据?

我正在尝试找到一种方法来实现无锁或无阻塞方式,为单个消费者/单个消费者创建一个环形缓冲区,它将覆盖缓冲区中最旧的数据.我已经阅读了很多无锁算法,如果缓冲区已满,当你"返回false"时可以工作 - 即不添加; 但是,当你需要覆盖最旧的数据时,我甚至找不到谈论如何做的伪代码.

我正在使用GCC 4.1.2(工作中的限制,我无法升级版本......)并且我有Boost库,并且在过去我制作了自己的Atomic <T>变量类型,它紧跟着upcomming规范(它不完美,但它是线程安全的,并做我需要的).

当我想到它时,我认为使用这些原子应该真正解决问题.关于我在想什么的一些粗糙的伪代码:

template< typename T , unsigned int Size>
class RingBuffer {
private:
Atomic<unsigned int> readIndex;
Atomic<unsigned int> writeIndex;
enum Capacity { size = Size };
T* buf;

unsigned int getNextIndex(unsigned int i)
{
 return (i + 1 ) % size;
}

public:
RingBuffer() { //create array of size, set readIndex = writeIndex = 0 }
~RingBuffer() { //delete data }
void produce(const T& t)
{
 if(writeIndex == getNextIndex(readIndex)) //1
 {
  readIndex = getNextIndex(readIndex); …
Run Code Online (Sandbox Code Playgroud)

c c++ nonblocking circular-buffer

9
推荐指数
1
解决办法
4915
查看次数

`ar`库覆盖时间戳

.a存档格式标头需要时间戳.当我重建静态库时,这导致了无数的麻烦,主要是因为我无法完全重现原始二进制文件.

例如(这是在我的Mac上,但在x64 linux中也是如此):

$ cat foo.h
int foo();
$ cat foo.c
#include "foo.h"
int foo() { return 3; }
$ gcc -fno-pic -m64 -arch x86_64 -I/usr/local/include -O3 -c foo.c -o foo.o -fpic
$ ar rcs libfoo.a foo.o
$ md5 libfoo.a
MD5 (libfoo.a) = 0d0e6606185de4e994c47f4a0e54c1c4
$ mv libfoo.a libfoo.a1
$ ar rcs libfoo.a foo.o
$ md5 libfoo.a
MD5 (libfoo.a) = 22a69d42e1325ae8f978c2a18a4886da    
Run Code Online (Sandbox Code Playgroud)

为了向自己证明唯一的区别是时间,我采用了基于hexdump的差异:

$ diff <(hexdump libfoo.a) <(hexdump libfoo.a1)
2,3c2,3
< 0000010 20 20 20 20 20 20 20 20 31 33 …
Run Code Online (Sandbox Code Playgroud)

c linux static-libraries unix-ar .a

9
推荐指数
3
解决办法
2569
查看次数

IPC vs domain sock vs命名管道

什么是IPC和Unix域套接字和命名管道之间的差异?

我从各种书籍中得到了模糊的定义,但无法明确应该在哪里使用哪一本.

c ipc system

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

在mawk中使用strftime函数

我正在尝试创建将根据某种模式过滤输入文件的AWK脚本,并使用strftime()函数进行一些计算.

($2 ~ /^[HB]/ && $2 ~ /n$/){
        print strftime("%Y")
}
Run Code Online (Sandbox Code Playgroud)

使用的翻译是mawk.使用此命令触发此脚本时:

awk -f script3 inputFile
Run Code Online (Sandbox Code Playgroud)

我收到错误:"函数strftime从未定义"

awk strftime

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

stdint.h的stdfloat.h版本

您使用什么标准命名约定和/或数学库?我目前正在使用

#include <stdint.h>
typedef float  float32_t;
typedef double float64_t;
/*! ISO C99: 7.18 Integer types 8, 16, 32, or 64 bits
intN_t = two’s complement signed integer type with width N, no padding bits.
uintN_t = an unsigned integer type with width N.
floatN_t = N bit IEE 754 float.

        uintN_t             intN_t              floatN_t
bits    unsigned-integer    signed-integer      IEE754 float
8       
16      unsigned short      short               ??"half"
32      unsigned            int                 float
64      unsigned long       long                double
128                                             ?? "Long double" "quad" ??*/
Run Code Online (Sandbox Code Playgroud)

但是你可以看到我还没有决定数学库. …

c math

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

L1约束回归C

我需要C. AFAIK中的Lasso/L1约束回归库,NAG不支持它.R有一个包来做它但我需要用C做.任何想法?

c mathematical-optimization

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

没有优先级倒置的环形缓冲区

我有一个需要将数据传递给低优先级进程的高优先级进程.我写了一个基本的环形缓冲区来处理数据的传递:

class RingBuffer {
  public:
    RingBuffer(int size);
    ~RingBuffer();

    int count() {return (size + end - start) % size;}

    void write(char *data, int bytes) {
      // some work that uses only buffer and end
      end = (end + bytes) % size;
    }

    void read(char *data, int bytes) {
      // some work that uses only buffer and start
      start = (start + bytes) % size;
    }

  private:
    char *buffer;
    const int size;
    int start, end;
};
Run Code Online (Sandbox Code Playgroud)

这是问题所在.假设低优先级进程有一个oracle,它确切地告诉它需要读取多少数据,因此count()永远不需要调用.然后(除非我遗漏了什么)没有并发问题.但是,只要低优先级线程需要调用count()(高优先级线程可能也想调用它来检查缓冲区是否太满),count()或更新中的数学可能会结束不是原子的,引入了一个bug.

我可以在访问周围放置一个互斥体来开始和结束但如果高优先级线程必须等待低优先级线程获取的锁定,那么这将导致优先级倒置. …

c++ concurrency circular-buffer

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

ostream等效于%.2f或%.2lf

double d = 1/2.;
printf("%.2lf\n", d);
Run Code Online (Sandbox Code Playgroud)

打印出来0.50.这就是我想用ostream操纵器复制的内容.但是,没有一个明显的iomanip操纵器允许我设置所需的最小小数位(如果我理解正确,则setprecision设置最大宽度).有没有纯粹iostreamboost方法这样做?

c++ precision iostream

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

如果[-n"$ {TEMP_FILE_LIST}"]中的-n in是什么?

是什么-nif [ -n "${TEMP_FILE_LIST}" ]这个shell脚本呢?

unix shell

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