【问题标题】:Split up program with 2 dimensional arrays into Functions (C)将具有二维数组的程序拆分为函数 (C)
【发布时间】:2018-01-30 11:33:38
【问题描述】:

我用 C 语言编写了一个程序,它允许我在一个二维数组的“房间”中四处走动。它工作正常,但现在我在尝试将其拆分为函数时遇到了问题。我可能会完全错误地处理它,因为我只在 Visual Basic 中工作过,像这样的东西要容易得多。 printf 的 void 函数也可以正常工作。

这是我的代码:

#include <stdio.h>
void instruction(void) {
        printf("Move: W=up, D=right, S=down, A=left an apply with RETURN.\n");
}
void wall(void) {
        printf("##### You are in front of a wall. Please move somewhere else! #####\n");
}
int runter(roomxy, y, x, index) {
        roomxy[y][x] = 0;
        y = y + 1;
        if (y>3 || y<0) {
                y = y - 1;
                wall();
                index--;
                return (index);
        }
        return (roomxy[y][x]);
}

void main() {
char c[2];
int steps;
int i;
int j;
int k;
int room[4][4] = { 0 };
int ypos = 0;
int xpos = 0;

room[ypos][xpos] = 1;
for(j=0; j<4; j++) {
        for(k=0; k<4; k++) {
                printf("%d ", room[j][k]);
        }
        printf("\n");
}


printf("How many steps do you want to make? (Number from 1 to 50.)\n");
scanf("%d", &steps);
if (steps>0 && steps<51) {
                for (i=1; i<=steps; i++) {
                        instruction();
                        scanf("%s", c);
                        if (c[0] == 'S' || c[0] == 's') {
                                room = runter(room, ypos, xpos, i);
                                /*room[ypos][xpos] = 0;
                                ypos = ypos + 1;
                                if (ypos>3 || ypos<0) {
                                        ypos = ypos - 1;
                                        wall();
                                        i--;
                                }*/
                        }
                        else if (c[0] == 'W' || c[0] == 'w') {
                                room[ypos][xpos] = 0;
                                ypos = ypos - 1;
                                if (ypos>3 || ypos<0) {
                                        ypos = ypos + 1;
                                        wall();
                                        ypos = ypos + 1;
                                        wall();
                                        i--;
                                }
                        }
                        else if (c[0] == 'D' || c[0] == 'd') {
                                room[ypos][xpos] = 0;
                                xpos = xpos + 1;
                                if (xpos>3 || xpos<0) {
                                        xpos = xpos - 1;
                                        wall();
                                        i--;
                                }
                        }
                        else if (c[0] == 'A' || c[0] == 'a') {
                                room[ypos][xpos] = 0;
                                xpos = xpos - 1;
                                if (xpos>3 || xpos<0) {
                                        xpos = xpos + 1;
                                        wall();
                                        i--;
                                }
                        }
                        else {printf("##### ERROR: Only type in W, D, S or A! #####\n"); i--;}
                        room[ypos][xpos] = 1;
                        printf("Ihre Position:\n");
                        for(j=0; j<4; j++) {
                                for(k=0; k<4; k++) {
                                        printf("%d ", room[j][k]);
                                }
                                printf("\n");
                                                }
                }
}
else {printf("##### Please enter number from 1 to 50! #####\n");}
}

我得到的错误是“下标值既不是数组也不是指针也不是向量”。 我不知道如何继续前进,因为我完全被困在试图弄清楚带有数组的函数在 C 中是如何工作的。 我也读过 typedef 参数,但我也不知道如何使用它。

显然我在编程方面是一个该死的菜鸟。

提前谢谢你们!

【问题讨论】:

  • 那段代码能编译吗? runter 的定义缺少其参数的数据类型
  • 你的函数原型应该是这样的int runter(int roomxy[], int y, int x, int index)
  • 这些不是都声明为整数吗?好的,我不知道该怎么做,我试试,谢谢!
  • 你应该努力格式化你的代码。这是为了你好。
  • 格式化可能有点主观,但有一些常用的模式。您的格式问题首先是缩进。有时你根本不缩进(比如在main() { 之后)并且你在结尾处有一个狂野的}(这可能只是一个错字)。在 C 中缩进 8 个字符(一个完整的制表位)被认为是多余的。您还可以充分利用某些代码行之间的空格(例如块之间)。搜索“C 格式标准”,您会发现一些可以提高 C 代码可读性的好建议。

标签: c arrays function multidimensional-array


【解决方案1】:

您的源代码混乱,所以有很多问题需要解决。

首先,将void main() 更改为int main(void)。这只是 C 标准所要求的; main 在正常情况下必须是 int main(void)int main(int argc, char *argv[])

接下来,您必须在声明函数时声明参数类型。 int runter(roomxy, y, x, index) 是错误的,因为它没有说明参数是什么类型。您可能想要int runter(int roomxy[][4], int y, int x, int index)int runter(int *roomxy, int y, int x, int index)。前者将整个数组(通过指向其第一个子数组的指针)传递给runter。后者传递一个指向特定元素的指针。如果runter 需要处理数组的多个元素,则应使用第一个。如果runter 只需要使用特定元素,则应使用第二个。但是,使用第二种形式需要对程序进行额外的更改,并且需要使用您可能尚未了解的指针,因此我将省略对此的讨论。

