c - 三重嵌套 C 循环,整数迭代器在离开内循环之前变大

标签 c

我已经解决了这个问题,但我不确定我是否明白它来自哪里。我相信这是因为我错误地声明了 par_x par_y 和 par_z (例如 float par_y = [])。我通过使用大小来声明它,然后调用initialize_article来解决这个问题。

出于兴趣,我的代码是 CFD 代码,我向其中添加了更多功能(被动粒子跟踪),但我的三重嵌套循环遇到了问题。

int ii_ter, k_ter, j_ter

void initialize_particle(int d2x, int d2y, int d2z, float *par_x, float *par_y, float *par_z){
    for (ii_ter = 0; ii_ter < number_particles; ii_ter++){
        for (j_ter = 0; j_ter < number_particles; j_ter++){
            for (k_ter = 0; k_ter < number_particles; k_ter++){
            // number of particles in each direction, centred around  d2x d2y d2z
            // 
                printf("\nvalue ii_ter: %d, j_ter: %d, k_ter: %d\n", ii_ter, j_ter, k_ter);

                index_part = k_ter+j_ter*number_particles+ii_ter*number_particles*number_particles;

                printf("calc index %d \n", index_part);

                par_x[index_part] = 1 + d2x + k_ter - number_particles/(float)2;
                par_y[index_part] = 1 + d2x + j_ter - number_particles/(float)2;
                par_z[index_part] = 1 + d2x + ii_ter - number_particles/(float)2;

                printf("value of parx: %5.5f y: %5.5f z: %5.5f\n", par_x[index_part], par_y[index_part], par_z[index_part]);
            }
        }
    }
}

代码的目的是遍历并在 3D 立方体中放置一个粒子,k_ter 表示 x 轴,y_ter 表示 y 轴,ii_ter 表示 z 轴。

index_part 应从 0 到 number_articles^3

除了我的输出看起来像

value ii_ter: 0, j_ter: 0, k_ter: 0
calc index 0
value of parx: 34.50000 y: 34.50000 z: 34.50000

value ii_ter: 0, j_ter: 0, k_ter: 1
calc index 1
value of parx: 35.50000 y: 34.50000 z: 34.50000

value ii_ter: 0, j_ter: 0, k_ter: 2
calc index 2
value of parx: 36.50000 y: 34.50000 z: 34.50000

value ii_ter: 0, j_ter: 1, k_ter: 0
calc index 3
value of parx: 34.50000 y: 35.50000 z: 34.50000

value ii_ter: 0, j_ter: 1, k_ter: 1
calc index 4
value of parx: 35.50000 y: 35.50000 z: 34.50000

value ii_ter: 0, j_ter: 1, k_ter: 2
calc index 5
value of parx: 36.50000 y: 35.50000 z: 34.50000

value ii_ter: 0, j_ter: 2, k_ter: 0
calc index 6
value of parx: 34.50000 y: 36.50000 z: 34.50000

value ii_ter: 0, j_ter: 2, k_ter: 1
calc index 7
value of parx: 35.50000 y: 36.50000 z: 1108213794.50000

value ii_ter: 1108213760, j_ter: 2, k_ter: 2
calc index 1383989256

我尝试过使用不同的变量甚至 while 循环。甚至注释掉代码的 par_x...par_z 部分。

非常感谢您的帮助。

谢谢

最佳答案

这是一个较晚添加的内容,但与我的评论一致 - 没有全局变量。

#include <stdio.h>

static
void initialize_particle(int d2x, int d2y, int d2z, int num, float *par_x, float *par_y, float *par_z)
{
    for (int i_ter = 0; i_ter < num; i_ter++)
    {
        for (int j_ter = 0; j_ter < num; j_ter++)
        {
            for (int k_ter = 0; k_ter < num; k_ter++)
            {
                printf("\nvalue i_ter: %d, j_ter: %d, k_ter: %d\n",
                       i_ter, j_ter, k_ter);
                int index_part = k_ter + j_ter * num + i_ter * num * num;
                printf("calc index %d \n", index_part);
                par_x[index_part] = 1 + d2x + k_ter - num / 2.0;
                par_y[index_part] = 1 + d2y + j_ter - num / 2.0;
                par_z[index_part] = 1 + d2z + i_ter - num / 2.0;
                printf("value of parx: %5.5f y: %5.5f z: %5.5f\n",
                       par_x[index_part], par_y[index_part], par_z[index_part]);
            }
        }
    }
}

int main(void)
{
    float x[30];
    float y[30];
    float z[30];
    initialize_particle(35, 36, 37, 3, x, y, z);
    return 0;
}

这不会崩溃。早期版本用 10 代替 30 确实崩溃了!

关于c - 三重嵌套 C 循环,整数迭代器在离开内循环之前变大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937709/

相关文章:

NETBEANS、cc1下的C开发

c++ - 如何避免警告 C4244 : conversion from 'ULONGLONG' to 'double' , 可能丢失数据

C 多维数组不接受对其成员的修改

c - 为什么我不能从数组中删除一个人?

c - 我在哪里可以找到 struct proc_dir_entry 的定义

c - 制定具有现有目标、现有先决条件但没有配方的规则

c - C中动态确定函数参数的类型?

同时使用 c89 和 POSIX

c - macOS上使用什么时钟返回SO_TIMESTAMP的值?

c - 如何在c中 "clear"数组为较小的数组腾出空间?