如何将复杂的结构数组传递给函数?

时间:2016-11-06 18:13:02

标签: c++

我有这两种结构:

const int fleetSize = 5; 
const int fieldSize = 5;

struct Location {
    int x;  // 1 through fieldSize
    char y; // 'a' through fieldSize
};

struct Ship {
    Location loc;
    bool sunk;
};

我也在头文件中有这个原型:

void initialize(Ship[]);

在main中,我从一个单独的源文件调用一个函数,该文件应该为所有的' x'位置值和' *'对所有的'值如下所示:

int main()
{
    Ship myFleet[fleetSize];
    initialize(myFleet);
}

我的问题是我不知道从哪里开始。我只有这个:

void initialize (int a[])
{
    for (int i = 0; i < fleetSize; i++)
    {
        a[i] = -1;
    }
}

我不知道这甚至在做什么,如果有的话,因为我无法通过大量的LNK错误进行调试,我也想不通。所以我的问题是,这是对的吗?如果是,我该如何为每个&#39;分配星号?

因此,x的每个元素都需要为-1,y的每个元素都需要为*。

3 个答案:

答案 0 :(得分:1)

使用构造函数。

struct Location {
    int x;  // 1 through fieldSize
    char y; // 'a' through fieldSize

    // constructor
    Location(): x(-1), y(`*`)
    {
    )
};

现在,每当您创建一个位置时,它都会随x == -1y == '*'一起出现,而无需进一步努力。随着

struct Ship {
    Location loc;
    bool sunk;
    Ship(): sunk(false)
    {
    }
};

每个Ship出厂时都是ununk,而-1,'*'。

所以

Ship myFleet[fleetSize];

刚刚制作并初始化fleetSize未解密Ship s为-1,'*',您无需付出更多努力。

对于传递数组,当您使用数组调用函数时,数组的大小将丢失。有关详情,请阅读What is array decaying?

所以

void initialize(Ship[]);

可能是

void initialize(Ship ships[fleetsize]);

如果fleetsize是编译时常量,则代码中设置的值永远不能更改,以便编译器可以生成数组索引,并知道允许进行某些优化的大小。

或者

void initialize(Ship * ships, size_t fleetsize);

如果fleetsize不是固定值,并且可以在运行时更改。动态fleetsize可能导致程序必须管理动态内存,这可能比它看起来更棘手。

但是...

C ++提供了许多可用于代替数组的“容器”。这些容器知道它们的大小,为您管理动态内存,并且通常在or in the <algorithm> library内构建一系列筛选,搜索和排序工具,使生活更轻松。对您的用例看起来特别有用的两个是std::vector, a dynamic arraystd::array, a statically-sized array

编辑:随机位置

RNG设置代码从std::uniform_int_distribution

高兴地被盗
#include <random>

std::random_device rd; // cannot be trusted with mingw. Use time(null) instead
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 5);

struct Location {
    int x;  // 1 through fieldSize
    char y; // 'a' through fieldSize

    // constructor. Note 
    Location()
    {
        do
        { 
            x = dis(gen); // number
            y = 'a'+dis(gen)-1; // requires sequentially ordered character set like ASCII
        } while(locIsOccupied(x,y)); // ensure x and y are unused. 
    )
};

我已离开locIsOccupied未实现。

另一个愚蠢的伎俩是

包含所有可能vector<Location> locations的{​​{1}}。 random_shuffle Locations

locations

答案 1 :(得分:0)

a[i].loc.x = -1;
a[i].loc.y = '*';

答案 2 :(得分:0)

void initialize(Ship[]);

代表一个名为initialize的函数,它接受一个未知大小的Ship数组并且不返回任何内容

除非你知道它的大小,否则不能迭代数组:

void initialize(Ship[] array, std::size_t size)
{
    for (std::size_t i = 0; i < size; ++i)
    {
        array[i].loc.x = -1;
        array[i].loc.y = '*';
    }
}