1

私は現在、入門用の 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;
  }
4

3 に答える 3

1

関数に配列を渡しています。関数は typeweather[]またはのいずれかを取る必要がありますweather*。例えば:

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

配列ではなく通常の構造体を渡している場合でも、参照渡しする必要があることに注意してください。ポインターを渡して (weather*) 間接参照メンバー演算子 (->) を使用するか、参照渡し (weather&) で通常のメンバー演算子 (.) を使用します。これは、値渡し (*/& なし) により、構造体がスタック上の新しい値にコピーされ、大きな値の場合 (たとえば、文字列が大きくなった場合) にかなりの時間がかかるためです。

于 2012-10-03T04:50:58.903 に答える
0

配列をポインターとして渡す必要があります。

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

パラメーターを として宣言することweather dataは、構造体の単一のインスタンスを意味します。ポインターにすることは、配列を渡すことができることを意味します (ポインターは配列内の最初の要素のアドレスを取得し、インデックスをdata[pos]付けると、その配列内の関連する要素を取得します)。

于 2012-10-03T04:51:07.097 に答える
0

配列のような何かの配列を宣言するときはいつでも、後続のコードでdata配列の名前 (この場合は ) を単独で記述することは、紛らわしいことに、実際には次のように記述することと同じです。data

&(data[0])

これは、「配列の最初の要素のアドレス」を意味しますdata。これは、配列が通常、C および C++ の関数に "渡される" 方法です (最初の要素のアドレスを渡すことによって)。他のタイプの引数を渡す通常の方法、つまりそれらをコピーする方法は、大きな配列の場合に非常に無駄になるため、この方法で行われます。また、関数が配列に加えた変更を呼び出し元のコードに表示できるという副作用もあります (必要な場合とそうでない場合があります)。

関数内でそのアドレスをどのように処理しますか? へのポインタを使用しますweather:

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

ポインターは、他のもののアドレスを含む変数です。*間接演算子、->演算子 (指しているものがstructorの場合class)、および便利な配列添え字演算子を使用して、指している対象にアクセスできます[]。たとえば、 inside find_pos_of_smallest()

data[5]

weatherポインタ内に格納されたアドレスから始まる要素の配列の 6 番目の要素を参照しますdata

于 2012-10-03T05:23:45.500 に答える