2

オブジェクト配列のサイズが実行時に決定されるプログラムがあるので、動的に割り当てられます(2D配列、ファイルからの読み取り)。これらのオブジェクトをパラメータとして受け取る関数もあります。問題は、関数パラメーターが関数に渡される2D配列である場合、2次元を決定する必要があることです。しかし、私の場合はそうではありません。プロトタイプには上記の2次元がないため、プログラムはコンパイルされません。

これが私が試したことです:

//global variables
int residentCount=0;
int hospitalCount=0;
Resident** residents;
Hospital** hospitals;
bool readFromFiles(const string, const string, const int); //sizes are determined in here
void print(Hospital*[hospitalCount], Resident*[residentCount]); //declaration issue

どうすればこれを解決できますか?

4

3 に答える 3

4
C ++でプログラミングしているので、次のことを行う必要があります。
  • 可能な場合は、動的割り当てを避け、メモリ管理を自分で処理することを常に避けてください
  • Cスタイルの配列の使用を避け、実際には一般的にC++としてコンパイル可能なCコードの記述を避けてください。
    • C ++が提供する優れた機能、特にSTLにバンドルされている機能を使用する
  • ローカルの同等物で十分な場合は、グローバル変数の使用を避けてください

これはどのように見えるかです:

typedef std::vector<Resident> Residents;
typedef std::vector<Hospital> Hospitals;

// passing by const reference:
void print(const std::vector<Hospitals>&, const std::vector<Residents>&);

int main()
{
    std::vector<Hospitals> hospitals;
    std::vector<Residents> residents;
    ...
} // <-- lifetime of automatics declared within main ends here

hospitalsresidentsは自動保存期間のあるオブジェクトであり、Cスタイルの2D配列と同じように使用できることに注意してください。実行がの範囲外になるとmain、これらのベクトルは破棄され、以前に存在していた要素(要素の要素を含む)が自動的にクリーンアップされるメモリが作成されます。

また、const参照で渡すことをお勧めします。つまりconst std::vector<Hospitals>&、渡されたオブジェクトのコピーが作成されないようにし、constキーワードが呼び出し元に明示的に「このオブジェクトを参照で渡しますが、変更しません」と通知します。

于 2013-03-22T16:19:57.843 に答える
3

配列の最初の要素と次元へのポインターを渡すだけで十分です。例:

void PrintHospitals(Hospital* Hospitals, size_t HospitalRows, size_t HospitalColumns)
{
  size_t i, j;
  Hospital* hospital;

  for (i = 0; i < HospitalRows; i++)
    for (j = 0; j < HospitalColumns; j++)
    {
      hospital = Hospitals + HospitalColumns * i + j;
      PrintHospital(hospital);
    }
}

int main()
{
  Hospital hospitals[10][20];
  // ...
  PrintHospitals(&hospitals[0][0], 10, 20);
  return 0;
}
于 2013-03-22T16:07:57.830 に答える
0

テンプレートを使用して、既存のデータの 2 次元配列ラッパーを作成するソリューションを次に示します。

template<typename T>
class Array2d {
  public:
  int Rows;
  int Cols;
  T** Data;

  Array2d(int rows, int cols, T** data) :
    Rows(rows),
    Cols(cols),
    Data(data) { }
};

void print(Array2d<Hospital> h, Array2d<Resident> r) {
  for (int i = 0; i < h.Rows; i++) {
    for (int j = 0; j < h.Cols; j++) {
      //Print Data[i][j] element here
    }
  }
  // Other print code
}

int main()
{
   Resident** residents;
   Hospital** hospitals;

   //Init data arrays

   Array2d<Hospital> h(10, 10, hospitals);
   Array2d<Resident> r(10, 10, residents);

   print(h, r);
}
于 2013-03-22T16:45:28.863 に答える