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

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

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

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

Q&A

解決済

3回答

18568閲覧

配列の宣言に変数を使いたいのですが、エラーが出ます。

seri

総合スコア422

C++

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

0グッド

0クリップ

投稿2017/01/04 10:36

編集2017/01/04 10:46

C++

1function(int x){ 2int y[x]; 3}

関数を呼び出す際、引数に入れた値を使って関数内で使う配列の数を定義したいのですが、コンパイルエラーとなります。。

環境はOpenFrameWorksです

ofVec3fとゆうVector3型の配列を取得したいのですが、わかりにくいと思いint[]にしております。

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

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

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

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

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

ozwk

2017/01/04 10:42

こちらの環境ではエラーにならないので環境をお願いします。
A.Ichi

2017/01/04 11:09

void function(int x){  戻り値の設定が必要では?
guest

回答3

0

こんにちは。

その使い方は可変長配列(VLA)ですね。
gccはサポートしていますが、Visual C++はVLAをサポートしていません。
Visual C++でしたらstd::vector<>を使うのが良いと思います。

投稿2017/01/04 12:10

Chironian

総合スコア23272

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

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

0

エラーが出た際はエラーメッセージも記述するようにしてください。

関数の戻り値の型を書いていないからエラーが出ている気がします。

投稿2017/01/04 10:44

carimatics

総合スコア740

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

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

0

ベストアンサー

まず、c++では戻り値を書かないといけないので、

c++

1int function(int x){ 2 //do something 3} 4```のようにしてください。 5 6本題ですが、配列の定義のときは要素数が実行前にわからないといけないので、"int x"のような普通の変数だと、普通の配列の要素数を決定できません。 7そこで、実行時にしかわからない数を要素数にするのには全く別の方法をつかいます。思いつく例を挙げると、 8```c++ 9#include<memory>//std::unique_ptrに必要です 10#include<vector>//std::vectorに必要です 11 12int function(int x){ 13 int *y_malloc = (int*)(malloc(sizeof(int) * x));//C言語の時代に使われたもので、malloc関数は引数の値だけ領域を確保します。intのバイト数と合わせるためにsizeof(int)をかけています。 14 int *y_new = new int[x];//newというのはc++にできた構文で、上のmallocに置き換えるとわかるとおもいます。 15 std::unique_ptr<int> y_smart(new int[x]);//上のnewを、delete(下記参照)しなくてもいいようにしたものです。このように、deleteする手間を省いてくれるのをスマートポインタと呼び、他にも数種類あります。 16 std::vector<int> y_vector(x);//自動でdeleteしてくれる上に、後から簡単に容量を変えたりできます。 17 //do something 18 free(y_malloc);//mallocで確保した領域は、free関数で開放しなければなりません。 19 y_malloc = nullptr;//なくてもいいです 20 delete[]y_new;//newで確保した領域は、deleteしなくてはなりません。(配列の場合はdelete[]) 21 y_new = nullptr;//なくてもいいです 22}

ざっと挙げてみましたが、基本はvectorで問題ないと思います。しかし、他の方法もc++にはなくてはならないので、是非調べてみてください。

投稿2017/01/05 16:57

編集2017/01/10 10:04
_pumpkin

総合スコア30

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問