标签: c

使用ctypes获取`time_t`的类型/大小

我正在time_t使用python ctypes模块访问包含一些字段的C结构.

鉴于其非完全可移植性,我不能静态地定义这些字段c_intc_long类型.

如何定义它们以使我的代码可移植?

示例C结构定义:

#import <sys/types.h>
#import <time.h>

typedef struct my_struct {
    time_t timestap;
    uint16_t code;      
};
Run Code Online (Sandbox Code Playgroud)

各自的python ctypes结构:

from ctypes import *

c_time = ? # What do I have to put here?

class MyStruct(Structure):
    _fields_ = [
        ('timestamp', c_time),
        ('code', c_int16),
    ]
Run Code Online (Sandbox Code Playgroud)

c python struct ctypes

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

我可以给objdump一个地址并让它反汇编包含的函数吗?

我发现为了获得足够的上下文以查看导致崩溃的原因,必须反汇编大量的库代码真的很烦人.有什么方法我可以直接objdump一个地址,让它为我找到包含函数的边界?

编辑:更好的是,我可以让它拆卸整个堆栈跟踪吗?

c debugging objdump disassembly

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

为什么我的c程序突然使用30g的虚拟内存?

在顶部,我注意到我的c程序(使用CUDA 3.2)的虚拟大小为28g或更多(查看VIRT),从一开始就进行每次运行.这对我来说没有任何意义.常驻内存是有意义的,在我最大的数据集上只有大约2g.我知道在过去的某个时刻虚拟大小不是那么大,但我不确定何时发生了变化.

为什么我的进程会使用28g的虚拟内存(或者为什么top的VIRT会如此之大)?据我所知,VIRT包括可执行二进制文件(仅437K),共享库和"数据区".什么是"数据区"?如何找出共享库需要多少内存?那个过程总内存的其他元素呢?

/ proc/<pid>/smaps(1022行)的内容:http://pastebin.com/fTJJneXr

其中一个来自smaps的条目显示其中一个占其中的MOST,但没有标签......我怎么能找出这个"空白"条目有28gb?

200000000-900000000 ---p 00000000 00:00 0 
Size:           29360128 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
Run Code Online (Sandbox Code Playgroud)

-

ubuntu 11.04 64位
16 GB RAM

c linux memory virtual cuda

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

指针指针和指向数组的指针之间的区别?

鉴于数组的名称实际上是指向数组的第一个元素的指针,以下代码:

#include <stdio.h>

int main(void)
{
    int a[3] = {0, 1, 2};
    int *p;

    p = a;

    printf("%d\n", p[1]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1按预期打印.

现在,鉴于我可以创建一个指向指针的指针,我写了以下内容:

#include <stdio.h>                                                              

int main(void)                                                                  
{                                                                               
        int *p0;                                                                
        int **p1;                                                               
        int (*p2)[3];                                                           
        int a[3] = {0, 1, 2};                                                   

        p0 = a;                                                                 
        p1 = &a;                                                                
        p2 = &a;                                                                

        printf("p0[1] = %d\n(*p1)[1] = %d\n(*p2)[1] = %d\n",                    
                        p0[1], (*p1)[1], (*p2)[1]);                             

        return 0;                                                               
}
Run Code Online (Sandbox Code Playgroud)

我希望它能够编译和打印

p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1
Run Code Online (Sandbox Code Playgroud)

但相反,它在编译时出错,说:

test.c: In function ‘main’:
test.c:11:5: …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers declaration dereference

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

struct sigaction不完整错误

虽然包括<signal.h>我得到一个错误,说这struct sigaction是一个不完整的类型.

我不知道该怎么做.

请帮忙

#include <signal.h>
struct sigaction act;

int main(int argc, char** argv)
{
    int depth;

    /* validate arguments number*/
    if(argc < 2)
    {
        printf("fatal error: please use arguments <MaxChild> <MaxDepth>\n");
        exit(1);
    }

    /* register the realtime signal handler for sigchld*/

/*173*/
    memset(&act,0,sizeof(act));
    act.sa_handler = sigproc;
    sigaction(SIGCHLD,  /* signal number whose action will be changed */
             &act,      /* new action to do when SIGCHLD arrives*/
             NULL);     /* old action - not stored */


    srand(time(NULL));
    depth …
Run Code Online (Sandbox Code Playgroud)

c linux signals

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

将UINT32值转换为UINT8数组[4]

我的问题是如何将UINT32值转换为UINT8数组[4](C/C++),最好是以独立于字节序的方式?另外,如何从UINT8数组[4]重建UINT32值,以回到你开始的位置?

c c++ endianness

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

记录C的库

我正在为C寻找一个高效且简单的日志记录库,它可以将日志输出到文件中.在我想要的日志中显示消息,如下所示:

date-time tag message
Run Code Online (Sandbox Code Playgroud)

控制消息的详细程度并控制文件的大小会很好.

我找到了两个适合我的项目.它是log4cnglogc.

log4c似乎太大了.nglogc非常合适,但也具有冗余功能.也许你告诉我更多变种?

c logging

13
推荐指数
4
解决办法
3万
查看次数

是否已知CIEDE2000或CIE94 Delta-E色差计算算法的实现?

我需要计算两种颜色之间的Delta-E距离.在CIELab颜色空间中使用两种颜色执行此操作的算法如下所示:

在此输入图像描述

是否有已知的此算法的开源实现?这并不难实现,但是从我上次尝试实现色彩空间转换算法开始,我不想在已经上路并经过测试的情况下重新开发轮子.

CIEDE2000也会更好,更准确,但也可能在iPhone上有点过分.我猜CIE94会很好.

c algorithm math colors image-processing

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

C中二维数组的内存映射

您认为关于2D阵列的内存映射的讨论是正确的吗?特别是这张照片?你能解释一下这个理论吗?

假设我们在C中声明一个2D数组,如下所示:

int arr[3][3]={10, 20, 30, 40, 50, 60, 70, 80, 90};
Run Code Online (Sandbox Code Playgroud)

现在,根据这个讨论,内存将按如下方式排列:

在此输入图像描述

现在,我编写了以下代码来测试这个理论:

#include <stdio.h>

main()
{
    int arr[3][3]={10, 20, 30, 40, 50, 60, 70, 80, 90};
    printf("      arr==%d\n", arr);
    printf("  &arr[0]==%d\n", &arr[0]);
    printf("   arr[0]==%d\n", arr[0]);
    printf("&arr[0][0]=%d\n", &arr[0][0]);
    printf(" arr[0][0]=%d\n", arr[0][0]);
}
/*
Output:
========
      arr ==1245028
  &arr[0] ==1245028
   arr[0] ==1245028
&arr[0][0]==1245028
 arr[0][0]==10
Press any key to continue...
*/
Run Code Online (Sandbox Code Playgroud)

为什么前4个输出相同?

c multidimensional-array

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

Microsoft Visual Studio 2010是否支持c99?

我想知道Microsoft Visual Studio 2010是否支持C99.如果没有,我怎么能使用像intptr_t和的标准类型uintptr_t

c c99 visual-studio-2010 visual-studio

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