然后,不清楚您希望runter 返回什么。在函数内部的一处,您有return (index);。在另一个,你有return (roomxy[[y][x]);。我不清楚indexroomxy[y][x] 是否是您要返回的一种事物的两个可能值,或者它们是否是不同种类的事物。如果它们是同一种东西,好吧。但是,如果它们代表不同的事物,那么函数返回一个或另一个通常是没有意义的。

在任何情况下,return 语句都不需要括号。 return index;return roomxy[y][x] 都可以。

你打电话给runter,你有room = runter(room, ypos, xpos, i);。这没有意义,因为room 是一个数组,但runter 返回一个int。您不能将 int 分配给数组。也许你的意思是room[ypos][xpos] = runter(room, ypos, xpos, 1);。 (如果是这样,那么您确实希望 runter 使用单个元素,因此指向元素的解决方案会更好。但是您可以让程序正常工作,然后再担心。)

【讨论】:

  • 谢谢,以后有时间我会试试的。有时间我会给你答案的:)
【解决方案2】:

我已经修改了您的来源。在 runter() 中,您返回 int 并捕获指针(二维)的房间。不可能。 除此之外,您应该在 int runter(roomxy, y, x, index) 中声明数据类型。我已经更正了。

                #include <stdio.h>
    void instruction(void) {
            printf("Move: W=up, D=right, S=down, A=left an apply with RETURN.\n");
    }
    void wall(void) {
            printf("##### You are in front of a wall. Please move somewhere else! #####\n");
    }
    void runter(int roomxy[][4], int y, int x, int index) {
            roomxy[y][x] = 0;
            y = y + 1;
            if (y>3 || y<0) {
                    y = y - 1;
                    wall();
                    index--;
        //            return (index);
            }
          //  return (roomxy[y][x]);
    }

    int main() {
    char c[2];
    int steps;
    int i;
    int j;
    int k;
    int room[4][4] = { 0 };
    int ypos = 0;
    int xpos = 0;

    room[ypos][xpos] = 1;
    for(j=0; j<4; j++) {
            for(k=0; k<4; k++) {
                    printf("%d ", room[j][k]);
            }
            printf("\n");
    }


    printf("How many steps do you want to make? (Number from 1 to 50.)\n");
    scanf("%d", &steps);
    if (steps>0 && steps<51) {
                    for (i=1; i<=steps; i++) {                                    
                            instruction();
                            scanf("%s", c);
                            if (c[0] == 'S' || c[0] == 's') {                               
    /*                                room[ypos][xpos] = */runter(room, ypos, xpos, i);
                                    room[ypos][xpos] = 0;  
                                    ypos = ypos + 1;
                                    if (ypos>3 || ypos<0) {
                                            ypos = ypos - 1;
                                            wall();
                                            i--;
                                    }
                            }        
                            else if (c[0] == 'W' || c[0] == 'w') {
                                    room[ypos][xpos] = 0;
                                    ypos = ypos - 1;
                                    if (ypos>3 || ypos<0) {
                                            ypos = ypos + 1;
                                            wall();
    /*                                        ypos = ypos + 1;
                                            wall();*/
                                            i--;
                                    }
                            }
                            else if (c[0] == 'D' || c[0] == 'd') {
                                    room[ypos][xpos] = 0;
                                    xpos = xpos + 1;
                                    if (xpos>3 || xpos<0) {
                                            xpos = xpos - 1;
                                            wall();
                                            i--;
                                    }
                            }
                            else if (c[0] == 'A' || c[0] == 'a') {
                                    room[ypos][xpos] = 0;
                                    xpos = xpos - 1;
                                    if (xpos>3 || xpos<0) {                
                                            xpos = xpos + 1;
                                            wall();
                                            i--;                                  
                                    }     
                            }              
                            else {printf("##### ERROR: Only type in W, D, S or A! #####\n"); i--;}
                            room[ypos][xpos] = 1;                                      
                            printf("Ihre Position:\n");    
                            for(j=0; j<4; j++) {    
                                    for(k=0; k<4; k++) {   
                                            printf("%d ", room[j][k]);
                                    }              
                                    printf("\n");
                                                    }
                    }                
    }                                                             
    else {printf("##### Please enter number from 1 to 50! #####\n");}

    return 0;                                              
    }                                                                                                   

【讨论】:

  • 这是不正确的:runter((int **)room, ypos, xpos, i)。您不能将 int[4][4] 转换为 int** 并期望它起作用。这是两种完全不同的数据类型。
  • 另外,不要在答案上重新发布完整的源代码。只发布相关行,并解释更改。
  • 谢谢!它现在正在编译,但在我进入运动的部分,它因“分段错误(核心转储)”而中止。
  • @J.W.我已更正您的 runter() 函数,使其不返回任何内容。我认为它不需要退货。现在可以使用了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2014-08-28
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多