Questions tagged «c»

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

7
使用C解析JSON
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 6年前关闭。 改善这个问题 我正在尝试寻找一种用C解析JSON的好方法。我真的不需要庞大的库或任何东西,我宁愿拥有体积小,重量轻,功能最少的东西,但有很好的文档。 有人有什么可以指点我的吗?
82 c  json 


5
C-结构内部的功能
我试图在结构内创建一个函数,到目前为止,我有以下代码: typedef struct client_t client_t, *pno; struct client_t { pid_t pid; char password[TAM_MAX]; // -> 50 chars pno next; pno AddClient() { /* code */ } }; int main() { client_t client; //code .. client.AddClient(); } 错误:client.h:24:2:错误:在“ {”令牌之前应为“:”,“,”,“;”,“}”或“属性”。 哪个是正确的方法?
82 c  function  struct 

6
纯功能的好处
今天,我在阅读有关纯函数的信息,并对其使用感到困惑: 如果函数针对同一组输入返回相同的一组值并且没有任何可观察到的副作用,则称该函数为纯函数。 例如strlen()是纯函数,而rand()不是纯函数。 __attribute__ ((pure)) int fun(int i) { return i*i; } int main() { int i=10; printf("%d",fun(i));//outputs 100 return 0; } http://ideone.com/33XJU 上面的程序的行为与没有pure声明时的行为相同。 将函数声明为pure[如果输出没有变化]有什么好处?
81 c  pure-virtual 

5
“ int * nums = {5,2,1,4}”导致分段错误
int *nums = {5, 2, 1, 4}; printf("%d\n", nums[0]); 导致段错误,而 int nums[] = {5, 2, 1, 4}; printf("%d\n", nums[0]); 没有。现在: int *nums = {5, 2, 1, 4}; printf("%d\n", nums); 打印5。 基于此,我猜想数组初始化符号{}将数据盲目地加载到左侧的任何变量中。当它为int []时,将根据需要填充数组。当它为int *时,指针将被5填充,指针存储之后的内存位置将被2、1和4填充。因此nums [0]尝试取消引用5,从而导致段错误。 如果我错了,请纠正我。如果我是正确的,请详细说明,因为我不理解为什么数组初始化程序会以它们的方式工作。
81 c  arrays  pointers 

6
枚举常量在C和C ++中的行为不同
为什么这样做: #include <stdio.h> #include <limits.h> #include <inttypes.h> int main() { enum en_e { en_e_foo, en_e_bar = UINT64_MAX, }; enum en_e e = en_e_foo; printf("%zu\n", sizeof en_e_foo); printf("%zu\n", sizeof en_e_bar); printf("%zu\n", sizeof e); } 4 8 8用C和8 8 8C ++(在具有4字节整数的平台上)打印? 我的印象是,UINT64_MAX赋值将强制所有枚举常量至少为64位,但en_e_foo在纯C中仍为32位。 差异的理由是什么?
81 c++  c 

4
结构有什么特别之处?
我知道在C语言中,我们不能从函数返回数组,而只能返回指向数组的指针。但是我想知道有什么特别之处structs,即使它们可能包含数组,它们也可以由函数返回。 为什么struct包装使以下程序有效? #include <stdio.h> struct data { char buf[256]; }; struct data Foo(const char *buf); int main(void) { struct data obj; obj = Foo("This is a sentence."); printf("%s\n", obj.buf); return 0; } struct data Foo(const char *buf) { struct data X; strcpy(X.buf, buf); return X; }

4
POSIX线程和信号
我一直在尝试理解POSIX线程和POSIX信号如何交互的复杂性。我特别感兴趣: 控制信号传递到哪个线程的最佳方法是什么(假设它首先不会致命)? 告诉另一个线程(实际上可能很忙)信号到达的最佳方法是什么?(我已经知道,使用信号处理程序中的pthread条件变量是一个坏主意。) 如何安全处理将发生信号的信息传递给其他线程?这是否需要在信号处理程序中发生?(我通常不希望杀死其他线程;我需要一种更巧妙的方法。) 作为我为什么要这样做的参考,我正在研究如何将TclX包转换为支持线程,或者将其拆分并至少使一些有用的部件支持线程。信号是那些特别令人感兴趣的部分之一。
81 c  pthreads  signals 

5
最好的(便携式)跨平台任意精度数学库是什么?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 5年前关闭。 改善这个问题 我正在寻找一个使用C或C ++编写的良好的任意精度数学库。您能给我一些建议吗? 主要要求: 它必须处理任意大的整数-我的主要兴趣是整数。如果您不知道任意大这个词的含义,请想象一下类似100000的东西!(阶乘为100000)。 在库初始化或对象创建期间,不必指定精度。精度应仅受系统可用资源的限制。 它应利用平台的全部功能,并应本地处理“小”数字。这意味着在64位平台上,计算(2 ^ 33 + 2 ^ 32)应该使用可用的64位CPU指令。该库不应以与在同一平台上使用(2 ^ 66 + 2 ^ 65)相同的方式来计算该值。 它必须有效地处理加(+),减(-),乘(*),整数除(/),余数(%),幂(**),增量(++),减(--),GCD,阶乘和其他常见的整数算术计算。能够处理不会产生整数结果的函数(例如平方根和对数)是一个加号。处理符号计算的能力甚至更好。 这是我到目前为止发现的内容: Java的BigInteger和BigDecimal类:到目前为止,我一直在使用它们。我已经阅读了源代码,但是我不理解下面的数学原理。它可能基于我从未学过的理论和算法。 内置整数类型或bc,Python,Ruby,Haskell,Lisp,Erlang,OCaml,PHP以及其他一些语言的核心库:我使用了其中一些,但不知道它们使用的是哪个库,或者他们正在使用哪种实现。 我已经知道的: 使用char十进制数字和char*十进制字符串,做用数字计算for-loop。 使用int(或long int或long long)作为基本的“单位”,并使用该类型的数组作为任意长整数,并使用for-loop对元素进行计算。 使用整数类型将十进制数字(或几位数)存储为BCD(二进制编码的十进制)。 布斯的乘法算法。 我不知道的是: 不使用天真的方法,将上述二进制数组以十进制打印。天真的方法的一个示例:(1)从最低到最高的位相加:char*1、2、4、8、16、32 ,……(2)使用上面提到的-string来存储中间十进制结果)。 我的赞赏: 在GMP,MPFR,decNumber(或您认为不错的其他库)上进行了很好的比较。 关于我应该阅读的书籍和文章的好的建议。例如,用数字说明非原始的二进制到十进制转换算法是如何工作的将是很好的。道格拉斯·W·琼斯(Douglas W. Jones)的文章“有限精度的二进制到十进制转换”是一个很好的例子。 任何帮助一般。 如果您认为使用(或或)可以轻松解决此问题,请不要回答此问题。如果您这样认为,则您将不理解所涉及的问题。doublelong doublelong long double
81 c++  c  biginteger  bigdecimal  gmp 

2
Android AudioRecord强制另一个流到MIC音频源
更新3:我已经与另一位开发人员建立了合作伙伴关系,我们似乎发现有人可以为此花很多钱。他们给我们发送了一个测试apk,它似乎有效。我们将继续购买源。我希望我们不会被骗。我一发现就会更新 更新2:仍在努力。经过更多痛苦的日子后,我现在认为没有什么幻想了,但他们只是在本机端使用AudioFlinger(请参阅链接)来调用AudioFlinger :: setParameters 我现在正在寻找如何编写一个简单的JNI来使用audio_io_handle_t ioHandle,const String8&keyValuePairs调用AudioFlinger :: setParameters 我知道keyValuePairs可以是什么,但不是关于audio_io_handle_t的线索 更新:我现在相信其他应用程序可能会在CAF中使用QCOM音频。见audio_extn_utils_send_audio_calibration在链接相同 和voice_get_incall_rec_snd_device在链接相同 我没有C / ++知识。如何确定是否可以从本机端调用这些方法?由于其他应用程序可以,因此必须有一种方法。 我每天至少要花5-6个小时来努力解决40余天。我不确定SO是否允许,但我也很乐意为正确答案捐款。 我有一个使用VOICE_CALL音频源的通话记录应用程序。尽管ASOP并未实现/授权它,但大多数制造商已经实现了VOICE_CALL,并且使用VOICE_CALL音频源的应用程序在许多设备上都能正常工作。直到Android 6。 Google使用Android 6更改了此行为。现在,打开VOICE_CALL音频源需要android.permission.CAPTURE_AUDIO_OUTPUT,该权限仅授予系统应用程序。 这实质上会停止通话录音,或者应该停止通话录音。好吧,它适用于我的和200多个其他通话记录应用程序,其中3个已经找到解决此限制的方法。 我一直在使用Android 6的许多不同手机上尝试这些应用程序,并发现它们在记录方式上的某些特征。 它们都使用Android AudioRecord类并打开MIC音频源。我也做; 但是在我的应用程序上,我只能从MIC而不是从对方获得音频。我发现告诉他们在开始录制之前或之后,他们正在发出某种系统调用。 查看以下日志表格,其中一个成功记录VOICE_CALL的应用程序之一,即使它使用MIC进行记录也是如此。看起来应用程序似乎是一些如何将VOICE_CALL音频源混入/路由/流/合并到MIC的方式。 - D/audio_hw_primary: in_set_parameters: enter: kvpairs=input_source=1;routing=-2147483644 - D/PermissionCache: checking android.permission.MODIFY_AUDIO_SETTINGS for uid=10286 => granted (432 us) - D/audio_hw_primary: in_set_parameters: enter: kvpairs=input_source=4;routing=-2147483584;format=1 - D/audio_hw_primary: select_devices: …

30
是否有任何理由使用C而不是C ++进行嵌入式开发?
题 我的硬件C ++和C89上有两个编译器 我正在考虑将C ++与类一起使用,但不要使用多态性(以避免使用vtables)。我想使用C ++的主要原因是: 我更喜欢使用“内联”函数而不是宏定义。 我想使用名称空间作为前缀,使代码混乱。 我认为C ++的类型更安全,主要是因为模板和冗长的强制转换。 我真的很喜欢重载的函数和构造函数(用于自动转换)。 在为非常有限的硬件(4kb RAM)开发时,您是否看到任何理由坚持使用C89? 结论 感谢您的回答,它们确实很有帮助! 我考虑了这个问题,因此我坚持使用C,主要是因为: 在C语言中预测实际代码会更容易,如果只有4kb的ram,这非常重要。 我的团队主要由C开发人员组成,因此高级C ++功能将不会经常使用。 我找到了一种在C编译器(C89)中内联函数的方法。 您提供了很多好的答案,很难接受一个答案。不幸的是,我无法创建维基并接受它,因此我将选择一个让我思考最多的答案。
81 c++  c  embedded  c89 

7
了解Linux内核中的container_of宏
当我浏览Linux内核时,我发现了一个container_of定义如下的宏: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 我了解container_of的作用,但我不明白的是最后一句话,即 (type *)( (char *)__mptr - offsetof(type,member) );}) 如果我们按如下方式使用宏: container_of(dev, struct wifi_device, dev); 最后一句话的相应部分是: (struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev); 看起来什么也没做。有人可以在这里填补空白吗?

