Questions tagged «c»

C是用于系统编程(OS和嵌入式),库,游戏和跨平台的通用编程语言。该标记应与ISO 9899标准(除非另有说明,最新版本9899:2018中定义的有关C语言的一般问题)一起使用-还要使用c89,c99,c11等标记特定于版本的请求。C与C ++截然不同,在没有合理理由的情况下,不应将其与C ++标记结合使用。

2
C和C ++关于++运算符的区别
我一直在鬼混一些代码,看到一些我不理解的“原因”。 int i = 6; int j; int *ptr = &i; int *ptr1 = &j j = i++; //now j == 6 and i == 7. Straightforward. 如果将运算符放在等号左侧怎么办? ++ptr = ptr1; 相当于 (ptr = ptr + 1) = ptr1; 而 ptr++ = ptr1; 相当于 ptr = ptr + 1 = …
71 c++  c  increment  prefix 

2
结合陀螺仪和加速度计数据
我正在使用Lego Mindstorm的NXT系统构建平衡机器人。我正在使用HiTechnic的两个传感器,第一个是加速度计,第二个是陀螺仪。我已经成功滤除了两个传感器的噪声以及在-90到90度之间的两个角度中的派生角度,其中0度是完美平衡的。 我的下一个挑战是将两个传感器值结合起来以校正陀螺仪随时间的漂移。下面是我根据实际数据创建的示例图,以演示陀螺仪的漂移: 我见过的使这些传感器坚如磐石的最常用方法是使用卡尔曼滤波器。但是,我不是微积分专家,我真的不懂数学符号,但是我确实懂源代码中的数学。 我使用的是RobotC(与其他C派生类一样),如果有人可以给我有关如何在C中实现此功能的示例,我将不胜感激。 感谢您的帮助! 解决方案结果: 好的,kersny通过向我介绍互补过滤器解决了我的问题。这是说明我的结果的图表: 结果1 结果#2 如您所见,该滤波器可校正陀螺仪的漂移,并将两个信号合并为一个平滑信号。 编辑:由于我还是要修复损坏的图像,所以我认为显示用于生成此数据的装备会很有趣:

7
Linux上的memcpy性能不佳
我们最近购买了一些新服务器,并且内存性能不佳。与我们的笔记本电脑相比,服务器的memcpy性能要慢3倍。 服务器规格 底盘和主板:SUPER MICRO 1027GR-TRF CPU:2个Intel Xeon E5-2680 @ 2.70 Ghz 内存:8x 16GB DDR3 1600MHz 编辑:我也在具有更高规格的另一台服务器上进行测试,并看到与上述服务器相同的结果 服务器2规格 底盘和主板:SUPER MICRO 10227GR-TRFT CPU:2个Intel Xeon E5-2650 v2 @ 2.6 Ghz 内存:8x 16GB DDR3 1866MHz 笔记本电脑规格 底盘:联想W530 CPU:1个Intel Core i7 i7-3720QM @ 2.6Ghz 内存:4x 4GB DDR3 1600MHz 操作系统 $ cat /etc/redhat-release Scientific Linux release …
71 c++  c  linux  memcpy  numa 

1
Microsoft加密API禁用RSAES-OAEP密钥传输算法的使用
我CryptEncryptMessage用来生成PKCS#7一封信封邮件。我正在使用szOID_NIST_AES256_CBC作为加密算法。 生成的消息似乎是有效的,但是它是RSAES-OAEP针对密钥传输算法的,它在野外的支持有限(Thunderbird,OpenSSL SMIME Module等不支持它)。 我希望CAPI恢复为旧版本RSAencryption以进行密钥传输。 有没有办法做到这一点,如果有办法而不是使用,我可以回复到低级消息传递功能 CryptEncryptMessage但是即使使用低级功能,我也找不到方法。 码: CRYPT_ENCRYPT_MESSAGE_PARA EncryptMessageParams; EncryptMessageParams.cbSize = sizeof(CMSG_ENVELOPED_ENCODE_INFO); EncryptMessageParams.dwMsgEncodingType = PKCS_7_ASN_ENCODING; EncryptMessageParams.ContentEncryptionAlgorithm.pszObjId = szOID_NIST_AES256_CBC; EncryptMessageParams.ContentEncryptionAlgorithm.Parameters.cbData = 0; EncryptMessageParams.ContentEncryptionAlgorithm.Parameters.pbData = 0; EncryptMessageParams.hCryptProv = NULL; EncryptMessageParams.pvEncryptionAuxInfo = NULL; EncryptMessageParams.dwFlags = 0; EncryptMessageParams.dwInnerContentType = 0; BYTE pbEncryptedBlob[640000]; DWORD pcbEncryptedBlob = 640000; BOOL retval = CryptEncryptMessage(&EncryptMessageParams, cRecipientCert, pRecipCertContextArray, pbMsgText, …


