2次元配列の値を関数の引数として渡したい
解決済
回答 5
投稿
- 評価
- クリップ 1
- VIEW 6,542
タイトルの通り2次元配列で作ったものを関数の引数として渡したいです。また、2次元配列の大きさは固定ではありません。
私が書いたコードは、以下のようになります。
#include<iostream>
using namespace std;
void array(int n,int a[][n]){
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
a[i][j] = i*j;
}
}
}
int main(){
int n;
cin >> n;
int a[n][n];
array(n,a);
}
この状態で実行すると、以下のようなエラーが出ます。
g++ test.cpp
test.cpp:5:27: error: use of parameter outside function body before ']' token
void array(int n,int a[][n]){
^
test.cpp: In function 'void array(...)':
test.cpp:6:21: error: 'n' was not declared in this scope
for(int i = 0;i < n;i++){
^
test.cpp:8:7: error: 'a' was not declared in this scope
a[i][j] = i*j;
理由が分かる方教えてくれると助かります。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
void array(int n,int a[][n]){
引数の要素数として指定しているnが、コンパイル時に定数ではないからです。
C++を使っているんですから、std::vectorやstd::arrayを使いましょう。
#include <iostream>
#include <vector>
using SquareVec = std::vector<std::vector<int>>;
void array(const SquareVec &myVec) {
for(const auto &vec: myVec) {
for(const auto elem: vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
}
}
int main(void) {
int n;
std::cin >> n;
SquareVec myVec(n);
for(auto &vec: myVec) {
vec.resize(n, 0);
}
array(myVec);
return 0;
}
実行結果
5
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
void array(int n,int a[][n]) {
型が静的に決まらんことにはコンパイルできません。
なので int a[][n] は不正。
int a[n][n];
これも同様。nは定数でないとダメ。
..なのでタダの動的配列で書き直したのがコチラ:
#include<iostream>
void array(int n,int* a){
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
a[n*i + j] = i*j;
}
}
}
int main(){
using namespace std;
int n;
cin >> n;
int* a = new int[n*n];
::array(n,a);
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
cout << a[n*i + j] << ' ';
}
cout << endl;
}
delete[] a;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
こんにちは。
性能が重要な時は自分で2次元配列クラスを定義するのも手です。
面倒なのでコピー禁止してますが、必要ならmDataの指す領域を別途newしてcopyすればOKです。
#include <iostream>
#include <iomanip>
#include <algorithm>
template<typename tType>
class Array2D
{
std::size_t mRows;
std::size_t mCols;
tType* mData;
public:
Array2D(std::size_t m, std::size_t n) : mRows(m), mCols(n), mData(new tType[m*n])
{}
~Array2D()
{
delete[] mData;
}
std::size_t rows() const { return mRows; }
std::size_t cols() const { return mCols; }
tType* operator[](std::size_t i) { return mData + i*mCols; }
// コピー禁止
Array2D(Array2D const&) = delete;
Array2D& operator=(Array2D const&) = delete;
};
template<typename tType>
void initialize(Array2D<tType>& array)
{
for(std::size_t i = 0; i < array.rows(); i++)
{
for(std::size_t j = 0; j < array.cols(); j++)
{
array[i][j] = i*j;
}
}
}
int main(void)
{
std::size_t n;
std::cin >> n;
Array2D<int> a(n, n);
initialize(a);
for(std::size_t i = 0; i < a.rows(); i++)
{
for(std::size_t j = 0; j < a.cols(); j++)
{
std::cout << std::setw(5) << a[i][j];
}
std::cout << "\n";
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
(みなさん"C++"を前提にされているので"C"を前提とした回答もしておきます)
- C++言語ではNGです。
n
はコンパイル時定数でければなりません。 - C言語(C99以降)ではOKです。第1引数に与えた
n
の値は、第2引数の2次元配列型に適用されます。(厳密には"VLA型へのポインタ型"になります)
C++にはないCの機能として VLA(Variable Length Array; 可変長配列) があります。C/C++の差異はこの言語機能の有無から生じています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
void array(int n,int a[][n])とありますが引数nをそのまま別の引数の配列長にしているのは文法的に不可能らしいです(未確認)
一番簡単な例は、一次元配列に置き換えて、添字処理を自前で変換すれば良いです。つまり、void array(int n, int a[])の中でa[i][j] をa[i * n + j]と置き換えれば処理できます。
もちろん、mallocやnewを使うという方法もありますが、かなり面倒です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる