2012-04-11 10 views
1

2次元配列を受け取り、その行の1つ( ')'を単純な配列として返す関数を作成したいと考えています。配列の添字は「int型[INT]」無効なタイプを:2次元配列から行または列を抽出するC++

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行目で、私は次のエラーを得た:私はこれを書きました。どのようにこれを正しく行うにはどのようなアイデア?私はまた、配列の配列として2D配列を扱おうとしましたが、成功しませんでした。私は初心者ですので、あまりにも高度な概念を避けてください。

ありがとうございました!

更新:ありがとうございました!今問題になる可能性が何のint [100] '

に「int型*」の割り当てに互換性のない型:

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); 
} 

私はまだメインでエラーが発生します。今私のコードは次のようになりますか?私はまた、配列を解放するためにどこにdelete []関数を使うべきかわかりません。

ありがとうございました!

+0

2次元配列を渡すには、配列パラメーターが 'int **'である必要があります。そうでない場合は、1次元配列を渡しています。 –

答えて

4

また

int* result = new int[columns]; 

を、arrayの使用が間違って見えます。 arrayは単一のポインタであることを行っている場合、あなたがしたい:

result[i] = array[which*columns + i]; 
2

"array"は1次元です。配列[which * columns + i]を介してindex [which] [i]で要素にアクセスできます。また、アスタリスクも削除してください。なぜなら配列は単一のポインタだからです。

EDIT:また、あなたは地元の配列を返すことはできません - あなたは、動的メモリに対処する必要があります。

int* result = new int[columns]; 

そして、このメモリを解放するために特別な注意を払います。他のオプションはstd :: vectorを使うことです。あなたはダイナミックアロケーション必要

int result[columns]; 

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

+0

ローカルアレイを削除する/ローカルアレイをリターンする/? –

1

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

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

私はここに掲示のエチケットに従っていないと知っていますが、問題が発生したときに素敵なテキストブックから始め、基本を掴んでここに来てください。

1

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

配列を使いこなすのではなく、おそらくstd::vector(おそらく2D行列クラスとともに)を使用するべきです。

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"; 
} 
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; 
} 

これを使用して、このポインタ演算とメモリ割り当ての全てを回避することができます。