2
'int main(){return(0);上的浮点异常(SIGFPE);}'
我正在尝试为两个不同的Linux环境构建一个简单的C程序。在一个设备上,程序运行正常,在另一设备上,程序生成浮点异常。该程序除了从main返回0之外什么都不做,这使我相信与启动代码也许不兼容,也许是ABI? 该程序使用gcc编译,具有以下构建规范: 使用内置规格。目标:i386-redhat-linux配置为:../configure --prefix = / usr --mandir = / usr / share / man --infodir = / usr / share / info --enable-shared --enable-threads = posix --enable-checking = release --with-system-zlib --enable -__ cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages = c,c ++,objc,obj-c ++ ,java,fortran,ada --enable-java-awt = gtk --disable-dssi --disable-plugin --with-java-home = / …
71 c  linux  gcc  elf  sigfpe 

9
我应该在标题中使用#include吗?
是否有必要使用#include某些文件,如果在标头(* .h)中使用了此文件中定义的类型? 例如,如果我使用GLib并希望gchar在我的标头中定义的结构中使用基本类型,那么是否#include <glib.h>知道我的* .c文件中已经包含了它,是否有必要做一个? 如果是,我还必须将其放在#ifndef和之间#define或之后#define吗?

5
如何编写信号处理程序以捕捉SIGSEGV?
我想编写一个信号处理程序来捕捉SIGSEGV。我保护一块内存以供使用 char *buffer; char *p; char a; int pagesize = 4096; mprotect(buffer,pagesize,PROT_NONE) 这样可以保护从缓冲区开始的内存的页面大小字节免受任何读取或写入的影响。 其次,我尝试读取内存: p = buffer; a = *p 这将生成一个SIGSEGV,并且将调用我的处理程序。到现在为止还挺好。我的问题是,调用处理程序后,我想通过以下方式更改内存的访问写入: mprotect(buffer,pagesize,PROT_READ); 并继续正常运行我的代码。我不想退出该功能。在将来对同一内存进行写操作时,我想再次捕获该信号并修改写权限,然后记录该事件。 这是代码: #include <signal.h> #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <errno.h> #include <sys/mman.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) char *buffer; int flag=0; …

8
检查float是否为整数
如何检查float变量是否包含整数值?到目前为止,我一直在使用: float f = 4.5886; if (f-(int)f == 0) printf("yes\n"); else printf("no\n"); 但是我想知道是否有更好的解决方案,或者这个解决方案是否有(或很多)缺点。
71 c  floating-point  int 



9
覆盖C中的函数调用
为了记录调用,我想覆盖对各种API的某些函数调用,但是我也想在将数据发送到实际函数之前对其进行操作。 例如,假设我getObjectName在源代码中使用了一个被称为数千次的函数。有时我想暂时重写此功能,因为我想更改此功能的行为以查看不同的结果。 我创建一个新的源文件,如下所示: #include <apiheader.h> const char *getObjectName (object *anObject) { if (anObject == NULL) return "(null)"; else return "name should be here"; } 我会像往常一样编译所有其他源代码,但是在与API库链接之前,我先将其与该函数链接。这工作正常,除非我显然无法在覆盖函数中调用真实函数。 有没有一种更简单的方法来“重写”一个函数而又不会得到链接/编译错误/警告?理想情况下,我希望能够仅通过编译和链接一个或两个额外的文件来覆盖该功能,而不是随意使用链接选项或更改程序的实际源代码。


8
Makefile可以编译多个C程序?
这是一个非常简单的问题,但是我是makefile的新手。我正在尝试制作一个将编译两个独立程序的makefile: program1: gcc -o prog1 program1.c program2: gcc -o prog2 program2.c 在线上的所有示例都比我需要的更多细节,令人困惑!我真正想要做的就是运行这两gcc行。我究竟做错了什么?
71 c  makefile 

4
使用printf()保留两位小数
我正在尝试使用printf()以下方法将数字写到两位小数: #include <cstdio> int main() { printf("When this number: %d is assigned to 2 dp, it will be: 2%f ", 94.9456, 94.9456); return 0; } 运行程序时,将得到以下输出: # ./printf When this number: -1243822529 is assigned to 2 db, it will be: 2-0.000000 这是为什么? 谢谢。
71 c++  c  printf  decimal 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.