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

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

ただいまの
回答率

90.32%

  • C++

    3777questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 629

MrKametyou

score 7

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


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

こんにちは。

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

#include <iostream>
#include <vector>

  :

std::size_t a, b;
std::cin >> a >> b;
std::vector< std::vector<int> > array(a, std::vector<int>(b, 0));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/16 14:11

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

    キャンセル

-2

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

int func_vla(int a, int b, int arr[a][b]) {
    return arr[1][2];
}

int main(void) {
    int a, b;
    a = 2, b = 3; // ここが std::cin の部分です

    int arr[a][b];
    arr[1][2] = 3;
    printf("%d\n",func_vla(a,b,arr));
}

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

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

int func(int *arr) {
    return arr[5]; // main() でいうところの arr[1][2] にあたる
}
int main(void)
{
    int a, b;
    a = 2, b = 3;

    int arr[a][b];
    arr[1][2] = 3;
    std::cout << func(&arr[0][0]) << std::endl;

    return 0;
}

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/16 07:40

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

    キャンセル

  • 2017/03/16 09:36 編集

    VLAを使わない/使えない場合、動的(実行時)にしか要素数が決まらない二次元配列(風にアクセス可能なオブジェクト)は、事実上ジャグ配列としてしか確保できません。(Zuishinさんコメントの趣旨はこちら?)

    一方、静的(コンパイル時)に要素数が決まる二次元配列型では、配列要素のメモリ配置は連続的なため"ジャグ配列"というのは正確ではないと思います。ただ、この場合でもEkiさん回答のようにあたかも一次元配列のように扱うのは未定義動作を引き起こす(つまりNG)ようです。

    キャンセル

  • 2017/03/16 10:31

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

    キャンセル

同じタグがついた質問を見る

  • C++

    3777questions

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