我正在尝试创建一个随机生成“船只”位置的程序。我想要一个结构来跟踪船舶的多个方面,包括它们的位置和一个跟踪多艘船的阵列。
我遇到的错误似乎发生在#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
int rand_range (int low, int high) {
return rand() % (high - low + 1) + low;
}
struct ship_stats {
int x_coordinate;
int y_coordinate;
int weapon_power;
};
ship_stats fleet[5]; // Create fleet of 5 ships linked to the structure
ship_stats ship_position (ship_stats fleet[], int ship_num) {
//Randomly generate a starting position for each ship
int low_x = 0; //Set max and min ranges for ship position
int high_x = 1024;
int low_y = 0;
int high_y = 768;
fleet[ship_num].x_coordinate = rand_range (low_x, high_x);
fleet[ship_num].y_coordinate = rand_range (low_y, high_y);
return fleet[ship_num];
}
int main () {
int num_ships = 5;
for (int i = 0; i < num_ships; i++)
fleet[i] = ship_position (fleet[i], i); // <-- error is here
}
行“main”中的第一个for循环中。错误显示为:
错误:无法将'ship_stats'转换为'ship_stats *'以将参数'1'转换为'ship_stats ship_position(ship_stats *,int)'
此外,之前我不认为该行括号内的第二个“i”是必要的,但是当我尝试编译时没有它我收到的错误是:
错误:在']'标记
之前预期的主要表达式
async Task Upload(DropboxClient dbx, string folder, string file, string content)
{
using (var mem = new MemoryStream(Encoding.UTF8.GetBytes(content)))
{
var updated = await dbx.Files.UploadAsync(
folder + "/" + file,
WriteMode.Overwrite.Instance,
body: mem);
Console.WriteLine("Saved {0}/{1} rev {2}", folder, file, updated.Rev);
}
}
答案 0 :(得分:0)
您给出的机械点是,如果您想将“原始”数组作为C ++(或C)中的参数传递,则不能说fleet[]
。正如你所指出的那样,这不会编译。但是,不要只是在括号中放置一个随机索引值 - 这将获得一个数组元素,而不是数组本身。
如果仅仅通过说fleet
来传递“整个原始阵列”,这有点过于简单了。你真的传递了第一个元素的地址,例如fleet
最终等同于&fleet[0]
。粗俗虽然也就是说,它来自C的遗产...而且这意味着如果您正在调用的函数知道“原始”数组的大小,那么该地址可以有意义地用作访问任何后续值的方法。它
但在“惯用”C ++中,人们很少想使用“原始”C风格的数组。 std::vector解决了原始数组的几个弱点,对初学者来说是个不错的选择。
您可以选择“按值”(生成副本)或“按引用”传递向量(这有点像通过指针传递,是原始数组的唯一选择)。矢量不必提前知道它们的大小,它们的大小可以在程序的过程中改变。不仅如此,当它作为参数传递时,大小随附矢量。而且非常重要的是,向量使用抽象的“收集协议”,这意味着它们可以与#include <algorithm>
一起使用。
但还有其他几点。你已经建立了一个ship_position()
函数来“构建”一艘船。这个形状奇特的函数返回一个值(构造船的实例),但也会改变你的“舰队”,以便船只处于该位置。为什么需要返回值并将其分配给车队中的位置...如果车队的突变已经是该功能的一部分?
在C ++中,“构造”某事的最佳机制是......构造函数。 ship_position()
是我们所谓的“自由函数” - 它不在ship_stat的定义中,但它似乎对如何操纵船只有一种怪异的知识。
(支持说明:weapon_power在哪里适用于所有这些?是否可以初始化它?是什么?“构造函数”的单点责任到位,说是建造船舶的所有领域都包括在内。)
如果这是一个合适的C ++程序,你不应该将ship_stats
视为由“自由函数”操作的结构。相反,您需要将Ship
视为包含某些数据和某些代码的类。船舶的随机化应该在您的班级内...将随机船舶放入集合中的行为应该使用push_back
到一个向量(或emplace_back
,但这非常跳过)。
尽管确实知道你在做什么,但不要在C ++程序中使用原始C数组。 (或者不使用C ++功能而是标记您的问题C,答案将会非常不同。)
答案 1 :(得分:-1)
就像评论中已经说过的那样,你试图传递一个ship_stats
来运行等待它们array
的函数,所以为了使函数能够工作它应该是这样的
ship_stats ship_position (ship_stats fleet, int ship_num) {
//Randomly generate a starting position for each ship
int low_x = 0; //Set max and min ranges for ship position
int high_x = 1024;
int low_y = 0;
int high_y = 768;
fleet.x_coordinate = rand_range (low_x, high_x);
fleet.y_coordinate = rand_range (low_y, high_y);
return fleet;
}
答案 2 :(得分:-1)
尝试
#include <string>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
int rand_range(int low, int high) {
return rand() % (high - low + 1) + low;
}
struct ship_stats {
int x_coordinate;
int y_coordinate;
int weapon_power;
};
ship_stats fleet[5]; // Create fleet of 5 ships linked to the structure
ship_stats ship_position(ship_stats IndividualShip, int ship_num) {
//Randomly generate a starting position for each ship
int low_x = 0; //Set max and min ranges for ship position
int high_x = 1024;
int low_y = 0;
int high_y = 768;
IndividualShip.x_coordinate = rand_range(low_x, high_x);
IndividualShip.y_coordinate = rand_range(low_y, high_y);
return IndividualShip;
}
int main() {
int num_ships = 5;
for (int i = 0; i < num_ships; i++) {
fleet[i] = ship_position(fleet[i], i); // <-- error is here
}
}
在上面的代码中,我已经将ship_position的函数参数更改为接受单个船而不是整个数组。你的代码应该编译。此外,如果这是C ++而不是C,请考虑使用for循环
for (ship_stats& j : fleet)
std::cout << j.x_coordinate << " " << j.y_coordinate << endl;
使用&lt;输出程序的结果iostream&gt;当然。