将具有二维数组的程序拆分为函数(C)

将具有二维数组的程序拆分为函数(C),c,arrays,function,multidimensional-array,C,Arrays,Function,Multidimensional Array,我用C写了一个程序,可以在一个二维数组的“房间”里走动。它工作得很好,但现在我在尝试将其拆分为函数时遇到了问题。我可能完全错了,因为我只在VisualBasic中工作过,在那里像这样的东西要容易得多。 带有printf的void函数也可以很好地工作 这是我的密码: #include <stdio.h> void instruction(void) { printf("Move: W=up, D=right, S=down, A=left an apply with R

我用C写了一个程序,可以在一个二维数组的“房间”里走动。它工作得很好,但现在我在尝试将其拆分为函数时遇到了问题。我可能完全错了,因为我只在VisualBasic中工作过,在那里像这样的东西要容易得多。 带有
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");}
}
#包括
无效指令(void){
printf(“Move:W=up,D=right,S=down,A=left,一个带返回的应用程序。\n”);
}
空心墙(空心墙){
printf(“你在一堵墙前面,请移到别的地方去!”;
}
int runter(roomxy、y、x、index){
roomxy[y][x]=0;
y=y+1;

如果(y>3 | | y我已经修改了你的源代码。在runter()中,你返回int并且有catch with room,这是指针(二维)。这是不可能的。 除此之外,您应该在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;                                              
    }                                                                                                   
#包括
无效指令(void){
printf(“Move:W=up,D=right,S=down,A=left,一个带返回的应用程序。\n”);
}
空心墙(空心墙){
printf(“你在一堵墙前面,请移到别的地方去!”;
}
void runter(int roomxy[][4],int y,int x,int index){
roomxy[y][x]=0;
y=y+1;

如果(y>3 | | y您的源代码很混乱,那么有很多事情需要修复

首先,将
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
只需要使用特定元素,则应使用第二个。但是,使用第二个表单需要在程序中进行其他更改,并且t需要使用您可能还没有了解的指针,所以我将省略对它的讨论

然后,不清楚您希望runter返回什么。在函数中的一个位置,您有
返回(索引);
。在另一个位置,您有
返回(roomxy[[y][x]);
。我不清楚
索引和
roomxy[y][x]
是您想要返回的一种事物的两个可能值,或者它们是否是不同种类的事物。如果它们是相同种类的事物,好吧。但是如果它们代表不同的事物,函数返回一个或另一个通常没有意义

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


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

该代码可编译吗?
runter
的定义缺少其参数的数据类型您的函数原型应该是这样的
int-runter(int-roomxy[],int-y,int-x,int-index)
。这些不是都声明为整数吗?好的,我不知道怎么做,我会试试的,谢谢!你应该在格式化代码方面下些功夫。这是为了你好。格式化可能有点主观,但有一些常用的模式。格式化的问题首先是缩进。有时你根本不缩进(比如在
main(){
)之后,在结尾附近有一个野生的
}
(这可能只是一个打字错误)。在C中缩进8个字符(一个完整的制表符)被认为是多余的。你也可以充分利用某些代码行之间的空格(比如块之间)。搜索“C格式标准”你会发现一些很好的建议,可以提高C代码的可读性。这是错误的:
runter((int**)room,ypos,xpos,i)
。你不能使用
int[4][4]
int**
并期望它能工作。这是两种完全不同的数据类型。另外,不要在回答时重新发布完整的源代码。只发布相关行,并解释更改。谢谢!它现在正在编译,但在我进入移动的部分,它会以“分段错误(内核转储)”中止@J.W.我已经更正了你的runter()函数,使其不返回任何带有void的内容。我认为它不需要返回任何内容。它现在可以运行了。谢谢,我以后会尝试使用它。我有时间的时候会给你一个答案:)