6
为面向对象的C ++代码开发C包装API
我正在寻求开发一组C API,这些C API将包装我们现有的C ++ API以访问我们的核心逻辑(以面向对象的C ++编写)。本质上,这将是一个胶粘API,它允许我们的C ++逻辑可被其他语言使用。有什么好的教程,书籍或最佳实践介绍围绕面向对象的C ++包装C涉及的概念?
81 c++  c  wrapper 

12
在C / C ++中检测签名溢出
乍一看,这个问题似乎与“如何检测整数溢出”重复出现。,但实际上有很大的不同。 我发现,虽然检测无符号整数溢出非常简单,但是在C / C ++中检测带符号溢出实际上比大多数人想象的要困难。 最明显但最幼稚的方式是: int add(int lhs, int rhs) { int sum = lhs + rhs; if ((lhs >= 0 && sum < rhs) || (lhs < 0 && sum > rhs)) { /* an overflow has occurred */ abort(); } return sum; } 这样做的问题是根据C标准,有符号整数溢出是未定义的行为。 换句话说,根据标准,甚至在导致签名溢出时,程序就如同取消引用空指针一样无效。因此,您不能导致未定义的行为,然后尝试在事后检测溢出,如上述后置条件检查示例中所示。 即使上面的检查可能在许多编译器上都有效,但您不能指望它。实际上,由于C标准说未定义有符号整数溢出,因此某些编译器(如GCC)会在设置优化标志时优化上述检查,因为编译器认为有符号溢出是不可能的。这完全中断了检查溢出的尝试。 因此,另一种检查溢出的可能方法是: …

9
如何使用终端在Mac OS X上运行C程序?
我是C的新手。这是我的“世界,您好!” 程序。 #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } 在尝试使用Terminal运行它之后,它说: MacBook-Pro-MacBook:~ macbook$ /Users/macbook/Desktop/peng/Untitled1 -bash: /Users/macbook/Desktop/peng/Untitled1: Permission denied MacBook-Pro-MacBook:~ macbook$ 为什么?
81 c  macos  bash 

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.