Tag: 循环

使用C生成所有元组 – 比嵌套循环更好的方法?

我有一个长度为11的数组double x[]和一个函数f(double x[]) 。 我想通过离散化找到函数f()的最小值。 因此对于给定值val1, val2, …, valn我需要一个循环通过{val_1,…,val_n} ^ 11中的x的所有元组。 我可以很容易地使用11个嵌套循环,但这真的是我能做的最有效吗? 编辑:澄清事物:函数f()在11维集上定义。 我想评估一个11维网格的顶点上的函数。 对于网格大小h ,数组x[]的条目的可能值可以是0 , h , 2*h ,…, n*h = val_1,val_2,…,val_n。 所以在开始时应该评估f(val_1, val_1, …, val_1) ,然后是f(val_1, val_1, …,val_1, val_2) ,…和f(val_n, val_n, …, val_n)和f(val_n, val_n, …, val_n) 。 我实际上并不关心顺序,但我确实关心速度,因为有很多这样的元组。 确切地说,有n ^ 11个这样的元组。 因此,对于n = 10 f() ,必须评估10 ^ 11次。 我的计算机每秒可以评估f()约5 * 10 ^ […]

为什么GCC以不同方式处理两个相似的循环?

注意: 如果我理解下面的代码是正确的,它将跳过整个循环,因为当比较unsigned (j)和signed (-1)时,似乎-1将转换为UINT_MAX 。 (像这个问题解释 ) 第一个循环: unsigned int j = 10; for (; j > -1; –j) { —> `>` printf(“%u”, j); } 第一个循环的汇编代码的一部分: movq %rsp, %rbp .cfi_def_cfa_register 6 movl %edi, -20(%rbp) movq %rsi, -32(%rbp) movl $10, -4(%rbp) nop —>**elision** popq %rbp .cfi_def_cfa 7, 8 ret 第二个循环的第二个循环: unsigned int j = 10; for […]

对于循环扫描,c中的时间少一个

用户输入一串字符,但在此之前输入字符串的大小。 然后我必须阅读并计算每个字母输入的次数。 这是我的代码: #include char ab[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’}; //Size = 26 int main(void) { int i, j, size, counter[26]; char temp; for(i=0; i<26; i++) { counter[i]=0; } scanf("%d",&size); for(i=0; i<size; […]

Scanfvalidation

有人可以帮我validation我在下面的Scanf的输入。 如果Scanf在不正确的范围内或者不是整数,我希望程序要求重新输入数据。 我在使用if语句之前放入了do while循环,但是当我编译它时,第一个printf和scanf只是循环 #include #include int MenuLoop = 0; int MaxPackets = 4; int currentPackets= 0; int menu; /********************************************************* * Node to represent a Cat which includes a link reference* * a link list of nodes with a pointer to a Cat Struct * * would be better but this is for illustartion only! […]

循环并将数据分配给结构成员的宏错误地将结构成员识别为指针

我的问题是atoi正在将字符串的hex内存地址转换为十进制,而不是字符串中包含的内容。 它是在宏中执行此操作。 当宏定义使它成为int时,为什么将struct-> member解释为指针? 下面的伪代码: if (struct.member == int)? struct.member = atoi(data) : struct.member = data; 该程序的这一部分的目的是从包含有关结构属性的信息的.csv文件中检索数据。 我可以接受一个“id”并将每个单元格字符串存储到一个字符串数组(csvRowSplit)中。 但是,我想将数组的内容传输到包含不同数据类型的结构(我想用来检索玩家保存的属性,攻击方法,商店物品等的方法)。 硬编码很容易: opponent->att = atoi(csvSplitRow[0]); opponent->= atoi(csvSplitRow[1]); opponent->hitpoints = atoi(csvSplitRow[2]); opponent->description = csvSplitRow[3]); 然而,这种结构成分更多,并且不是非常灵活或可重复。 我已经定义了一个宏来循环遍历结构的元素,并将csvSplitRow []与变量配对,如果需要转换为atoi。 #define X_FIELDS \ X(char*, description, “%s”) \ X(int, xpreward, “%d”) \ X(int, att, “%d”) \ /* … */ X(int, crit, “%d”) […]

使用malloc循环来保证malloc的结果是不是很糟糕?

像这样分配内存是不好的做法吗?: FOO *foo; while (!(foo = malloc(sizeof(FOO)))) ;

如何循环select()无限制地轮询数据

#include #include #include #include int main () { char name[20]; fd_set input_set; struct timeval timeout; int ready_for_reading = 0; int read_bytes = 0; /* Empty the FD Set */ FD_ZERO(&input_set ); /* Listen to the input descriptor */ FD_SET(0, &input_set); /* Waiting for some seconds */ timeout.tv_sec = 10; // 10 seconds timeout.tv_usec = 0; […]

for loop宏编码风格

我在大学的一位导师建议使用宏来减少c99代码中的重复,就像这样。 #define foreach(a, b, c) for (int a = b; a < c; a++) #define for_i foreach(i, 0, n) #define for_j foreach(j, 0, n) #define for_ij for_i for_j 哪个可以这样使用: for_ij { /*do stuff*/; } for_i { /*do stuff*/; } 另一位具有工业背景的导师不鼓励使用它,声称它被视为他前雇主的反模式(但他不知道背后的原因)。 实际上,通过浏览大型项目的源代码,很少能够在简短的学术范例之外找到这些结构。 我的问题是:为什么这种结构在实践中很少使用? 它在某种程度上是危险的吗?

在OpenMP中为每个内部循环启动一个线程

我是OpenMP的新手,我正在尝试启动一个单独的线程来处理2D数组中的每个项目。 基本上,这个: for (i = 0; i < dimension; i++) { for (int j = 0; j < dimension; j++) { a[i][j] = b[i][j] + c[i][j]; 我正在做的是这样的: #pragma omp parallel for shared(a,b,c) private(i,j) reduction(+:diff) schedule(dynamic) for (i = 0; i < dimension; i++) { for (int j = 0; j < dimension; j++) { a[i][j] […]

理解for循环的退出条件

读完这个post后我有了这个问题用C语言打印二进制表示forms的int 在用户注释中,他们发布了for循环,它为位位置分配1或0,以便从int decimal转换为char * binary。 for(; bits–; u >>= 1) str[bits] = u & 1 ? ‘1’ : ‘0’; 我理解为什么不需要初始值。 这是我一直都知道的for循环的语法: for ( variable initialization; condition; variable update ) 我不明白的是’bit–‘如何成为退出条件。 请帮助我理解这段代码是如何工作的(我测试了它,它是有效的)。 谢谢。