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

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

ただいまの
回答率

90.40%

  • C

    4806questions

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

  • C++

    4647questions

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

  • 配列

    644questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • 関数

    270questions

    関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

二次元配列のポインタを返すメソッド

受付中

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 3,434

TatenoShunya

score 1

現在C++でMFCプログラミングをしています。
2次元配列のポインタを戻り値とする関数を作成したのですが
プロトタイプ宣言がとても意味不明なことになっています。
おすすめの宣言の仕方があればご教授お願います。

以下ソース一部
static const int HIGH_GRADE_RATE[][2] = {
    {    SC_NLANG,        6    },
    {    SC_SOCIAL,        4    },
    {    SC_MATH,        4    },

}

const int (*CReportChkTblSub::GetOutputRate(void))[2]{
return  &HIGH_GRADE_RATE[0];
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

+5

二次元配列をそのまま返さないとだめなのでしょうか。
GetOutputRateメソッドがどのような使われ方をするのか判らないのですが、こんな感じで作ることは多いです。
const int* CReportChkTblSub::GetOutputRate(int index)
{ 
    return &HIGH_GRADE_RATE[index][0]; 
} 

あるいは、そもそもデータ構造として二次元配列がふさわしいかどうかを考えるべきです。
初期値化を見る限り、SC_NLANG6が同じ種類の値ではないと思います。おそらく、SC_NLANGのときは6というような使われかたをするのだと思いますが、たとえ両者が同じint型でも区別するべきでしょう。
この場合、構造体を使うのが一般的です。例えば、このような感じで構造体を宣言します。
※構造体名・メンバ変数名は適宜変えてください。
struct GradeRate
{
    int    Grade;
    int    Rate;
};
そして、HIGH_GRADE_RATE変数はGradeRate構造体の一次元配列で定義します。
static const GradeRate HIGH_GRADE_RATE[] = {
    {    SC_NLANG,       6    }, 
    {    SC_SOCIAL,      4    }, 
    {    SC_MATH,        4    }, 
};
一次元配列にしてしまえば簡単に記述できます。
const GradeRate* CReportChkTblSub::GetOutputRate()
{
    return  &HIGH_GRADE_RATE[0]; 
} 
最初のコード例にしたがってこういうのも。
const GradeRate& CReportChkTblSub::GetOutputRate(int index)
{
    return  HIGH_GRADE_RATE[index]; 
} 
質問の直接的な回答にはなっていないかもしれませんが、より簡単に実装するにはどのようなデータ構造にするかを考えることも重要なことです。場合によっては専用のクラスを作る必要があるかもしれません。C/C++では多次元配列の扱いが非常にややこしいのです。(STLを覚えればまた違ってきますが。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

返しているのは1次元配列のようですが・・・

int * で返すのじゃだめですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

考え方はint[2]型へのポインタを返却しているのだと理解しました。
下記のような方法があります。
// typedef方式
typedef int    ArrayFix2[2];

const ArrayFix2* GetOutputRate(void)
{
    return  &HIGH_GRADE_RATE[0];
}

// エイリアス・テンプレート方式
template<typename tType, std::size_t tSize>
using Array2D=tType[tSize];

const Array2D<int, 2>* GetOutputRate2(void)
{
    return  &HIGH_GRADE_RATE[0];
}

// 使用例
int main(int argc, char* argv[])
{
    const ArrayFix2*        ArrayPtr = GetOutputRate();
    const Array2D<int, 2>*  ArrayPtr2 = GetOutputRate2();
    return 0;
}

ArrayFix2はC言語でも可能ですが、型と要素数がint, 2固定です。
Array2DはC++11で導入されたエイリアス・テンプレートを使っています。
型と要素数を指定できます。

でも、int[2]へのポインタを返却するより、struct型へのポインタを返却する方がcatsforepawさんの言う通り分かりやすいと思います。

後、std::vector<>について調べるとより幸せになれるかも知れません。

【閑話休題】
const int (*CReportChkTblSub::GetOutputRate(void))[2]
配列を返却する場合、こんなふうに定義すればできるんですね。
記述できないとばかり思ってました。
C/C++の関数と配列のシグニチャ定義には何時も何時も悩みます。なので、auto様さまです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

いやぁ~時間かかりましたよ。
class CReportChkTblSub {
    int abc;
public:
    int const (*GetOutputRate(void))[2];
};

int const (*CReportChkTblSub::GetOutputRate(void))[2]
{
    this->abc = 0;
    return  HIGH_GRADE_RATE;
}
検証ソース
void bbbb()
{
    CReportChkTblSub cc;
    const int ( *a)[2];
    a  = cc.GetOutputRate();
    const int *p0,*p1,*p2;

    p0 = a[0];
    p1 = a[1];
    p2 = a[2];
    printf("%d\n",p1[1]);
    printf("%d\n",p2[0]);
}
お題ありがとうございます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

2次元を一筆書きの1次元ととらえて、intへのポインタ返してもらって、先頭からインクリメントかポインタ直演算じゃだめ?
※リニアアドレスに限る

↑受け側でめんどくさいことしたくない人達に罵倒されるかもな意見w

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • C

    4806questions

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

  • C++

    4647questions

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

  • 配列

    644questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • 関数

    270questions

    関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。