隐式类型促销规则

本文旨在用作关于C中隐式整数提升的常见问题解答,特别是由通常的算术转换和/或整数提升引起的隐式提升。 例1) 为什么这会给出一个奇怪的,大整数而不是255? unsigned char x = 0; unsigned char y = 1; printf(“%u\n”, x – y); 例2) 为什么这会给“-1大于0”? unsigned int a = 1; signed int b = -2; if(a + b > 0) puts(“-1 is larger than 0”); 例3) 为什么更改上面示例中的类型以short解决问题? unsigned short a = 1; signed short b = -2; if(a + b > […]

sizeof没有()做什么?

当我问他什么sizeof * q时, 这个问题的作者对我很开心……他告诉我这是一个非常基本的C问题,我应该检查一下。 但是当我环顾四周并且之前没有见过有人询问时,我现在就自己做了: 如果在没有括号和/或类型的情况下使用它,C中的sizeof做什么?

将double / float转换为字符串

我需要将浮点数转换为十进制(或其他基数)中的等效字符串。 首先需要以xE+0格式进行转换,其中x是浮点数。 我的想法是首先将浮点数截断为临时整数,然后将该整数转换为字符串,然后考虑小数部分,将其乘以10而小数部分不变为0 。 将小数部分转移到小数点的左侧后,再次将整数应用于字符串函数,并将小数部分转换为字符串。 有没有更好的方法,哪个比这更快? 这种方法会引起任何副作用吗? 要将浮点数转换为指数表示,我应该如上所述,然后调整功率吗? 或者直接对IEEE 754浮点表示进行位掩码,并将每个部分转换为字符串。 注意:不能使用其他function,因为我可以访问绝对没有库函数。 这段代码进入玩具内核。

如何在高海拔照片中有效地找到地平线?

我试图检测从高空拍摄的图像中的地平线,以确定相机的方向。 我也试图快速运行 – 理想情况下,我希望能够在Raspberry Pi上实时处理帧(即每秒几帧)。 到目前为止我采取的方法是基于这样一个事实:在高海拔地区,天空非常暗,如下: 我试过的是从整个图像中取样并将它们分成浅色和深色样本,并在它们之间画一条线。 然而,由于大气层的模糊性,这将地平线置于其实际位置之上: 这是我的代码(在Javascript中为了便于网络演示): function mag(arr) { return Math.sqrt(arr[0]*arr[0]+arr[1]*arr[1]+arr[2]*arr[2]) } // return (a, b) that minimize // sum_i r_i * (a*x_i+b – y_i)^2 function linear_regression( xy ) { var i, x, y, sumx=0, sumy=0, sumx2=0, sumy2=0, sumxy=0, sumr=0, a, b; for(i=0;i<xy.length;i++) { x = xy[i][0]; y = xy[i][2]; r = […]

function自我回归

是否可以声明一些返回该类型的函数类型func_t , func_t ? 换句话说,函数是否可能返回自身? // func_t is declared as some sort of function pointer func_t foo(void *arg) { return &foo; } 或者我是否必须使用void *和类型转换?

动态分配C中的数组数组

我并不真正理解C中的一些基本内容,比如动态分配数组数组。 我知道你可以这样做: int **m; 为了声明一个二维数组(随后将使用一些* alloc函数分配)。 也可以通过*(*(m + line) + column) “轻松”访问它。 但是我应该如何为该数组中的元素赋值? 使用gcc以下语句m[line][column] = 12; 因故障而失败。 任何文章/文档将不胜感激。 🙂

MPI_Bcast一个动态的2Darrays

我试图将带有bcast的动态二维数组传递给所有级别。 我有以下代码。 #include #include int main(int argc, char **argv) { float **array; int rank,size,i,j; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank==0) { array = (float **)malloc(10*sizeof(float)); for(i=0;i<10;i++) array[i] = (float *)malloc(10*sizeof(float)); for(i=0;i<10;i++) for(j=0;j<10;j++) array[i][j]=i+j; } MPI_Bcast(array,10*10,MPI_FLOAT,0,MPI_COMM_WORLD); MPI_Finalize(); } 由于某种原因,我无法理解我得到分段错误。 谁知道问题是什么?

在malloc()之后写入指针越界,不会导致错误

当我尝试下面的代码时它工作正常。 我错过了什么吗? main() { int *p; p=malloc(sizeof(int)); printf(“size of p=%d\n”,sizeof(p)); p[500]=999999; printf(“p[0]=%d”,p[500]); return 0; } 我尝试使用malloc(0 * sizeof(int))或其他任何东西,但它工作得很好。 当我根本不使用malloc时,程序只会崩溃。 因此,即使我为数组p分配了0个内存,它仍然可以正确地存储值。 那么,为什么我甚至打扰了malloc呢?

当大小是变量而不是常量时,如何创建数组?

我有一个接收变量int的方法。 该变量构成一个数组大小(请不要给我一个向量)。 因此,我需要在我的方法中初始化一个const int来初始化一个特定大小的数组。 问题:我该怎么做? void foo(int variable_int){ int a[variable_int] = {0}; //error }

奇怪的数组初始化表达式?

以下代码是什么意思? 代码来自GCC的回归测试套件。 static char * name[] = { [0x80000000] = “bar” };