在c ++中使用函数内的数组和结构

时间:2017-03-04 21:16:28

标签: c++ arrays struct

我正在尝试创建一个随机生成“船只”位置的程序。我想要一个结构来跟踪船舶的多个方面,包括它们的位置和一个跟踪多艘船的阵列。

我遇到的错误似乎发生在#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);
    }
}

3 个答案:

答案 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;当然。