地图创建大小错误

时间:2013-08-15 01:56:18

标签: arrays map size tiles creation

所以,我正在创造自己的瓷砖地图创作,我的尺寸问题。最大尺寸(我没有设置)<700x700,任何更高的尺寸都会使它崩溃。首先,我认为在制作在屏幕上输出结果的“演示版本”时我出错了 - &gt; ScreenShot,但现在我刚刚完成了它更紧凑,并尝试使用800x800,它仍然有7限制,但我不知道为什么。由于代码不是很大,我会在这里展示它。如果你有一些提示,我不介意接受它们。

#include <iostream>
#include <string.h>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#define _WIN32_WINNT 0x0501
#include <windows.h>
using namespace std;

int main()
{

  sf::Vector2i Size;
  int Points,rands,PointsCheck=1,x,y,RandX,RandY,CurrentNumber=1;
  srand(time(0));
  bool Done=false,Expanded,Border;
  ofstream Out("txt.txt");
  /***/
  cout << "Size X-Y = "; cin >> Size.x >> Size.y;cout << endl;
  cout << "MAX Points - " << (Size.x*Size.y)/10 << endl;
  cout << "Number of POINTS = ";cin >> Points ;cout << endl;
  /***/
  int PixelMap[Size.x+1][Size.y+1];
  /***/
  for (x=1;x<=Size.x;x++) for (y=1;y<=Size.y;y++) PixelMap[x][y]=0;
  /***/
  while(PointsCheck<=Points)
    {
     rands=1+(rand()%10);
     RandX=1+(rand()%(Size.x));RandY=1+(rand()%(Size.y));
     if (rands==1 && PointsCheck<=Points && PixelMap[RandX][RandY]==0)
     {PixelMap[RandX][RandY]=CurrentNumber;CurrentNumber+=2;PointsCheck++;}
    }
  /***/
  while(Done==false)
   {
    Done=true;
    for(x=1;x<=Size.x;x++)
     for(y=1;y<=Size.y;y++)
      if(PixelMap[x][y]%2!=0 && PixelMap[x][y]!=-1)
       {
        if (PixelMap[x+1][y]==0) PixelMap[x+1][y]=PixelMap[x][y]+1;
        if (PixelMap[x-1][y]==0) PixelMap[x-1][y]=PixelMap[x][y]+1;
        if (PixelMap[x][y+1]==0) PixelMap[x][y+1]=PixelMap[x][y]+1;
        if (PixelMap[x][y-1]==0) PixelMap[x][y-1]=PixelMap[x][y]+1;
       }
    for(x=1;x<=Size.x;x++)
     for(y=1;y<=Size.y;y++)
      if(PixelMap[x][y]!=0 && PixelMap[x][y]%2==0) {PixelMap[x][y]--;Done=false;}
   }
   for(x=1;x<=Size.x;x++){
    for(y=1;y<=Size.y;y++)
     {Out << PixelMap[x][y] <<  " ";}Out << endl;}

   //ShowWindow (GetConsoleWindow(), SW_HIDE);
}

3 个答案:

答案 0 :(得分:0)

您在这里拥有的是这个网站名称的概念。你有一个堆栈溢出:

int PixelMap[Size.x+1][Size.y+1];

如果要分配大量内存,则需要动态(在堆上)。

您可以通过多种方式执行此操作。由于您使用的是C ++,我建议您使用std::vector。唯一的技巧是使阵列成为二维的。通常这与您在堆栈上分配的方式相同,除非您没有语言语法来帮助您:

vector<int> PixelMap( (Size.x+1) * (Size.y+1) );

在上面,您需要从行/列计算线性索引。类似的东西:

int someval = PixelMap[ row * (size.y+1) + column ];

如果你真的想使用[row][column]索引语法,你可以制作矢量矢量(不推荐),也可以索引你的行:

vector<int> PixelMapData( (Size.x+1) * (Size.y+1) );
vector<int*> PixelMap( Size.x+1 );
PixelMap[0] = &PixelMapData[0];

for( int i = 0; i < Size.x+1; i++ ) {
    PixelMap[i+1] = PixelMap[i] + Size.y + 1;
}

现在您可以在2D中编制索引:

int someval = PixelMap[row][col];

答案 1 :(得分:0)

您的代码存在一些问题:

首先关闭:

int PixelMap[Size.x+1][Size.y+1];

 for (x=1;x<=Size.x;x++)
    for (y=1;y<=Size.y;y++)
         PixelMap[x][y]=0;

在上面的剪辑中你永远不会设置PixelMap [0] [0]或PixelMap 0等的值。基本上这些值将是未定义的。 C ++中的数组是0索引所以你需要确保解决这些问题。另外,为什么使用Size.x + 1和Size.y + 1?对此感到有些不适。

更好的循环是:

int PixelMap[Size.x][Size.y];
     for (x=0;x<Size.x;x++)
        for (y=0;y<Size.y;y++)
             PixelMap[x][y]=0;

其次,下一段代码难以辨认:

while(PointsCheck<=Points)
{
     rands=1+(rand()%10);
     RandX=1+(rand()%(Size.x));
     RandY=1+(rand()%(Size.y));
     if (rands==1 && PointsCheck<=Points && PixelMap[RandX][RandY]==0)
     {
       PixelMap[RandX][RandY]=CurrentNumber;
       CurrentNumber+=2;
       PointsCheck++;
     }
}

如果

,您只需递增PointsCheck
  

PointsCheck&lt; = Points

为什么呢?你在这种情况下测试这个是真的。在此测试之前,PointsCheck不会在任何地方增加。

顺便说一下

rands永远不会保证等于1,所以你的循环可以持续一段时间(虽然不太可能)。

下一个循环遇到类似的问题:

while(Done==false)
   {
    Done=true;

这是什么原因?你永远不会脱离while循环,并且你永远不会将Done设置为false,因此下一个代码块将只执行一次。删除这一点。

您之后的for-loops应从0开始,然后转到while < Size(Size.x和Size.y)

for(x=0;x<Size.x;x++)
     for(y=0;y<Size.y;y++)

首先解决这些问题,然后如果您仍有问题我们可以继续。为了我们所有的缘故,请使用括号{}来定义for循环和if语句,以便我们可以遵循。另外,将命令分隔到单独的行上。对于我们来说,每行遵循多个分号是很多工作。

修改

由于您似乎不愿意先解决这些问题: 这可能是您的程序在堆栈上分配的内存量的问题。如果您正在尝试创建800x800整数的数组,那么您使用的是800 * 800 * 4字节= 2.4 MB的数据。我知道这比视觉工作室的默认限制1 MB高,但由于700x700阵列使用1.8 MB,所以你使用的任何程序都有更高的默认值(或者你设置的视觉工作室更高,但不够高)。

查看是否可以将限制设置为至少3 MB。但是越多越好。如果这不能解决您的扩展问题,那么您还有其他问题。

EDIT2

我刚注意到这一点:

 sf::Vector2i Size;
  //unimportant stuff
  cin >> Size.x >> Size.y;
  int PixelMap[Size.x+1][Size.y+1];

Vector2i可能有x和y的默认值。如果你想动态分配超过那些,你不能静态地说

  

PixelMap [Size.x] [Size.y]

您需要动态分配数组。我强烈建议使用像std :: vector&gt;这样的东西。为此

例如(未经测试的代码):

  sf::Vector2i Size;
  //unimportant stuff
  cin >> Size.x >> Size.y;
  std::vector<vector<int> > PixelMap;
  //Initialize values to 0
  for(size_t i=0; i < Size.x; ++i){
     vector<int> nextVec;
     for(size_t j=0; j < Size.y; ++j){
        nextVec.push_back(0);
      }
      PixelMap.push_back(nextVec);
  }

答案 2 :(得分:0)

不确定这是否与您的崩溃有关(我会添加评论,但我没有声誉),但这是我注意到的问题:

您的数组索引方案不一致。由于您使用索引1来指示第一个元素,因此您的边界检查应该如下所示......

if (y!=1 && y!=Size.y && x!=1 && x!=Size.x && ...

......而不是......

if (y!=0 && y!=Size.y && x!=0 && x!=Size.x && ...

<强> [编辑]

我刚试过这个:

...
cout << "asdf" << endl;
int PixelMap[Size.x+1][Size.y+1];
cout << "asdf" << endl;
...

并验证了它是堆栈溢出问题。因此,正如上面提到的其他人一样,在堆上分配像素图,它应该没问题。

BTW,这段代码......

int PixelMap[Size.x+1][Size.y+1];

不是标准的C ++。它是一些编译器提供的扩展,称为“可变长度数组”。查看此信息以获取更多信息 - &gt; Why aren't variable-length arrays part of the C++ standard?

<强> [/ EDIT]