🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

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

Q&A

解決済

5回答

551閲覧

[C++]二次元配列を関数に用いたいが、関数の汎用性を妨げる方法しか浮かばない

kutc_chess

総合スコア13

C++

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

0グッド

0クリップ

投稿2020/01/02 15:31

私は、様々な大きさの二次元配列に”ある処理”を行う関数を作りたいと思い、色々調べたのですが、
結局以下の様な仮引数の時点で、配列ポインタの要素数を与えなければいけない方法しか浮かびませんでした。

C++

1//一部を抜粋してます。 2double hoge(double (*array)[要素数]);

この場合だと要素数を予め関数のコードに書いておかないといけないので、
ある一定の大きさの二次元配列しか受け付けない関数になる。→汎用性が薄い関数になる。

なので、どうにかしてユーザーが二次元配列の大きさを考慮せずとも使える、二次元配列を用いる関数を作れないでしょうか?

回答宜しくお願い致します。

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

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

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

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

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

episteme

2020/01/02 23:00

汎用性を求めるなら要素数(=列数)だけでなく行数も与えなくてはならんのでは? # 正方行列のみを対象とするなら要らんけど
guest

回答5

0

c++

1template<typename TABLE> 2double hoge(TABLE &array, int height, int width){ 3 double total = 0; 4 for (int y = 0; y < height; ++y) 5 for (int x = 0; x < width; ++x) 6 total += array[y][x]; 7 return total; 8} 9 10#include <iostream> 11 12double table[2][3] = {{1,2,3},{4,5,6}}; 13 14int main() { 15 std::cout << hoge(table, 2, 3) << std::endl; 16 return 0; 17}

テンプレートはいかがでしょうか

投稿2020/01/03 00:50

maai

総合スコア463

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

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

0

C(gcc/clang)ならオプション規格の可変長配列(VLA)を使って
double hoge(int N, double (*array)[N]);
として下位配列の要素数を与える手もあるかな、と思ったけどC++なんですね。

ベタに一次元配列にキャストしたポインタと下位配列の要素数を渡して、計算でなんとかするとか。
double hoge(double array, int N);
array[m][n]はarray[m
N+n]

静的にサイズが決まるならテンプレートとか。

ダブルポインタ( double **array)は、二次元のデータ構造を表せる方法の一つではあるけれど、文法的な「二次元配列」とは別物で、メモリー上のデータ配置も違うから余程注意して使わないと。

投稿2020/01/03 01:48

thkana

総合スコア7703

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

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

0

ベストアンサー

double hoge(double **array,size_t 要素数);

でいいんでは

投稿2020/01/02 21:16

y_waiwai

総合スコア88038

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

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

0

C

1double hoge(double* array, size_t width, size_t height) 2{ 3 return array[y * width + x]; 4} 5 6hoge(&array[0][0], 1次元目, 2次元目);

これではダメですか?

投稿2020/01/03 11:48

majiponi

総合スコア1722

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

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

0

テンプレートを用いる方法が考えられます。

cpp

1template<std::size_t y, std::size_t x> 2double hoge(double (&array)[y][x]);

投稿2020/01/03 00:53

SaitoAtsushi

総合スコア5684

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問