【问题标题】:Trying to use multidimensional array pointers尝试使用多维数组指针
【发布时间】:2016-06-30 10:21:10
【问题描述】:

我正在寻找解决方案,但我无法使用任何解决方案而不会出现错误。 我试图在控制台中绘制地图,使用多维数组。我想要更多的地图,但如果不发送无用的代码,我就无法做到。这是地图:

char map2[11][15] = {
"###^######^###",
"#L           #",
"^S           #",
"#S           #",
"#    K       #",
"###########  #",
"#G           #",
"#       #### #",
"#       #M   #",
"# @     #    #",
"## ########^##"};

这是移动脚本:

void Game::showing_different_maps()
{
    differentmap= true;
    while (differentmap)
    {
        system("cls");
        for(int i = 0; i < 81; i++)  // i < map2[y][]
        {
            cout << somemap[i] << endl; // drawing a map !THIS CAUSES CRASH!
        }
    system("pause>nul"); // this line prevent lagging somehow

        if(GetAsyncKeyState(VK_UP))  // arrows to move on axis (y, x)
        {
            mapka.move(-1, 0);                    
        }
        if(GetAsyncKeyState(VK_DOWN))
        {
            mapka.move(1, 0);
        }
        if(GetAsyncKeyState(VK_RIGHT))
        {
            mapka.move(0, 1);
        }
        if(GetAsyncKeyState(VK_LEFT))
        {
            mapka.move(0, -1);
        }

    }

}

这是我可以在互联网上找到的。

  Wut wut(3, 13);
  Maps *wsk;
  pointer = &wut;

  char (*somemap)[81] = new char[81][81];
  somemap= &map2[81];

  pointer = &wut;
  pointer -> get_in_area();

我想做的是:在代码的某些部分,我希望指针是 map2。我设法使指针“指针”在类 Maps 中显示 void get_in_area(),但是当我想在第二个代码示例中使用 somemap 指针绘制地图时,控制台崩溃了。它可以工作,而不是 somemap[i] 我放了 map2[i]。如果我错过了什么,我很抱歉,我是初学者,英语不是我的第一语言。 我用这个教程制作了这个脚本:https://www.youtube.com/watch?v=7gpH7bOS350

【问题讨论】:

  • 因为您假设数组边界 == 81?一旦未定义的行为认为它应该崩溃,它就会崩溃
  • 在 c++ 中也尽量避免使用原始数组并将它们包装在一个类中,或者使用现有的类之一以更好的方式让它失败并产生一个干净的异常
  • 我到处尝试编辑 81,但没有帮助。地图的大小会有所不同,最大尺寸是 81x81,所以我到处都写了 81。感谢您的建议,但代码示例在课堂上,我只是没有粘贴整个代码
  • 将地图包装在一个定义地图边界的类中?

标签: c++ pointers multidimensional-array


【解决方案1】:

这是创建二维数组的方法:

typedef int T;
void f()
{

    T ** map = new T*[10];

    for (int i = 0; i < 10; i++)
    {
        map[i] = new T[10];
    }

    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            map[i][j] = i*j;
        }
    }

    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            std::cout << map[i][j] << "\t";
        }
        std::cout << std::endl;
    }
}

这将输出一个通用乘法表。

如果您想要更多维度,您只需在创建过程中再添加一个步骤:

T*** map = new T**[10];

for (int i = 0; i < 10; i++)
{
    map[i] = new T*[10];
}
...

【讨论】:

    【解决方案2】:

    您应该学习如何传递参数,而不是使用全局 (map2) 或静态 (81) 变量。如果你声明:

    void Game::showing_different_maps(int n, int m, char map[n][m])
    {
     String   differentmap= true;
        while (differentmap)
        {
            system("cls");
            for(int i = 0; i < n; i++)  // i < map2[y][]
            {
                cout << somemap[i] << endl; // drawing a map !THIS CAUSES CRASH!
            }
    

    你不应该再崩溃了……

    但无论如何,对于这种用法,我会使用指向指针的指针而不是二维数组:

    char *map2[]= {
      "###^######^###",
      "#L           #",
      "^S           #",
      "#S           #",
      "#    K       #",
      "###########  #",
      "#G           #",
      "#       #### #",
      "#       #M   #",
      "# @     #    #",
      "## ########^##"};
    

    然后

    void Game::showing_different_maps(int n, char **map)
    

    【讨论】:

    • 非常感谢,我在理解上有些问题,所以我无法理解以前的帮助,但经过一段时间我已经设法使用指针到指针建议,但我遇到了另一个问题。应用程序运行,但是当绘制地图并且我按下一个键时,它会崩溃。调试器只告诉我:“程序收到信号 SIGSEGV,分段错误。”从互联网上,我只了解“您永远不会分配存储变量所需的空间”,但我不知道如何处理它。我在我的问题中添加了更多代码。再次感谢您为这一刻所做的一切。
    • 这不应该是对这个问题的编辑,而是一个新问题,因为它现在是一个不同的问题,当前的答案现在与这个新部分无关。
    • 哦,好的,我会提出新问题,不过谢谢
    猜你喜欢
    • 2023-01-15
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多