为什么 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]
偏移量为 i
行 width
个字符,每行加上 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");
}
}
程序输出:
我想做一维数组并进一步转换为二维,因为我想通过函数使用它。有一个创建坐标系的初始化函数,然后是一个绘制它的函数,但是 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]
偏移量为 i
行 width
个字符,每行加上 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");
}
}
程序输出: