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

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

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

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

Q&A

2回答

1276閲覧

引数として2次元配列を宣言した関数に、1つの次元のインデックスを固定した3次元配列を実質的な2次元配列として渡したい。

denshiseigyo

総合スコア12

C

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

0グッド

0クリップ

投稿2019/07/19 04:00

前提・実現したいこと

タイトルに書いたことを抽象的に書くと、「引数としてn次元配列を宣言した関数に、m次元分のインデックスを固定したn+m次元配列を実質的なn次元配列として渡したい」です。
それが関数の汎用性につながると考えたからです。

発生している問題・エラーメッセージ

エラーメッセージ
error C2059: 構文エラー: ']'

### 該当のソースコード #include "pch.h" #include <stdio.h> void answer(double matrix[3][3]) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%lf",matrix[i][j]); } printf("\n"); } } int main() { static double m[2][3][3] = { {{1,2,3},{4,5,6},{7,8,9}},{{10,11,12},{13,14,15},{16,17,18}} }; answer(m[1][][]); } ```ここに言語名を入力 C言語 ソースコード ` ### 試したこと 上記のソースコードを使えば{{10,11,12},{13,14,15},{16,17,18}}が関数answerで出力されてほしかったのですが無理でした。メイン関数で一度2次元配列を用意して以下のようにしてから配列tmpを渡すしかないのでしょうか。代入に時間がかかりそうなのでできればやりたくないので他にいい方法があれば知りたいです。 for (int i = 0; i < 3; i++) {      for (int j = 0; j < 3; j++) { tmp[i][j]=m[1][i][j]; } } ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

上記のソースコードを使えば{{10,11,12},{13,14,15},{16,17,18}}が関数answerで出力されてほしかったのですが無理でした。

引数に渡すものをm[1]とすれば問題なく動きました(paiza.ioでの動作確認)。

投稿2019/07/19 04:17

maisumakun

総合スコア145184

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

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

denshiseigyo

2019/07/19 05:32

ありがとうございます!できました! ただ一つ気になるのは、左側から連続していくつかしか固定できない感じでしょうか。 つまり、配列 a[i][j][k][m] があった場合に、インデックスの固定の仕方は以下の4通りしかなくて [i]を固定して[j][k][m]からなる疑似的な3次元配列として使う [i][j]を固定して[k][m]からなる疑似的な2次元配列として使う [i][j][k]を固定して[m]からなる疑似的な1次元配列として使う [i][j][k][m]を固定して疑似的な1変数として使う [i]と[k]のインデックスだけを固定するというようなやり方はできないのでしょうか?
maisumakun

2019/07/19 06:46 編集

> [i]と[k]のインデックスだけを固定するというようなやり方はできないのでしょうか? はい。C言語の多次元配列は「a[0]の直後にa[1]が入っている」というようなメモリ配置となっていますので、その一部だけ取り出すようなa[0]やa[0][1]は連続したメモリですが、「0次元目と2次元めだけ取る」ようなものはメモリ上で飛び飛びとなりますので、通常の配列として扱うことはできません。
denshiseigyo

2019/07/22 05:11

回答ありがとうざいます。 おかげさまで現状したいことをする上では問題なさそうです。 多次元配列がメモリ上にどう配置されているのかや、ポインタとの関係性を知る必要がありそうです。
guest

0

Cの配列について、いくつかのお約束があります。

1.「配列」を関数に引数として渡すことは出来ず、配列の先頭要素へのポインタだけを渡して*(p+n)p[n]が等価であるというお約束のもと、順次配列の要素にアクセスできる、という原理で配列を扱います。

2.配列が単独で記述されると、その配列の先頭の要素へのポインタとみなされます。

3.多次元配列というのは一つ下の次元の配列の配列、という定義です(擬似的、なんていうことではありません。配列そのものです)。なので、下位の配列が確定していないままで上位の配列というのは定義されません。

m[1][][]というのは、3.に反します。
double m[2][3][3];
ということであれば、m[1]とだけ記述すればこれは2.によって&m[1][0]の意味になり、double[3][3]の配列そのものへのポインタとなります。

投稿2019/07/19 15:44

thkana

総合スコア7639

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問