Tag: c99

将2D数组传递给相应的指针参数有什么问题?

前几天我在C大学做了一些矩阵计算,我开始使用5×5矩阵,所以我把它硬编码到源代码中。 这是一个二维的二维数组,如: /** * This is the probability-matrix for reaching from any profile * to another by randomly selecting a friend from the friendlist. */ static const double F[5][5] = { /* P , F , L , A , S */ /* Peter */ {0 , 0.5 , 0.5 , 0 , 0 }, […]

32位与64位环境中的int_max

INT_MAX在32位和64位环境之间是否不同? 虽然我听说人们说64位环境只使用32位环境的INT_MAX,但似乎情况确实如此。

是(x ++,y)+(y ++,x)未定义或未指定,如果未指定,它可以计算什么?

逗号序列运算符在表达式中引入序列点 。 我想知道这是否意味着下面的程序避免了未定义的行为。 int x, y; int main() { return (x++, y) + (y++, x); } 如果它确实避免了未定义的行为,它仍然可能未指定,即返回几个可能值中的一个。 我认为在C99中,它只能计算1 ,但实际上,各种版本的GCC将这个程序编译成一个返回2的可执行文件。 Clang生成一个返回1的可执行文件,显然与我的直觉一致。 最后,这是C11改变了吗?

MS VS 2008和C99

我感兴趣地读了一篇文章“支持C99的普遍性如何?”。 其中一条评论指出微软不支持C99。 但注释符号//适用于VS 2008,此符号位于C99中。 我有两个问题: VS 2008在多大程度上支持C99? 在同一代码中将C89和C99语法混合在一起是否可以? 因此,如果我在C89中编写代码然后发表评论//。 这意味着我有混合编码。 那么在这种情况下编译器会做什么呢? 首先用c89检查我的代码,然后用C99检查我是否使用//进行评论?

格式与文件内容不匹配时fscanf的行为

如果文件的内容与传递给fscanf的格式字符串不匹配,那么在下次调用fscanf时会发生什么? 假设一个文件包含以下两行: 9000 pig dog 4 5 2 程序试图解析打开的文件( fp ): int a = 1, b = 1, c = 1; int x = 1, y = 1, z = 1; fscanf(fp, “%d %d %d”, &a, &b, &c); fscanf(fp, “%d %d %d”, &x, &y, &z); 我怀疑a现在会持有9000而b和c继续保持值1 – 但是x , y和z会发生什么? C99标准是否保证x , y和z保持值4和2 – 或者文件流的位置指示器保证在解析失败后保持不变,导致x保持值9000而y和z保持值1 […]

C99相当于MATLAB“filter”?

为什么MATLAB和C版本会产生不同的结果? MATLAB: [B_coeffs, A_coeffs ] = butter(4, 100/(16000/2), ‘high’); state = zeros( 4, 1 ); input = zeros( 64,1 ); for i=1:64 input(i)=i; end [filtered_output, state] = filter( B_coeffs, A_coeffs, input, state ); C: int main(…) { for(int test=0; teststate[0], z1 = hpf->state[1], z2 = hpf->state[2], z3 = hpf->state[3]; unsigned int N = 64; unsigned […]

是否可以在C中创建自定义宽度整数?

C标准和C编译器带有固定宽度的整数类型,例如uint8_t , int16_t等。 有没有一种方法可以在C中定义一个128位整数,它可以在代码中使用与现有固定宽度整数相同的语义?

何时在C中使用plain char类型

在普通C中,按标准有三种不同的“字符”类型: 普通char ,其中一个人的签名是实现定义的。 signed char 。 unsigned char 。 让我们假设至少是C99,其中stdint.h已经存在(所以你有int8_t和uint8_t类型作为可推荐的替代方案,显式宽度为有符号和无符号字符)。 对于我来说,似乎使用普通char类型只有在需要接口标准库的函数(如printf )时才真正有用(或必要),并且在所有其他场景中,而不是要避免。 使用char可能会在实现上签名时导致未定义的行为,并且出于任何原因,您需要对此类数据执行任何算法。 在处理例如Unicode文本(或使用大于127的值表示字符的任何代码页)时,使用适当类型的问题可能是最明显的,否则可以作为普通C字符串处理。 但是,相关的string.h函数都接受char ,如果这样的数据是类型化的char ,那么在尝试解释它时会产生问题,例如对于能够处理其编码的显示例程。 在这种情况下,最值得推荐的方法是什么? 是否有任何特殊原因可以推荐使用char不是stdint.h的合适的固定宽度类型?

有没有人为MSP430的IAR Embedded Workbench实现了__getzone()?

我不得不在我的应用程序中处理一些时间转换。 我想尽可能坚持使用标准库函数。 现在我使用time_t结构作为我的系统时基。 但是,某些设备可以将时间同步到我的设备,该时间可能是也可能不是UTC。 此外,我的设备将时间同步到另一台设备,该时间将始终为UTC。 无论如何,我可以询问用户什么时区是同步到我的设备的时间以及他们是否使用DST。 当我的设备获得时间同步时,我可以使用mktime直接生成我的时间戳(我的设备系统时间需要与他们为时间戳目的同步的时间相匹配,否则我必须不断进行转换),然后我可以如果我知道我的时间同步来自非UTC源,则使用gmtime()来获取UTC时间。 问题是默认情况下localtime()和gmtime()将返回相同的值,因为默认情况下库认为它是在UTC时间内,并且没有DST或时区偏移。 所以,我认为处理这个问题的方法是实现和覆盖库__getzone函数。 来自EW430_CompilerReference.pdf的第106页 要使__time32,__ time64和date函数有效,必须实现函数clock,__ time32,__ time64和__getzone。 无论使用__time32还是__time64取决于您用于time_t的接口,请参见time.h,第304页。 … __getzone的默认实现指定UTC(协调世界时)作为时区。 Q1:在我的推理中,我是否在正确的轨道上,做我想做的最好的方法是实现这个__getzone函数? 我跟踪的原因是因为__getzone返回的值是一个古怪的字符串w /格式如下: :[XXX [:YYY [:NNN [:DST [:DST …]]]]] 其中XXX是标准时区名称(例如,EST的GMT-5),YYY是夏令时时区名称(例如EST的GMT-4),NNN是UTC的formsHHMM的数字偏移(并且可以有 – 符号然后,DST为夏令时规则指定了一系列选项,这些规则有自己的恼人格式。 无论如何,这对我来说应该是非常直接的,因为我只担心具有相同DST规则的加拿大和美国。 Q2:有没有人有任何形成该字符串的示例代码,以便检查我对此的理解?

使用GCC在C中的函数重载 – 具有多个参数的函数

在前面的一个问题中,当每个函数只接受一个参数时,我找到了一种在C99中重载函数的方法。 请参阅以下内容中的答案: C中的函数重载使用GCC – 编译器警告以获取详细信息。 现在我已经找到了使用单个参数函数的方法,我想知道如何对带有多个参数的函数进行此操作。 我假设它将与__VA_ARGS__和使用…但我似乎无法找到任何有效甚至想要编译的东西。 这适用于带有2个参数的打印: #define print(x, y) \ __builtin_choose_expr(__builtin_types_compatible_p(typeof(x), int) && \ __builtin_types_compatible_p(typeof(y), int), print_int, \ (void)0)(x, y) 但如果我还想要另一个带有一个参数的版本,我就无法重新定义它。 添加这将给我一个错误,说重新定义print : #define print(x) \ __builtin_choose_expr(__builtin_types_compatible_p(typeof(x), char[]), print_string, \ (void)0)(x) 如何重载打印,以便它可以使用2个整数作为输入或字符数组? 示例用法: print(1, 2); print(“this”); 或者甚至更好……我怎样才能使它与任何类型的组合或任意数量的参数一起使用? 还要记住,因为这是C99,_Generic关键字不可用。