===== いろんな型の動的配列を使った例をただ書き連ねるよ ===== === 整数の配列 === まずはやっぱり整数\\ \#include文とかusing文とかは省略するので、空気を読んでください! \\ new/deleteは使い方覚えていますか?\\ [[game-engineer:classes:2022:game-programing-1:second-term:11:11-02-2|動的メモリの確保の資料(リンク)]] int main() { //後でやりますが、データの並びをデータファイルに書いておいて、動的に作った配列に //読み込んだりして、初期データを初期化したりします。 const int initList[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //色々な型の配列を使ってみます。 //まずは整数 int *mDay = new int[12]; //動的に配列を作ると、初期化子を並べて初期化はできません。(残念) for(int i=0;i<12;i++) { mDay[i] = initList[i];//初期化用データから初期値をコピー } int mon; cout << "整数を入力してください(1~12) >> "; cin >> mon; if(mon >= 1 && mon <=12){ cout << mon << "月は" << mDay[mon-1] << "日あります" << endl; }else { cout << "入力エラー:プログラムを終了します。" << endl; } //必ず後片付けをする delete [] mDay; } とか書きましたが、C++20と言うバージョンを使える環境ではなんと。。。\\ こんな書き方ができます。C++怖い。。。\\ //動的配列と初期化リスト int *mDay = new int[12] { 31,28,31,30,31,30,31,31,30,31,30,31 }; === 浮動小数点数の配列 === 次はdouble/floatの例です。\\ directxではfloatが標準になっていますが、通常の数値計算の世界では、\\ メモリの転送やCPUのレジスタ性能などを考慮すると、速度差はないのでdoubleが標準の型です。(実際コンパイラ内部ではfloat,doubleを区別しません)\\ DirectXの世界ではGPUとの絡みやSSE/SIMDと言うCPUの機能により、floatの方が最適化されやすいとされています。\\ int main() { int element_num; //データ数 double *decimals = nullptr; //間違ってもNULLなんか使うなよ! double sum = 0.0, average = 0.0; //合計と平均値 cout << "input the number of data >> ";//プロンプトの表示 cin >> element_num; decimals = new double[element_num]; for(int i=0;i> "; cin >> decimals[i]; } for(int i=0;i === 文字型の動的配列 === 文字列じゃなく、ただの?charの配列を動的にとる例です。\\ C型の文字列は、授業で教えた通り、文字配列+'\0'(終端文字)で表します。\\ (これは、そういうデータ型があるわけじゃなく、便宜上こうやって表してるよ\\ という事なのでC言語に文字列型があるよって事ではないです。厳密にはC++にもないんだけどね)\\ C++では、文字列は''std::string''型を使った方が、すっきりするし分かりやすいし、C++っぽいです。\\ int main(){ //文字の配列 //これはもうintの時と同じになります。 //配列数を標準入力から読み込むようにだけ変更してみます。 int dataCount; //データ数 char *cArray = nullptr; //だからNULLは使うなよ! cout << "データ数を入力してください。: "; cin >> dataCount; //本当は>0かどうかチェックしないとだめよ cArray = new char[dataCount]; for(int i=0;i> cArray[i]; } for(int i=0;i === 文字配列+'\0'を使ったC言語型文字列の使い方 === 文字列リテラル("abc"みたいに""で囲まれた文字列)は、そもそもデータとして使うときは'''const char[]'''または、'''const char*'''として扱われます。\\ つまり、変数と言うよりは定数です。\\ なので、C言語型の文字列を動的に取得して云々、と言う機会はそんなには訪れないと思いますので少々特殊なサンプルなのかもしれません。\\ **しかも、文字列の長さを標準入力から取得して、文字配列を作るところまではいいけど、その配列に文字列を入れるときに、配列の要素数をオーバーした文字列が入力される恐れがあり、そのチェックもやりようがありません。とても危険なプログラムですので、絶対にこのような書き方は避けること!** int main() { int strLength; //文字列の最大の長さ cout << "文字列の長さを指定してください(最大長):"; cin >> strLength; //strLengthが文字列長だとすると、'\0'分1個増やさなければだめよね。 char *dataString = new char[strLength+1]; cout << strLength << "文字以内の文字列を入力してください。\n>>"; //本当はここで、0<= dataStringの長さ<=strLengthになっているか確認が必要 //だけど、このやり方じゃどうにもならないよね(注意:危険なプログラムです) cin >> dataString; cout << "入力された文字列は" << dataString <<"です。" << endl; } === C++文字列(string型)の動的配列 === string型が文字配列+\0'と同じだと思うと、配列が配列になっている構造です。\\ 2次元配列上に文字列が並んでいると思うと理解が早いかもしれないです。\\
{{:game-engineer:classes:2022:game-programing-1:second-term:01:2darray.png?400|}} 文字列の配列の内部イメージ
#include #include using std::cout; using std::cin; using std::endl; using std::string; #include #include #include using std::cout; using std::cin; using std::endl; using std::string; int main() { int data_num; string *strArray = nullptr; cout << "文字列は何個入力しますか?\n>>"; cin >> data_num; strArray = new string[data_num]; for(int i=0;i> strArray[i]; } for(int i=0;i<5;i++) { cout << "strArray[" << std::setw(2) << i << "] = " << strArray[i] << endl; } } * [[game-engineer:classes:2022:game-programing-1:second-term:01:01-30-xx01|配列補足2へ戻る(リンク)]] * [[game-engineer:classes:2022:game-programing-1:second-term:01:01-30-xx03|配列補足4へ進む(リンク)]]