将数组传递给函数

时间:2012-10-03 04:47:26

标签: c++ function struct structure

我目前在一个介绍性的c ++课程中,正在进行分类数据的工作任务。我们最近介绍了结构,我决定使用结构来解决问题,而不是创建3个数组来保存数据文件中的信息。

我遇到的麻烦是当我试图将我的结构传递给我的函数时。 这是我的错误:

analyze_data.cpp: In function ‘int main()’:
analyze_data.cpp:76: error: conversion from ‘weather*’ to non-scalar type ‘weather’ requested
analyze_data.cpp: In function ‘int find_pos_of_smallest(weather, int, int)’:
analyze_data.cpp:110: error: no match for ‘operator[]’ in ‘data[pos]’
analyze_data.cpp:110: error: no match for ‘operator[]’ in ‘data[pos_of_smallest]’

我不理解第76行的错误。我做了一些关于将结构传递给函数的研究,我发现了添加“&”在类型声明中。但是,我不知道它做了什么或为什么我需要这样做,因为我们没有在课堂上介绍它。我也尝试过,但我得到了一组不同的错误。所以我想我不会发布那些,只是从我所知道的开始。

这是我的代码

  /*
    Program name: Analyze data
    Program discription:  This program will read a data file named data.txt.
      This data file is expected to be formated in a specific way and contain
      specific weather information.  The program will analyize this data and
      return max, min temperatures, 'perfect days', how many cold fronts per
      year, 10 coldest  and hottest days in a year and finally find the 5
      median days of the year.

    Date:  10/1/2012
  */

  #include <iostream>
  #include <fstream>

  using namespace std;

  /*
  * Declare struct's here
  *
  */ 
  struct weather
  {
    string date;
    int high;
    int low;
  };

  /* 
  *  Forward declaration of a function.  This declares the function,
  *  but does not define it.  (Notice that there is no code, just
  *  a function header with a semicolon after it.
  *
  */
  int find_pos_of_smallest (weather data, int start_pos, int end_pos);

  /* Our main function.
  *
  * Parameters:
  *    none
  *
  * Return value:
  *    0 if we complete successfully, 1 if there was an error.
  */
  int main()
  {
    //read the data file
    ifstream weather_data("data.txt");
    //declare array size, and then create array using struct
    int days = 365;
    weather data[days];

    //store the data.txt in the array and then close the file
    for (int i=0; i<days; i++)
    {
      weather_data >> data[i].date;
      weather_data >> data[i].high;
      weather_data >> data[i].low;
    }
    weather_data.close();

    ofstream data_results ("results.txt");
    // create the first 3 lines of the output reults in the following formated
    data_results << "Assignment #5\n"
                << "CS 1410/2000\n"
                << "Jonathan Larsen\n";
    /*
    for(int i=0; i<3; i++)
    {
      cout<<data[i].date << " "<<data[i].high << " " << data[i].low<<endl;
    }
    cout<<endl;
    */  
    cout<<find_pos_of_smallest(data, 0, days)<<endl;


    return 0;  //no error so return a zero  
  }//end of program


  /**** FUNCTIONS ****/

  /* Write down exactly what the function will do (a postcondition).
  * Write down what is required to use the function (any preconditions).
  * Write down any other behavior or comments that will help a programmer.
  *
  * Parameters:   (list parameters by type and name, and explain them)
  *   int example -- an example parameter
  *
  * Returns:
  *   double -- an example return value
  */

  /* Returns the position of the smallest value found in the specified
  * subarray.  (Only the elements in the subarray
  * between start_pos and end_pos inclusive are checked.)
  *
  * Parameters:
  *    d - a data array
  *    start_pos - the first position to check
  *    end_pos - the last position to check
  */
  int find_pos_of_smallest (weather data, int start_pos, int end_pos)
  {
    int pos_of_smallest = start_pos;

    for (int pos = start_pos+1; pos <= end_pos; pos++)
      if (data[pos].low < data[pos_of_smallest].low)
        pos_of_smallest = pos;

    return pos_of_smallest;
  }

3 个答案:

答案 0 :(得分:1)

您正在将数组传递给您的函数。您的函数需要采用weather[]weather*类型。例如:

int find_pos_of_smallest (weather* data, int start_pos, int end_pos)

您应该注意,即使您没有传递数组而是传递常规结构,您仍应通过引用传递。传递指针(天气*)并使用解除引用的memeber运算符( - &gt;)或通过引用传递(weather&amp;)并使用普通成员运算符(。)。这是因为传递值(no * /&amp;)会导致将结构复制到堆栈上的新值,这可能需要相当长的时间来处理大值(例如,如果字符串变大)。

答案 1 :(得分:0)

您需要将数组作为指针传递:

int find_pos_of_smallest (weather *data, int start_pos, int end_pos)

将参数声明为weather data仅表示结构的单个实例。使它成为指针意味着您可以传递一个数组(指针将获取数组中第一个元素的地址,当您使用data[pos]对其进行索引时,您将获得该数组中的相关元素。)

答案 2 :(得分:0)

每当你声明某个数组的数组时,比如你的data数组,在后续代码中自己编写数组的名称(在本例中为data),实际上相当于写< / p>

&(data[0])

表示“data数组的第一个元素的地址”。这就是如何通过传递第一个元素的地址,将数组通常“传递”到C和C ++中的函数中。它是这样做的,因为传递其他类型的参数的通常方式 - 即复制它们 - 在大型数组的情况下会非常浪费。它还有副作用,允许函数对数组所做的任何更改对调用代码可见(有时这是必需的,有时不需要)。

你如何在函数内使用该地址?您使用指针 - weather

int find_pos_of_smallest(weather* data, int start_pos, int end_pos)

指针是一个包含其他东西地址的变量。您可以使用*间接运算符,->运算符(如果指向的东西是structclass)来访问指向的东西,并且方便,数组下标运算符[]:例如在find_pos_of_smallest()内,

data[5]

指的是weather元素数组中的第六个元素,从存储在指针data内的地址开始。