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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

解決済

4回答

4123閲覧

<C++>3次元配列のクラスでの初期化

K_sora

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

0クリップ

投稿2015/06/24 03:49

編集2015/06/24 04:03

現在、専門学校でゲームプログラミングを受講しているものです。

質問があるのですが、3次元配列をクラスのコンストラクタで初期化をしたいのですがやり方がわかりません。1次元配列の場合は、メンバにそれ用の変数を用意して、コンストラクタで配列のポインタを取得して初期化出来るようには作れたのですが、2次元・3次元の初期化の方法がわからないです。

ダブルポインタなどを使うのでしょうか?

回答の程よろしくお願い致します。

追記:
失礼しました。追記で1次元の場合を追記します。
ただ、今作っているゲームから抜粋したいと思います。

ヘッダーファイルにて
class PlayerStatus
{
public:
Anime* jumpAnime;
Anime* runAnime;

// コレが、配列です。 Anime* attackAnime; Anime* stanceAnime; int rengekiMax; PlayerStatus(){} PlayerStatus(Anime* jumpAnime, Anime* runAnime, Anime* attackAnime, Anime* stanceAnime, int rengekiMax) { this->jumpAnime = jumpAnime; this->runAnime = runAnime; this->attackAnime = attackAnime; this->stanceAnime = stanceAnime; this->rengekiMax = rengekiMax; };

};

CPPファイルにて

//----- プレイヤー攻撃初期化。大剣。
A_playerDaiken[0] = Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1);

A_playerDaiken[1] = Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1);

playerStatus[(int)Buki::daiken] = PlayerStatus(&A_playerDaikenJump, &A_playerDaikenRan,/これが配列です/ A_playerDaiken, &A_playerDaikenIki, 2);

ヘッダーにて、ポインタ変数を作ってCPPファイルにて大カッコをとって配列のアドレスを入れました。

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

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

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

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

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

ngyuki

2015/06/24 03:51

その「1次元配列の場合」のコードを質問に書いておくと良いと思います
guest

回答4

0

投稿2015/06/24 04:05

HokutoTokutake

総合スコア26

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

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

0

ベストアンサー

既存の回答でベストアンサーが出ていないってことは・・・
初期済みの3次元テーブルを、クラスのコンストラクタに渡して
メンバ変数として持たせたいってことかな。。。

lang

1static const char* s_aaaTable[2][2][3] { 2 { 3 {"A000", "A001", "A002"}, 4 { "A010", "A011", "A012" } 5 }, { 6 { "A100", "A101", "A102" }, 7 { "A110", "A111", "A112" } 8 }, 9}; 10 11class CKuma { 12public: 13 CKuma(const char*(*p_aaaTable)[2][3]) { 14 m_p_aaaTable = p_aaaTable; 15 } 16 17 void printAll() { 18 int i, j, k; 19 for (i = 0; i < 2; i++) { 20 for (j = 0; j < 2; j++) { 21 for (k = 0; k < 3; k++) { 22 printf("%s\n", m_p_aaaTable[i][j][k]); 23 } 24 } 25 } 26 } 27 28private: 29 const char* (*m_p_aaaTable)[2][3]; 30}; 31 32int main(int argc, char* argv[]) 33{ 34 CKuma kuma(s_aaaTable); 35 kuma.printAll(); 36 37 return 0; 38} 39

投稿2015/06/26 10:50

horohoro

総合スコア490

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

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

0

追記の意図がわかりませんでしたが、
追記にあるAnimeクラスを使った
多次元配列の初期化は以下です。

// 2次元
Anime A_playerDaiken[][2] =
{
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
};
// 3次元
Anime A_playerDaiken[][3][2] =
{
{
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
},
{
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
},
{
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
},
{
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
{ Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki1.png", 10, 1, 7, 1), Anime::SplitAnimePositionX0Y0("grp/DAIKEN/zangeki2.png", 17, 1, 8, 1) },
},
};

投稿2015/06/24 14:46

higetarou

総合スコア57

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

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

0

配列はポインターに置き換えることが可能です。
a[] = *a
a[][] = **a
a[][][] = ***a;
です。

投稿2015/06/24 04:06

MasaakiIrie

総合スコア1021

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

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

lazy_tsan

2015/06/25 22:50 編集

int a[3][4] と定義した場合 a[2][1] にポインタをつかってアクセスするなら *(a+(4*2)+1) となるので a[][] は *a であって **a ではありません。
MasaakiIrie

2015/06/26 03:07

a[2][1]にアクセスする場合は **aもしくは *a[] で可能です。 あくまでもポインターはトップからの考えなので、 a[2][1]へ**aでのアクセスは **a + a[0]の長さ + 1です。 **a = &b[][]で代入ができると思います。
lazy_tsan

2015/06/27 02:53 編集

char a[][3] = {{'1','2','3'},{'4','5','6'}}; char **b = (char **)&a; printf("%c",**b); ってやるとコア吐いて落ちます。 (まぁ**bが何処を指しているか考えれば当然なんですが) そして、 char *b = (char *)a; printf("%c",*(b+4)); とすれば 5が表示されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問