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

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

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

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

C++

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

Q&A

解決済

1回答

2550閲覧

動的配列の宣言について

ThomasYhub

総合スコア12

C

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

C++

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

1グッド

0クリップ

投稿2015/12/24 06:47

###前提・実現したいこと
関数を利用して動的に宣言したグローバル変数(?)を配列の要素数として配列を宣言し、関数に渡したい。
###発生している問題・エラーメッセージ
二次元以上の配列だとうまく機能していないことが明らかになる。

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

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

###ソースコード

C++

1#include <iostream> 2using namespace std; 3const int N=7; 4int fact(int n) 5{ 6 int all_hs=1; 7 for(int i=1;i<=n;i++){ 8 all_hs=all_hs*i; 9 } 10 return all_hs; 11} 12const int Num=fact(N-3);//4*3*2*1=24; 13#define dNum fact(N-3)//4*3*2*1=24; 14 15void test1(char t[Num]){} 16void test2(char t[][Num]){} 17void test3(char t[24][24]){} 18void test4(char t[dNum][dNum]){} 19int main() { 20 char t_1[Num]; 21 char t_2[Num][Num]; 22 char t_3[24][24]; 23 char t_4[dNum][dNum]; 24 test1(t_1); 25 test2(t_2);//No matching function for call to 'test2' 26 test3(t_3); 27 test4(t_4);//No matching function for call to 'test4' 28} 29

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

maisumakun👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

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

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

C++

1constexpr 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 09:23

Chironian

総合スコア23272

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

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

ThomasYhub

2015/12/24 11:20

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

2015/12/24 13:33

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問