传递二维数组以在C

时间:2015-11-26 04:39:46

标签: c arrays

如评论中所述,尽量不要迷失方向;将数组传递给函数是一个简单的问题。我对此一无所知。我以为我必须使用指针,我不明白如何处理函数定义中的两个维度但我废弃了因为我读过我可以使用数组索引。我一定搞砸了。

我的程序应该是一个类似徽标的模拟,你有一个乌龟绘图形状。 “程序”存储在数组中,我为5前进命令制作了二维。一切都输出到50 x 50二维阵列。输出数组填充零个字符。形状用星号绘制。交换机的每种情况都是一个命令。

  • 1 Pen up
  • 2笔下来
  • 3右转
  • 向左转4个
  • 5前进;第二维持有金额前进
  • 6 print array
  • 9 sentinel(关闭程序)。

运行代码时,我得到以下输出。

  

0000Error:默认CaseError:默认CaseError:默认CaseError:默认情况错误:默认CaseError:默认CaseError:默认CaseError:默认CaseErro r:默认CaseError:默认CaseError:默认CaseError:默认情况

在一些测试数据之后,我发现当我稍后尝试使用该函数访问它们时,我放入数组中的值都没有。将数组传递给函数时出了点问题。

#include <stdio.h>
#include <stdlib.h>

void read_program(int arr[2][9]);

int main(void){

    int program_array[2][9] = {{0}};

    program_array[0][0] = 2;//Putting program into array line by line

    program_array[0][1] = 5;
    program_array[1][1] = 12;

    program_array[0][2] = 3;

    program_array[0][3] = 5;
    program_array[1][3] = 12;

    program_array[0][4] = 3;

    program_array[0][5] = 5;
    program_array[1][5] = 12;

    program_array[0][6] = 1;

    program_array[0][7] = 6;

    program_array[0][8] = 9;

    read_program(program_array);
}

void read_program(int arr[2][9]){
    int pen_down = 0;
    int direction = 2;
    char floor[50][50] = {{'0'}};
    int pen_x = 0;
    int pen_y = 0;

    for(int i = 0; i < 9;i++){
        switch(arr[0][i]){ //Problem starts here
            case 1:{
                pen_down = 0;
                break;
            }
            case 2:{
                pen_down = 1;
                break;
            }
            case 3:{
                if(direction == 3)
                    direction = 0;
                else
                    direction++;
                break;
            }
            case 4:{
                if(direction == 0)
                    direction = 3;
                else
                    direction--;
                break;
            }
            case 5:{
                switch(direction){
                    case 0:{
                        if(pen_down == 1)
                            for(int k = 0;k < arr[1][k];k++){
                                floor[pen_x][pen_y - k] = '*';
                                pen_y += k;
                            }
                        break;
                    }
                    case 1:{
                        if(pen_down == 1)
                            for(int k = 0;k < arr[1][k];k++){
                                floor[pen_x + k][pen_y] = '*';
                                pen_y += k;
                            }
                        break;
                    }
                    case 2:{
                        if(pen_down == 1)
                            for(int k = 0;k < arr[1][k];k++){
                                floor[pen_x][pen_y + k] = '*';
                                pen_y += k;
                            }
                        break;
                    }
                    case 3:{
                        if(pen_down == 1)
                            for(int k = 0;k < arr[1][k];k++){
                                floor[pen_x - k][pen_y] = '*';
                                pen_y += k;
                            }
                        break;
                    }
                }
            }
            case 6:{
                for(int k = 0;k < 50;k++){
                    for(int l = 0;l < 50;l++){
                        printf("%c", floor[k][l]);
                    }
                }
                break;
            }
            case 9:{
                break;
            }
            default:{
                printf("Error: Default Case");
                break;
            }
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

我添加了printf() - 另一个:

 for (int i = 0; i < 9;i++){
     printf("arr[0][%d] = %d (%d)\n", i, arr[0][i], arr[1][i]);
     switch(arr[0][i]) {

并显示主程序中设置的数组中的值。

arr[0][0] = 2 (0)
arr[0][1] = 5 (12)
0arr[0][2] = 3 (0)
arr[0][3] = 5 (12)
0arr[0][4] = 3 (0)
arr[0][5] = 5 (12)
0arr[0][6] = 1 (0)
arr[0][7] = 6 (0)
0arr[0][8] = 9 (0)

错误:出现这些杂散零,因为您未在breakcase 5:之间为主case 6:添加switch (嵌套的switch有休息。)

数据传递给您的代码确定。此外,将循环边界设置为9,我没有错误:默认情况&#39;消息 - 这是一项重大改进。

问题可能出在绘图代码中:

 67             case 5:{
 68                 switch(direction){
 69                     case 0:{
 70                         if(pen_down == 1)
 71                             for(int k = 0;k < arr[1][k];k++){
 72                                 floor[pen_x][pen_y - k] = '*';
 73                                 pen_y += k;
 74                             }
 75                         break;
 76                     }

严重过度使用k

错误:循环条件应针对arr[1][i]进行测试。

我不理解放置星星和动作背后的预期逻辑。那是你调试的。

错误: floor的初始化会将一个元素设置为'0',并将2499个单元格保留为'\0'。如果您查看输出以使空值可见,您可以看到那些 - 很多那些。

添加:#include <string.h>memset(floor, '0', sizeof(floor));

错误: case 6:中的打印代码不会在每行末尾输出换行符。

请注意使用的基本调试技术。打印数据(在调试器中或使用printf(),确保以换行符结束行)。眼球正在发生什么。

顺便说一下,我认为你应该重新设计你的数组,使其为9x2(而不是2x9)。然后,您可以更轻松地扩展程序:

int program[][2] =
{
    { 2,  0 },
    { 5, 12 },
    { 3,  0 },
    { 5, 12 },
    { 3,  0 },
    { 5, 12 },
    { 1,  0 },
    { 6,  0 },
    { 9,  0 },
};

目前,你需要:

 int program_array[2][9] = 
 {
     { 2,  5, 3,  5, 3,  5, 1, 6, 9 },
     { 0, 12, 0, 12, 0, 12, 0, 0, 0 } 
 };  

这种布局意味着程序解释器只能处理一个大小的程序;使用替代方案,它可以处理任意长的程序。你应该能够找到选择7的用途,以清除数组&#39;。您可以修改选项3以接受第二个数字中的新方向。

答案 1 :(得分:0)

在函数之间传递数组,方法是将除最顶层维度之外的所有维度大小指定为函数的一个参数,第二个参数为我们提供数组顶部维度的大小。

int largestElement(int array[][4],int row)

这已在各种问题中得到解答。 看看这个答案是否完整example