小编Gee*_*kyJ的帖子

在这段代码中union的意义是什么,如果结构有什么缺点?

struct queue_entry_s {

    odp_buffer_hdr_t *head;
    odp_buffer_hdr_t *tail;
    int               status;

    enq_func_t       enqueue ODP_ALIGNED_CACHE;
    deq_func_t       dequeue;
    enq_multi_func_t enqueue_multi;
    deq_multi_func_t dequeue_multi;

    odp_queue_t       handle;
    odp_buffer_t      sched_buf;
    odp_queue_type_t  type;
    odp_queue_param_t param;
    odp_pktio_t       pktin;
    odp_pktio_t       pktout;
    char              name[ODP_QUEUE_NAME_LEN];
};

typedef union queue_entry_u {
    struct queue_entry_s s;
    uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct queue_entry_s))];
} queue_entry_t;

typedef struct queue_table_t {
    queue_entry_t  queue[ODP_CONFIG_QUEUES];                                                                                           
} queue_table_t;

static queue_table_t *queue_tbl;

#define ODP_CACHE_LINE_SIZE 64

#define ODP_ALIGN_ROUNDUP(x, align)\                                                                                                   
    ((align) * (((x) + align - 1) / (align)))

#define ODP_CACHE_LINE_SIZE_ROUNDUP(x)\
    ODP_ALIGN_ROUNDUP(x, ODP_CACHE_LINE_SIZE)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,typedef union queue_entry_u, …

c structure unions

3
推荐指数
1
解决办法
135
查看次数

使用fork(),如何才能使子进程始终运行?

子进程和父进程执行是并行的,首先取决于OS调度.但是,总是在父母之前开始做孩子可以做些什么呢?

这是我的问题的伪代码,

int start_test()
{
   pid_t pid;
   pid = fork();
   if(pid == 0) {
      execv("XXX", XXX);
   } else if(pid > 0) {
     pid = fork();
    if(pid == 0) {
       execv("XXX", XXX);
    } else {
       // Do something
    }
   }
  return 0;
}
int main()
{
   start_test();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想首先执行execv,然后再次创建新进程.每个execv应该按顺序.

c linux fork process vfork

3
推荐指数
1
解决办法
5625
查看次数

这段代码是真的知道系统是小端还是大端?

#include<stdio.h>
int main()                                                                                                                              
{
    unsigned int unum = 0x80008001;
    short unsigned int *snum = (short unsigned int*)&unum;
    printf("%d\n", *snum);
    printf("%d\n", *(snum+1));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

32769
32768
Run Code Online (Sandbox Code Playgroud)

snum指向unum的最初两个字节,但是它的值是unum的最后两个字节,并且在递增指针之后,value是unum的前两个字节.

所以,它是一个小端系统.但是,我不确定这种方式是否正确,以了解系统的类型.这是对的吗?

c endianness

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

什么是最好的算法,只用一个设置位找到数字,其总和等于给定的数字?

假设我有一个号码0b10110010,

我想用不同的数字解析它的总和等于上面的数字,所有解析的数字应该只有一个单位设置.

 10000000  <-- num1
 + 100000  <-- num2
 +  10000  <-- num3
 +     10  <-- num4
----------
 10110010  <-- num1 + num2 + num3 + num4
Run Code Online (Sandbox Code Playgroud)

什么是最好的算法呢?

c algorithm

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

蓝牙配对和命令行连接

我想从linux的命令行连接并配对附近可用的蓝牙设备.我通过互联网搜索,发现我们可以通过简单代理配对,但我的设备无法使用.设备中提供了以下命令: hcitool,hciconfig,hcidump,sdptool,l2ping,rfcomm. 连接到远程设备我正在运行以下命令. hcitool cc BD_ADDRESS 但是以上命令正在连接设备一段时间,设备再次断开连接.在hcidump输出中,我看到断开事件.无论如何在linux命令行中我可以测试我的蓝牙吗?设备在一段时间后断开连接的原因是什么?

linux bluetooth hci bluetooth-lowenergy

0
推荐指数
1
解决办法
8518
查看次数

printf的奇怪行为

#include <stdio.h>

    int main(void)
    {
        double a = 1234.5f;
        int b = 71;
        int c = 68;
        int d;                                                                                                                             
        printf("%d %d %d %d\n", a,b,c,d);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

输出:

   0 1083394560 71 68
Run Code Online (Sandbox Code Playgroud)

在这里,为什么b给出垃圾值,而c给出b的值而d给出c的值,即使它是未初始化的?

c printf

0
推荐指数
1
解决办法
105
查看次数

malloc返回类型混乱

我正在经历这里,发现如果我们不包含stdlib.h,则转换malloc会导致不需要的行为,转换返回值以及系统上的指针和整数大小是否不同.

下面是SO问题中给出的代码片段.这是在64位机器上尝试的,其中指针和整数大小不同.

int main()
{
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我们不包含stdlib.h,编译器将假定malloc返回类型为int,并且转换它并分配给不同大小的指针可能会导致不需要的行为.但我的问题是,为什么铸造int到int*并将其分配给不同大小的指针可能会导致问题.

c malloc pointers

0
推荐指数
1
解决办法
95
查看次数