我正在time_t使用python ctypes模块访问包含一些字段的C结构.
鉴于其非完全可移植性,我不能静态地定义这些字段c_int或c_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) 我发现为了获得足够的上下文以查看导致崩溃的原因,必须反汇编大量的库代码真的很烦人.有什么方法我可以直接objdump一个地址,让它为我找到包含函数的边界?
编辑:更好的是,我可以让它拆卸整个堆栈跟踪吗?
在顶部,我注意到我的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
鉴于数组的名称实际上是指向数组的第一个元素的指针,以下代码:
#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) 虽然包括<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) 我的问题是如何将UINT32值转换为UINT8数组[4](C/C++),最好是以独立于字节序的方式?另外,如何从UINT8数组[4]重建UINT32值,以回到你开始的位置?
我正在为C寻找一个高效且简单的日志记录库,它可以将日志输出到文件中.在我想要的日志中显示消息,如下所示:
date-time tag message
Run Code Online (Sandbox Code Playgroud)
控制消息的详细程度并控制文件的大小会很好.
log4c似乎太大了.nglogc非常合适,但也具有冗余功能.也许你告诉我更多变种?
我需要计算两种颜色之间的Delta-E距离.在CIELab颜色空间中使用两种颜色执行此操作的算法如下所示:

是否有已知的此算法的开源实现?这并不难实现,但是从我上次尝试实现色彩空间转换算法开始,我不想在已经上路并经过测试的情况下重新开发轮子.
CIEDE2000也会更好,更准确,但也可能在iPhone上有点过分.我猜CIE94会很好.
您认为关于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个输出相同?
我想知道Microsoft Visual Studio 2010是否支持C99.如果没有,我怎么能使用像intptr_t和的标准类型uintptr_t?