Tag: arrays

Turbo Carrays问题

我只是想问一下我的代码。 #define LIM 40 main() { int day=0; float temp[LIM]; clrscr(); do { printf(“Enter temperature for day %d.”, day); scanf(“%f”, &temp[day]); } while(temp[day++] > 0) } 我正在使用TurboC,此代码重复要求用户输入温度并将响应存储在数组temp中 ,直到输入0或更低的温度。 我已经使用#define指令给标识符LIM赋值40,因为我希望这个程序接受任意数量的温度,最多可达40个。 但它实际上接受了多达48个 ……我该怎么做才能使它能够只接受40个? 提前致谢

在C中拆分数组

假设我有一个数组,我想从某些索引范围中删除元素。 如果我提前知道数组的大小,数组中每个元素的大小,以及我想删除的索引范围,有什么方法可以避免复制新数组?

MINLOC是否适用于从索引0开始的数组? (Fortran 90/95)

使用C一段时间后,我回到Fortran并在我的代码中将数组从索引0分配到N: real(kind=dp), dimension(:), allocatable :: a allocate(a(0:50)) 我需要找到数组最小绝对值的索引,所以我使用MINLOC,并检查这个我将它与MINVAL进行比较: minloc(abs(a(:))) minval(abs(a)) MINLOC的结果是指数42但MINVAL的结果相当于41 。 以下是输出的相关部分: Index ia(i) 39 0.04667 40 0.02222 41 0.00222 !This was clearly the minimum value 42 0.02667 MINLOC = 42 MINVAL = 0.00222 我假设这与Fortran内部没有正确处理索引为0的数组有关,因为以这种方式声明数组不是标准的Fortran样式(但它仍然是允许的!)。 任何人都可以确认这一点或提供解决方法吗?

在C中使用非标准的数组声明

我遇到了以下代码,它以非标准的方式在C中声明了char *数组: /* Message Type description array */ char *msgType[M_LAST_MSG] = { [M_INIT_MSG] “Init”, [M_RESET_MSG] “Serdes Reset” }; M_INIT_MSG , M_RESET_MSG和M_LAST_MSG是枚举,其对应值为0,1和2.根据正式的C文档,此数组中的变量是字符串(文字),那么以这种方式使用这些枚举的目的是什么呢?备份文件? 用ARM gcc编译器编译gcc-arm-none-eabi 。

是否更快地访问静态或动态分配的内存?

在C中有两种分配全局数组的方法: 静态 char data[65536]; 动态 char *data; … data = (char*)malloc(65536); /* or whatever size */ 问题是,哪种方法有更好的表现? 多少钱? 理解它,第一种方法应该更快。 因为使用第二种方法,要访问数组,每次访问时都必须取消引用元素的地址,如下所示: 读取包含指向数组开头的指针的变量data 计算特定元素的偏移量 访问元素 使用第一种方法,编译器将data变量的地址硬编码到代码中,跳过第一步,因此我们有: 从编译时定义的固定地址计算特定元素的偏移量 访问数组的元素 每次内存访问相当于大约40个CPU时钟周期,因此,使用动态分配,特别是对于不频繁读取,与静态分配相比可能会显着降低性能,因为data变量可能会被一些更频繁访问的变量从缓存中清除。 相反,解除引用静态分配的全局变量的成本是0,因为它的地址已经在代码中进行了硬编码。 它是否正确?

C中多个数组的笛卡尔积

我能够在C.中实现静态数组数的笛卡尔积。但是我想构建一个动态地获取输入数组的代码。有人可以解释如何“只使用数组”这样做。如果不可能的话有arrays请告诉我其他解决方案。谢谢。这是我的代码,下面是3个arrays的笛卡尔积。 #include int main(void) { int array1[100]; int array2[100]; int array3[100]; int cartesian_array[100][100]; int m,n,o; int i,j; int p=0,q=0,r=0; int x,y,z; int cartesian_arr_row_len; int cartesian_arr_col_len; printf(“Enter the size of first array:\n”); scanf(“%d”,&m); printf(“Enter the size of second array:\n”); scanf(“%d”,&n); printf(“Enter the size of third array:\n”); scanf(“%d”,&o); printf(“Enter the first array elements:\n”); for(i=0;i<m;i++) scanf("%d",&array1[i]); printf("Enter the […]

将C数组传递给Rust函数

我正在尝试制作Rust dylib并使用其他语言,如C,Python等。 我已成功调用了一个Rust函数和来自python的i32参数。 现在我正在尝试创建一个函数,它接受一个数组(指向它的指针,或者将数据集传递给Rust lib所需的任何东西)。 #![crate_type = “dylib”] #[no_mangle] pub extern fn rust_multiply(size: i32, arrayPointer: &i32) -> i32 { *(arrayPointer) } 这按预期工作。 但 #![crate_type = “dylib”] #[no_mangle] pub extern fn rust_multiply(size: i32, arrayPointer: &i32) -> i32 { *(arrayPointer + 1) // trying to get next element } 失败了 src/lib.rs:5:2: 6:2 error: type `i32` cannot be […]

C89中的可变长度数组?

我已经读过C89不支持可变长度数组,但以下实验似乎反驳了: #include int main() { int x; printf(“Enter a number: “); scanf(“%d”, &x); int a[x]; a[0] = 1; // … return 0; } 当我这样编译时(假设filename是va_test.c ): gcc va_test.c -std=c89 -o va_test 有用… 我错过了什么? 🙂

将Fortran的二维数组传递给C.

我无法将Fortran中的二维数组传递给C.以下是我的C函数,它只是在屏幕上显示数组元素。 #include void print2(double *arr , int *n) { int y = *n; printf(“\ny = %d”, y); for(int i =0; i<y; i++) { for (int j = 0; j < y; j++) printf("%.6g", *((arr + i*y) + j)); printf("\n"); } } 到目前为止,我的Fortran代码如下: program linkFwithC use, intrinsic :: iso_c_binding implicit none real, dimension(3,3)::a a(1,1)=1 a(1,2)=2 a(1,3)=3 […]

声明一个负长度数组

当你创建一个负长度数组时,C会发生什么? 例如: int n = -35; int testArray[n]; for(int i = 0; i < 10; i++) testArray[i]=i+1; 此代码将编译(并且在启用-Wall时不会显示任何警告),并且您似乎可以毫无问题地分配给testArray[0] 。 分配过去会给出段错误或非法指令错误,并从数组中读取任何内容,说“中止陷阱”(我不熟悉那个)。 我意识到这在某种程度上是学术性的,并且(希望)永远不会出现在现实生活中,但C标准是否有任何特定的方式来处理这样的数组,或者它是否因编译器而异?