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

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

ただいまの
回答率

90.34%

動的配列の宣言について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,176

ThomasYhub

score 10

前提・実現したいこと

関数を利用して動的に宣言したグローバル変数(?)を配列の要素数として配列を宣言し、関数に渡したい。

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

二次元以上の配列だとうまく機能していないことが明らかになる。

No matching function for call to 'test2'
No matching function for call to 'test4'

これをコンパイルしようとしてみると

Candidate function not viable:no known conversion from 'char[Num][Num]'to 'char(*)[Num]'for 1st argument
Candidate function not viable:no known conversion from 'char[dNum][dNum]'to 'char(*)[dNum]'for 1st argument

このようなエラーを吐きます。

ソースコード

#include <iostream>
using namespace std;
const int N=7;
int fact(int n)
{
    int all_hs=1;
    for(int i=1;i<=n;i++){
        all_hs=all_hs*i;
    }
    return all_hs;
}
const int Num=fact(N-3);//4*3*2*1=24;
#define dNum fact(N-3)//4*3*2*1=24;

void test1(char t[Num]){}
void test2(char t[][Num]){}
void test3(char t[24][24]){}
void test4(char t[dNum][dNum]){}
int main() {
    char t_1[Num];
    char t_2[Num][Num];
    char t_3[24][24];
    char t_4[dNum][dNum];
    test1(t_1);
    test2(t_2);//No matching function for call to 'test2'
    test3(t_3);
    test4(t_4);//No matching function for call to 'test4'
}

補足情報(言語/FW/ツール等のバージョンなど)

コンパイラ(?)厳密には違うらしいんですが・・・
XcodeにプリインストールされていたGCCの一種だと思うのですがApple LLVM7.0です。
なんとなく計算されるタイミングとかが関係あるのかなと思うんですが、理解が甘く良くわかっておりません。
正確な理解と、具体的な解決策が見つかったらと思っています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

こんにちは。

関数fact()は通常の関数ですので、Num、および、dNumは実行時にしか決まりません。
しかし、C++は配列の要素数はコンパイル時にきまっている必要が有ります。
ですので、コンパイルエラーがでます。

さて、C++11規格でこのような時にたいへんありがたいconstexprが追加され、C++14で使える範囲が広がっています。これを関数につけると、コンパイル時に計算してくれるのです。
もちろん、引数等全ての必要データがコンパイル時に決まっている必要がありますが、今回の引数N-3はコンパイル時に決まっているので、C++14であればconstexprをつけるだけでビルドできます。

constexpr int fact(int n)

取り敢えずfact()関数にconstexprを付けてみると良いと思います。
エラーがでるようでしたら、コンパイル・オプションに-std=C++14を追加すればいける可能性があります。
手元のMinGW(gcc)5.2.0ではできました。ただ、4.9.1ではだめだったので、バージョンによると思います。
LLVM/clangはgccよりC++14対応が進んでいると聞きますので、Apple LLVM7.0LLVM 3.7.0に近いバージョンでしたら恐らく大丈夫です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/24 20:20

    的確な回答ありがとうございました。
    新たな世界が開けました

    キャンセル

  • 2015/12/24 22:33

    あっと、補足です。
    constexprを付けた関数は上記以外にも色々制約があります。詳しくは検索すると多数でてきます。

    キャンセル

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

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

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