我有这两种结构:
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的每个元素都需要为*。
答案 0 :(得分:1)
使用构造函数。
struct Location {
int x; // 1 through fieldSize
char y; // 'a' through fieldSize
// constructor
Location(): x(-1), y(`*`)
{
)
};
现在,每当您创建一个位置时,它都会随x == -1
和y == '*'
一起出现,而无需进一步努力。随着
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 array和std::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 = '*';
}
}