我想做一維陣列并進一步轉換為二維陣列,因為我想通過函式使用它。有一個初始化函式來創建坐標系,然后是一個函式來繪制它,但是С忽略了我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)
{
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軸不繪制?非常感謝您的回答!
uj5u.com熱心網友回復:
當迭代扁平的 2D 陣列時,您需要正確計算索引:我想修復您的代碼需要替換每個:
array[b]
和
array[width * i b]
偏移量是每i行width字符加上b字符。
uj5u.com熱心網友回復:
據我了解您的問題,您正在使用一維陣列來表示實際上是二維結構(矩陣)的內容。這本身不是問題。
但是,這樣做時,您必須記住將“行偏移量”添加到您在訪問元素時使用的每個索引。此偏移量將是行號乘以陣列的寬度。
在您的代碼中,每次運行通過外部 ( i-indexes) 回圈訪問陣列的同一行(第一行),因為您只使用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
uj5u.com熱心網友回復:
問題在于陣列的索引方式。它應該用類似的東西來索引(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");
}
}
程式輸出:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322578.html
標籤:C
下一篇:為什么C中的矩陣會發生這種情況?
