1

2 次元配列を受け取り、その行の 1 つ ('which') を単純な配列として返す関数を作成したいと思います。私はこれを書きました:

int *row(int *array, int lines, int columns, int which)
{
    int result[columns];

    for (int i=0; i<columns; i++)
    {
        result[i] = *array[which][i];
    }
    return result;
}

ただし、7 行目で次のエラーが発生しました。無効な型 'int[int]' for array subscript. これを適切に行う方法はありますか?また、2D 配列を配列の配列として処理しようとしましたが、成功しませんでした。私は初心者なので、高度すぎる概念は避けてください。

助けてくれてありがとう!

更新: 助けてくれてありがとう! 今私のコードは次のようになります:

int n;  //rows
int m;  //columns
int data[100][100];   
int array[100];

int *row(int *array, int rows, int columns, int which)
{
    int* result = new int[columns];
    for (int i=0; i<columns; i++)
    {
        result[i] = *array[which*columns+i];
    }
    return result;
    delete[] result;
}

int main()
{
    array=row(data, n, m, 0);
}

メインでまだエラーが発生します: 'int*' から 'int [100]' への割り当てに互換性のない型があります

今、何が問題になっているのでしょうか? また、delete[] 関数を使用して配列を解放する場所もわかりません。

助けてくれてどうもありがとう!

4

6 に答える 6

4

これを行うことはできません:

int result[columns];

動的割り当てが必要です。

int* result = new int[columns];

また、あなたの使い方はarray間違っているようです。が単一のポインターになる場合arrayは、次のようにします。

result[i] = array[which*columns + i];
于 2012-04-11T14:21:19.200 に答える
2

「配列」は一次元です。array[which*columns + i] を介して、インデックス [which][i] を持つ要素にアクセスできます。また、配列は単一のポインタであるため、アスタリスクも削除します。

編集:また、ローカル配列を返すことはできません-動的メモリを処理する必要があります:

int* result = new int[columns];

そして、このメモリを解放するために特別な注意を払ってください。他のオプションは、std::vector を使用することです。

于 2012-04-11T14:20:56.130 に答える
1

最初に修正する必要があるいくつかのエラーがあります。

  1. 関数からローカル変数へのポインターを返してはいけません。上記のコードでは、ローカル変数である「result」の内容へのポインターを返そうとしています。
  2. あなたの場合、可変列の場合、可変サイズで配列を宣言することはできません。
  3. 配列が2次元配列である場合、それはあなたの意図だと思いますが、array[which][i]はintを返します。逆参照する必要はありません。

ここで投稿のマナーを守っていないことは承知していますが、まず良いテキストから始めて、基本をつかみ、問題が発生したときにここに来ることをお勧めします。

于 2012-04-11T14:30:02.350 に答える
1

配列のサイズは、コンパイル時の定数である必要があります。

配列をいじる代わりに、おそらくstd::vector(おそらく 2D 行列クラスと共に) を使用する必要があります。

于 2012-04-11T14:30:54.233 に答える
0

を使用して、このポインター演算とメモリ割り当てをすべて回避できます。std::vector

#include <vector>
#include <iostream>

typedef std::vector<int> Row;
typedef std::vector<Row> Matrix;

std::ostream& operator<<(std::ostream& os, const Row& row) {
  os << "{ ";
  for(auto& item : row) {
    os << item << ", ";
  }
  return os << "}";
}

Row getrow(Matrix m, int n) {
  return m[n];
}

Row getcol(Matrix m, int n) {
  Row result;
  result.reserve(m.size());
  for(auto& item : m) {
    result.push_back(item[n]);
  }
  return result;
}

int main () {
  Matrix m = {
    { 1, 3, 5, 7, 9 },
    { 2, 4, 5, 6, 10 },
    { 1, 4, 9, 16, 25 },
  };

  std::cout << "Row 1: " << getrow(m, 1) << "\n";
  std::cout << "Col 3: " << getcol(m, 3) << "\n";  
}
于 2012-04-11T14:33:07.213 に答える
0
double *row(double **arr, int rows, int columns, int which)
{
double* result = new double[columns];
for (int i=0; i<columns; i++)
{
    result[i] = arr[which][i];

}
return result;
delete[] result; 
}

これにより、行が返されます。

于 2015-02-11T11:11:04.957 に答える