質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

11493閲覧

2次元配列の値を関数の引数として渡したい

munekoda

総合スコア23

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/09/15 06:26

タイトルの通り2次元配列で作ったものを関数の引数として渡したいです。また、2次元配列の大きさは固定ではありません。

私が書いたコードは、以下のようになります。

C++

1#include<iostream> 2 3using namespace std; 4 5void array(int n,int a[][n]){ 6 for(int i = 0;i < n;i++){ 7 for(int j = 0;j < n;j++){ 8 a[i][j] = i*j; 9 } 10 } 11 12} 13 14int main(){ 15 int n; 16 cin >> n; 17 int a[n][n]; 18 array(n,a); 19 20} 21

この状態で実行すると、以下のようなエラーが出ます。
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;

理由が分かる方教えてくれると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

(みなさん"C++"を前提にされているので"C"を前提とした回答もしておきます)

  • C++言語ではNGです。nはコンパイル時定数でければなりません。
  • C言語(C99以降)ではOKです。第1引数に与えたnの値は、第2引数の2次元配列型に適用されます。(厳密には"VLA型へのポインタ型"になります)

C++にはないCの機能として VLA(Variable Length Array; 可変長配列) があります。C/C++の差異はこの言語機能の有無から生じています。

投稿2017/09/15 17:04

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

性能が重要な時は自分で2次元配列クラスを定義するのも手です。
面倒なのでコピー禁止してますが、必要ならmDataの指す領域を別途newしてcopyすればOKです。

C++

1#include <iostream> 2#include <iomanip> 3#include <algorithm> 4 5template<typename tType> 6class Array2D 7{ 8 std::size_t mRows; 9 std::size_t mCols; 10 tType* mData; 11public: 12 Array2D(std::size_t m, std::size_t n) : mRows(m), mCols(n), mData(new tType[m*n]) 13 {} 14 ~Array2D() 15 { 16 delete[] mData; 17 } 18 std::size_t rows() const { return mRows; } 19 std::size_t cols() const { return mCols; } 20 tType* operator[](std::size_t i) { return mData + i*mCols; } 21 22 // コピー禁止 23 Array2D(Array2D const&) = delete; 24 Array2D& operator=(Array2D const&) = delete; 25}; 26 27template<typename tType> 28void initialize(Array2D<tType>& array) 29{ 30 for(std::size_t i = 0; i < array.rows(); i++) 31 { 32 for(std::size_t j = 0; j < array.cols(); j++) 33 { 34 array[i][j] = i*j; 35 } 36 } 37} 38 39int main(void) 40{ 41 std::size_t n; 42 std::cin >> n; 43 44 Array2D<int> a(n, n); 45 initialize(a); 46 for(std::size_t i = 0; i < a.rows(); i++) 47 { 48 for(std::size_t j = 0; j < a.cols(); j++) 49 { 50 std::cout << std::setw(5) << a[i][j]; 51 } 52 std::cout << "\n"; 53 } 54}

投稿2017/09/15 07:51

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

void array(int n,int a[][n]) {

型が静的に決まらんことにはコンパイルできません。
なので int a[][n] は不正。

int a[n][n];

これも同様。nは定数でないとダメ。

..なのでタダの動的配列で書き直したのがコチラ:

C++

1#include<iostream> 2 3void array(int n,int* a){ 4 for(int i = 0;i < n;i++){ 5 for(int j = 0;j < n;j++){ 6 a[n*i + j] = i*j; 7 } 8 } 9} 10 11int main(){ 12 using namespace std; 13 14 int n; 15 cin >> n; 16 int* a = new int[n*n]; 17 ::array(n,a); 18 19 for(int i = 0;i < n;i++){ 20 for(int j = 0;j < n;j++){ 21 cout << a[n*i + j] << ' '; 22 } 23 cout << endl; 24 } 25 26 delete[] a; 27}

投稿2017/09/15 06:49

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

void array(int n,int a[][n]){

引数の要素数として指定しているnが、コンパイル時に定数ではないからです。


C++を使っているんですから、std::vectorやstd::arrayを使いましょう。

C++

1#include <iostream> 2#include <vector> 3 4using SquareVec = std::vector<std::vector<int>>; 5 6void array(const SquareVec &myVec) { 7 for(const auto &vec: myVec) { 8 for(const auto elem: vec) { 9 std::cout << elem << " "; 10 } 11 std::cout << std::endl; 12 } 13} 14 15int main(void) { 16 int n; 17 std::cin >> n; 18 19 SquareVec myVec(n); 20 21 for(auto &vec: myVec) { 22 vec.resize(n, 0); 23 } 24 25 array(myVec); 26 27 return 0; 28}

実行結果

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

投稿2017/09/15 06:43

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

void array(int n,int a[][n])とありますが引数nをそのまま別の引数の配列長にしているのは文法的に不可能らしいです(未確認)

一番簡単な例は、一次元配列に置き換えて、添字処理を自前で変換すれば良いです。つまり、void array(int n, int a[])の中でa[i][j] をa[i * n + j]と置き換えれば処理できます。

もちろん、mallocやnewを使うという方法もありますが、かなり面倒です。

投稿2017/09/15 06:37

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問