0

我有一个“spot”类的 2D 固定大小对象数组 Spot map[row][col];//row & col 是动态变化的整数我想将它传递给函数 bool isFilled(int row,int col,Spot[ row][col]){} 如何定义函数?如何删除这个数组?请看我的代码。谢谢你的帮助。

Spot.h

    #ifndef SPOT_H
#define SPOT_H

class Spot
{
private:
    bool isBunny;
    int nextCycle;
public:
    static const int UP = 0;
    static const int RIGHT = 1;
    static const int DOWN = 2;
    static const int LEFT = 3;
    static const int SLEEP = 4;

    virtual void setSpot(bool newIsBunny);
    Spot();
    ~Spot();
    virtual int getNextCycle();
    virtual void setNextCycle();
    virtual bool getIsBunny();
    virtual void makeBunny();
};

void Spot::setSpot(bool newIsBunny)
{
    isBunny = newIsBunny;
    nextCycle = UP;
}

Spot::Spot()
{
    isBunny = false;
    nextCycle = UP;
}

Spot::~Spot()
{
}

void Spot::setNextCycle()
{
    if (nextCycle != SLEEP)
    {
        nextCycle++;
    }
}

int Spot::getNextCycle()
{
    return nextCycle;
}

bool Spot::getIsBunny()
{
    return isBunny;
}

void Spot::makeBunny()
{
    if (!isBunny)
        nextCycle = UP;
    isBunny = true;
}


#endif  /* SPOT_H */


Bunny.cpp



#include "Spot.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <boost/algorithm/string.hpp>


using namespace std;


static string line;
static ifstream inFile;
static ofstream outFile;
bool isFilled(int x, int y, Spot **myMap);

int main () {
  int numSims = 0;
  inFile.exceptions ( ifstream::failbit | ifstream::badbit );

  try {
    inFile.open ("/home/mike/Desktop/input.txt");
    outFile.open ("/home/mike/Desktop/output.txt");
   // while(!inFile.eof())
      {

         getline (inFile,line);
        numSims= atoi(line.c_str());
       //cout<<"numSims: "<<numSims<<endl;
        for (int i = 0;i < numSims;i++)
            {
                int minPerCycle = 1;
                getline (inFile,line);
                minPerCycle= atoi(line.c_str());

            //cout << "minPerCycle: "<<minPerCycle <<endl;

                int row = 0;
                int col = 0;
                    getline (inFile,line);
                    std::vector<std::string> xy;
                    boost::split(xy, line, boost::is_any_of(" "));
                    row=atoi(xy.at(0).c_str());
                    col=atoi(xy.at(1).c_str());
                    //cout <<"row: "<< row<<endl;
                    //cout << "col: "<<col<<endl;


                    Spot** myMap = new Spot* [col];
                    for(int i = 0; i < col; ++i)
                        myMap[i] = new Spot [row];

                    //std::vector<std::vector<Spot> > myMap(x, std::vector<Spot>(y));
                    for (int i = 0;i < row;i++)
                            {
                                getline (inFile,line);
                                //cout<<line<<endl;
                                for (int j = 0;j < col;j++)
                                {
                                    if (line[j] == 'B')
                                    {
                                        myMap[i][j].setSpot(true);

                                    }
                                    else
                                    {
                                        myMap[i][j].setSpot(false);

                                    }
                                }
                            }
                int numCycles = 1;

                if (isFilled(row,col,myMap))
                {
                    numCycles = 0;
                }

                while (!isFilled(row,col,myMap))
                {
                    numCycles++;

                    for (int j = 0;j < row;j++)
                    {
                        for (int k = 0;k < col;k++)
                        {
                            if (myMap[j][k].getIsBunny())
                            {       //cout<< j<<" "<<k<<" " <<"true"<<endl;
                                    switch (myMap[j][k].getNextCycle())
                                    {
                                        case Spot::UP :
                                            if (j>0)
                                            myMap[j-1][k].makeBunny();
                                            break;
                                        case Spot::RIGHT :
                                            if (k<col-1)
                                            myMap[j][k + 1].makeBunny();
                                            break;
                                        case Spot::DOWN :
                                            if (j<row-1)
                                            myMap[j+ 1][k].makeBunny();
                                            break;
                                        case Spot::LEFT :
                                            if (k>0)
                                            myMap[j][k - 1].makeBunny();
                                            break;
                                    }
                                    myMap[j][k].setNextCycle();
                                }
                            //cout<< j<<" "<<k<<" " <<"outside"<<endl;
                        }
                    }

                }
                int time = numCycles*minPerCycle;
                outFile<<"It took " <<time <<" minutes for the bunnies to take over the world!\n";
                cout<<"It took " <<time <<" minutes for the bunnies to take over the world!\n";
                for(int i=0; i < col; i++) {
                   delete [] myMap[i];
                }
                delete myMap;

            }
      }

       inFile.close();
       outFile.close();

}
  catch (ifstream::failure e) {
    cout << "Exception opening/reading file";
  }

  return 0;
}


bool isFilled(int row, int col,Spot **myMap)
{
    for (int i = 0;i < row;i++)
    {
        for (int j = 0;j < col;j++)
        {
            if (!myMap[i][j].getIsBunny())
            {
                //cout<<"true ";
                return false;

            }
            //else
            //  cout<<"false ";


        }
        //cout<<endl;

    }
    return true;
}
4

3 回答 3

0

必须尝试用指针传递吗?

static bool isFilled(int row, int col,Spot** yourMap)

我不确定Spot myMap[row][col]编译器是否会接受row并且col似乎在运行时设置。

您可能需要按以下方式分配内存

Spot** myMap = new Spot* [col];
for(int i = 0; i < col; ++i)
    myMap[i] = new Spot [row];

删除内存将需要您使用类似for loop但记得调用delete []

于 2012-09-26T07:47:57.970 回答
0

我认为您可以将 2D 数组的引用发送到您想要使用 2D 数组的方法中。

bool isFilled(int row, int col, Spot &m){  // if you want a fix position in the array
 // Code
}

如果要删除数组,则必须使用删除运算符。

首先,您必须删除指针数组指向的所有数组,即

for(int i=0; i < size; i++) {
   delete [] spot[i];  // Depends on what you have called the array
}

然后你必须删除指针数组

delete [] spot;   
于 2012-09-26T07:48:54.957 回答
0

现货 myMap[row][col];

这不是合法的 C++ 代码。您可以在 C99 中执行此操作,但不能在 C++ 中执行此操作。

在 C++ 中有两个基本选择:

  1. 使用您将其视为二维数组的一维数组。
  2. 使用不规则的 2D 数组而不是连续的 2D 数组。

使用一维数组的主要优点是速度快。如果您需要速度,这是要走的路。图形程序员经常使用这种方法,因为他们需要这种速度。缺点是您必须将 2D 索引转换为单个索引。例如,map[i][j]可能变为map[i*col+j](行主要顺序)或map[i+j*row](列主要顺序)。

使用不规则数组的主要优点是索引是自然的。缺点是要管理的内存要多得多,而且访问速度要慢得多。使用扁平数组,访问包括少量整数操作和单个内存查找。参差不齐的数组需要两次内存查找。

这是 C++,所以我的建议是让你的地图成为一个类。提供具有分配内存的行和列大小的非默认构造函数,以及要清理的析构函数(如果需要)。如果你std::vector用作底层存储机制,它会为你做分配和清理。提供一个重载的operator()作为索引机制到你的地图。现在,您用来表示地图的机制已隐藏。您可以从向量向量开始,如果太慢,请切换到扁平数组方法。

于 2012-09-26T08:26:44.360 回答