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

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

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

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

Q&A

解決済

2回答

1808閲覧

値のわからない二次元配列を関数に渡す方法

MrKametyou

総合スコア14

C++

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

0グッド

0クリップ

投稿2017/03/15 15:45

二つのINT型の値を入力した後その二つの値でできる二次元配列を引数として関数に渡したいのですが、入力となると値がランダムなのでどのように関数にわたせばよいのかわかりません。どのように渡せばよいのでしょうか。


int a,b;
cin >> a >> b;//値を入力
array[a][b]の二次元配列を作成

void function(int a[][])//ここへの渡し方がわかりません

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

std::vector<>を使うと良いですよ。

C++

1#include <iostream> 2#include <vector> 3 4 : 5 6std::size_t a, b; 7std::cin >> a >> b; 8std::vector< std::vector<int> > array(a, std::vector<int>(b, 0));

投稿2017/03/15 16:08

Chironian

総合スコア23272

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

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

MrKametyou

2017/03/16 05:11

なるほど、私の勉強不足でした。 ありがとうございます。
guest

0

Variable Length Array は C99 の機能であり、C99では、次のように扱うことができます:

c

1 2int func_vla(int a, int b, int arr[a][b]) { 3 return arr[1][2]; 4} 5 6int main(void) { 7 int a, b; 8 a = 2, b = 3; // ここが std::cin の部分です 9 10 int arr[a][b]; 11 arr[1][2] = 3; 12 printf("%d\n",func_vla(a,b,arr)); 13} 14

** 追記:以下の記述は未定義動作を引き起こすとコメントを頂きましたので、用いないようにしてください。間違った回答をしたことをお詫びします。 **

これをそのまま C++ でコンパイルしようとしても動かないようですね。無理矢理動かすとしたら次のような形になるのでしょうか?

cpp

1 2int func(int *arr) { 3 return arr[5]; // main() でいうところの arr[1][2] にあたる 4} 5int main(void) 6{ 7 int a, b; 8 a = 2, b = 3; 9 10 int arr[a][b]; 11 arr[1][2] = 3; 12 std::cout << func(&arr[0][0]) << std::endl; 13 14 return 0; 15} 16

単に二次元配列を連続するメモリ領域とみて渡しているだけですが、 int func(int *arr)内での添字に気をつけてください。

こうするよりは、std::vectorを利用するほうが簡単だと思います。あるいはまだa,bが定数ならもう少し簡単に扱えます(その場合でも std::array を使うとこれまたより簡単だとは思いますが。)

投稿2017/03/15 16:27

編集2017/03/16 06:59
Eki

総合スコア429

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

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

Zuishin

2017/03/15 22:40

C の二次元配列はジャグ配列ですよ。
yohhoy

2017/03/16 00:39 編集

VLAを使わない/使えない場合、動的(実行時)にしか要素数が決まらない二次元配列(風にアクセス可能なオブジェクト)は、事実上ジャグ配列としてしか確保できません。(Zuishinさんコメントの趣旨はこちら?) 一方、静的(コンパイル時)に要素数が決まる二次元配列型では、配列要素のメモリ配置は連続的なため"ジャグ配列"というのは正確ではないと思います。ただ、この場合でもEkiさん回答のようにあたかも一次元配列のように扱うのは未定義動作を引き起こす(つまりNG)ようです。
Eki

2017/03/16 01:31

なるほど、勉強不足でした。 静的に要素数が決まる二次元配列を連続する一次元配列のように扱うと未定義になるのはどうしてなのでしょうか? また、malloc()を使って配列を一つずつ確保して、それへのポインタを配列としてもつような場合はジャグ配列になりますね。VLAを使ったときは連続した領域に確保されるのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問