为什么 for 忽略 if 语句?

Why does for ignore if statement?

我想做一维数组并进一步转换为二维,因为我想通过函数使用它。有一个创建坐标系的初始化函数,然后是一个绘制它的函数,但是 C 在创建数组函数时忽略了我的 if 语句。

数组初始化代码:

void inicialise(char* array, int width, int height, char ic)
{
    for (int i = 0; i < height; i++)
    {
        if (i == height / 2)
        {
            
            for (int b = 0; b < width; b++)
            {
                array[b] = 'x';
            }
        }
        else
        {
            
            for (int b = 0; b < width; b++)
            {
                if (b == width / 2) //x axis in middle
                {
                    
                    array[b] = 'y';
                }
                else
                {
                    array[b] = ic;
                }
                
            }
        }
        
    }
}

打印坐标代码

void draw(char* array, int w, int h)
{
    for (int i = 0; i < h; i++)
    {
        for (int b = 0; b < w; b++)
        {
            printf("%c", array[b]);
        }
        printf("\n");
    }
}

预期输出:

00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
xxxxxxxxxxxxxxxxxxxxxx
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000

实际输出:

00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000
00000000000y0000000000

为什么 X 轴不绘制? 非常感谢您的回答!

迭代扁平化二维数组时,您需要正确计算索引: 我想修复你的代码你需要替换每个:

array[b]

array[width * i + b]

偏移量为 iwidth 个字符,每行加上 b 个字符。

据我了解您的问题,您使用的是一维数组来表示实际上是二维结构(矩阵)的内容。这本身不是问题。

但是,这样做时,您必须记住将 'row offset' 添加到访问元素时使用的每个索引。此偏移量将是行号乘以数组的宽度。

在您的代码中,每个 运行 通过外部 (i-indexes) 循环访问数组的 same 行(第一行),因为你只对每一行使用 b 索引——你只写(和重写)矩阵的第一行,所以写 x 轴的循环的输出被替换为下一个循环。

要解决此问题,您需要将值 i * width 添加到您使用的数组索引中。在您的 inicialise 函数中,这将是这样的:

void inicialise(char* array, int width, int height, char ic)
{
    for (int i = 0; i < height; i++) {
        int row = i * width; // Offset for each row
        if (i == height / 2) {

            for (int b = 0; b < width; b++) {
                array[row+b] = 'x'; // Add row offset
            }
        }
        else {
            for (int b = 0; b < width; b++) {
                if (b == width / 2) {

                    array[row+b] = 'y'; // Add row offset
                }
                else {
                    array[row+b] = ic; // Add row offset
                }

            }
        }
    }
}

同样,在您的 draw 函数中:

void draw(char* array, int w, int h)
{
    for (int i = 0; i < h; i++) {
        int row = i * w;
        for (int b = 0; b < w; b++) {
            printf("%c", array[b+row]);
        }
        printf("\n");
    }
}

采用示例输出中显示的 22 x 22 矩阵,main 函数看起来像这样:

#define NROWS 22
#define NCOLS 22

int main(void)
{
    char test[NROWS * NCOLS];
    inicialise(test, NCOLS, NROWS, '0');
    draw(test, NCOLS, NROWS);
    return 0;
}

此生成的输出是:

00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
xxxxxxxxxxxxxxxxxxxxxxx
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000
00000000000y00000000000

问题在于数组的索引方式。它应该使用类似 (i * width) + b 的索引,其中 i 是行号,b 是列号。

以下应按预期工作:

void inicialise(char* array, int width, int height, char ic)
{
    for (int i = 0; i < height; i++)
    {
        for (int b = 0; b < width; b++)
        {
            char val;
          
            if (i == height / 2)
            {
                val = 'x';
            }
            else if (b == width / 2)
            {
                val = 'y';
            }
            else
            {
                val = ic;
            }

            array[(i * width) + b] = val;
        }       
    }
}

void draw(char* array, int w, int h)
{
    for (int i = 0; i < h; i++)
    {
        for (int b = 0; b < w; b++)
        {
            printf("%c", array[(i*w) + b]);
        }
        printf("\n");
    }
}

程序输出: