기본 콘텐츠로 건너뛰기

3월, 2018의 게시물 표시

Part 2: string,sizeof,goto,try-throw-catch...C++ 本を返却する前の細々しいもの整理(C/C++ で働かす Raspberry Pi 3)

C/C++ で働かす Raspberry Pi 3 Part 1:メモリの動的な確保解放, cmath, bitset..C++ 本を返却する前の細々しいもの整理(C/C++ で働かす Raspberry Pi 3) 8.stringストリング、文字列 vectorと似ている、大きく違う部分は文字列の最後にヌル文字(’¥0’)が入ります。 --------------- string str(10,'n');        -> nnnnnnnnnn                                   -> str=string(10,'n'); でも同じ結果です。 str.empty()                  -> 空いたら 1 (true), 空いてなかったら 0 (false) str.size()                      -> 文字数 -> 10                                   -> str.length() も同じ意味です。 --------------- 9.enum列挙型 使用者定義的型、整数とマッチする識別子を指定 --------------- enum games {MineCraft, StarCraft, Tetris}; games g=StarCraft;         ->  gの値は1です。 g=2;                              -> Error                                          -> games g=StarCraft;  は const int g=1;  と同じ意味です。 --------------- 10.sizeof オブジェクトのメモリ占有 ビット数を返します。 --------------- int num=10000; cout << sizeof(num) << endl;    ->  4 --------------- 11.

Part 1:メモリの動的な確保解放, cmath, bitset..C++ 本を返却する前の細々しいもの整理(C/C++ で働かす Raspberry Pi 3)

C/C++ で働かす Raspberry Pi 3 Raspberry Pi(ラズベリーパイ)に興味があって、借りましたが、80%ぐらいがC++の総まとめです。残したい内容を整理します。 1.変数 --------------- int num=100; //copy initialization --------------- を --------------- int num(100);    //direct initialization --------------- にも可能です。 copy initialization,direct initialization は違うことです。。。 Is there a difference in C++ between copy initialization and direct initialization? 初期化してないままで確認してみると違いました。 --------------- int num;    -> 0 (false) int num(); -> 1 (true) --------------- 2.cmathライブラリー --------------- #include <cmath> ... pow(2,3)    -> 2の3乗 -> 8 sqrt(2)      -> 2の平方根   -> 1.41421 M_PI          -> パイ     -> 3.14159 --------------- <cmath> (math.h) 3.ビット演算 --------------- int a=1; int b=a << 2;    -> 2bit 左に移動-> 0001  -> 0100 -> 4 --------------- 4.bitsetライブラリー --------------- #include <bitset> .. bitset<4> a;       -> 4bitの変数を宣言  -> 0000 a.set(2);            

ダイエット(Diet)食堂 ミニアチュア(Miniature) バイキング

以前日常にポスティングしてますが、 餃子の王将や吉野家で美味しくランチを食べた結果6~8kgの体重が増えました。 吉野家 豚丼+豚汁 餃子の王将 極王天津飯+豚キムチ(ジャストサイズ) 餃子の王将、創業50周年お客様感謝キャンペーン第2弾:人生はわかりませ このままではためだと思って3月入ってからダイエット中です。 -------------------- 毎日の摂取カロリーを1500Kcal以下に 夕食以降は食べ物禁止 昼1時間散歩、自転車出退勤(2時間)、その他運動 -------------------- 現在4.5Kgの減量に成功しました。 ダイエットにはカロリーの調節が一番重要と考えています。 一番つらいのは食い意地です。 テレビで美味しい食堂、料理を紹介すると。。。お腹が。。。 それで考えでみました。 ダイエット(Diet)食堂 ミニアチュア(Miniature) バイキング たまには食べなくでは我慢できない料理達をミニアチュアにしたバイキングです。 (実際サイズの1/20ぐらい、800Kcalの料理が40Kcalになります。) -------------------- ピザ(266Kcal) 牛丼(660Kcal) ラーメン(430Kcal) -------------------- を全部食べでも70Kcalぐらいになります。 実際の料理の模様のまま再現するのがポイントです。 巨人になって食事をする雰囲気になればベストかと思います。 ミニアチュアのお弁当を販売してもよいです。 お弁当ケースは開けるとテーブルになれるように制作、テーブルの上に3-4個の料理が並べられるようにしてアフィールします。 1/20のサイズですが値段は1/20よりは高くなるとおもうので 費用を考えても利益は出ると思いました。 ポスティングすると食べたくなりました。。。 다이어트(Diet)식당 미니어쳐(Miniature) 부페(Buffet)

Xcodeのc++プロジェクトでofstreamでファイル作成ができない場合の処理

macOS SieraのXcode 9.2でc++でテキストファイルを生成するプログラムを作成しました。実行するとエラーもなく、問題はなさそうですが実際にファイルが作成されません。 ----------------------- #include <fstream> using namespace std; int main(void) {     ofstream myText("Hello.txt");     myText << "Hello Text!" << endl;     myText.close();     return 0; } ----------------------- プロジェクトのソースファイルと同じパスを予想して確認してますがありません。 ファイルを検索してみても見つかりませんでした。 ----------------------- ofstream myText("Hello.txt"); ----------------------- 部分を ----------------------- ofstream myText("/Users/xxxxxx/Documents/Hello.txt"); ----------------------- の絶対パスにすると作成されました。 現在の作動パスを認識してないようでした。 stackoverflowで解決法を見つけたので整理します。 C++ Program in Xcode not outputting simple text file using outFile XcodeプロジェクトのSchemeで作業ディレクトリの設定が必要でした。 1)実行ボタン(RUN)の右側のプロジェクト名部分をクリック>>Edit Scheme 2)Run>>Options>>Working Directory   Use custom working directoryをチェックしてパス選択、設定 ちゃんと生成されました! Xcode의 c++프로젝트에서 ofstream으로 파일작성이 안

C++ 配列 初期化 std::fill, std::fill_n ..整理

BAEKJOON ONLINE JUDGE を始めたのはC++に慣れるためでした。 今はある程度慣れたんですが意味も分からず、もしくは間違って知って習慣的に使ってるのがありました。配列の初期化もそうでした。 何回も調べた内容なので今回ちゃんと整理してみました。 配列初期化 1次元配列のすべて要素の値を0にしたい場合 1)int arr[5]={}; 2)int arr[5]={0}; 3)int arr[5]={0,}; 一部だけ指定した場合、残りは全部0で初期化されました。 int arr[5]={1,} => 1,0,0,0,0 のこケースでよく間違いました。 1次元配列のすべで要素の値を1にしたい場合 1)各要素の値を直接指定 int arr[5]={1,1,1,1,1} これは。。。要素の数が少ないケースに当たります。 2)std::fill_n利用 int arr[5]; fill_n(arr,5,1); 宣言と当時の初期化ではありませんが int arr[5];fill_n(arr,5,1); ように1列でも良いかと思いました。 fill_n(変更する要素範囲の開始アドレス、変更する要素個数、変更値) 配列全体を変更:配列名=配列のアドレス(arr) => fill_n(arr,5,1); 配列の2番目要素から変更:arr+1                    => fill_n(arr+1,4,1); 3)std::fill利用 int arr[5]; fill(arr,arr+5,1); fill_n( 変更する要素範囲の開始アドレス、 変更する要素範囲の終了アドレス、 変更値) 変更する要素範囲の終了アドレスが少し曖昧でした。 配列の2番目の要素から4番目の要素までの変更は arr+1, arr+3 と思いましたが => arr[1], arr[2] だけ変わりました。 arr+1, arr+4 にするとちゃんと => arr[1], arr[2], arr[3] が変わりました。 [arr[0]] [arr[1]] [arr[2]] [arr[3]] [arr[4]] arr[4]のアドレス前までの意味ようです。 2次元配列

Unity(ユニティ)整理:03.本を返却する前の細々しいもの整理

本を返却する前に細々しいが有用なものを整理します。 Unityではじめるおもしろプログラミング入門 小学生も理解できるぐらいの本で、Unity(ユニティ)の重要ポイントと連携してプログラミングをよく説明しました。Unity(ユニティ)の理解に大変助かりました。 1.スクリプト 動作のさまざまな情報確認 スクリプトの動作部分で確認したい情報がある場合 print(Vector3.up * Time.deltaTime *100); のようにprint()関数を利用するとUnity(ユニティ)のConsoleから確認可能になります。 「追加」 Debug.Log()でも同じ処理が可能です。 2.開発画面と再生画面と一致させる Main Cameraを選択後 GameObject>>Align With Viewをクリックすると開発画面をそのままカメラ視点に調整します。 3.Can't add script component... because the script class cannot be found.. Scriptファイル名とScript内のClass名が一致してない場合のエラーなのでどちらかを修正します。 AAA.cs .. public class BBB.cs : MonoBehaviour { .. AAA ->BBB もしくは BBB->AAA 4.OnCollisionEnter() Vs OnTriggerEnter() OnCollisionEnterはColliderたちがお互いに衝突する場合無条件でコールされますが OnTriggerEnterはCollider属性でIs Triggerをチェックした場合のみコールされます。 5.サウンド再生 Assetsにオーディオファイル追加 Script ---------------------- public AudioClip sample;   //publicにして Unity(ユニティ)から設定可能にする AudioSource.PlayClipAtPoint(sample,transform.position); //AudioClipとサウンドを再生する位置を設定する -----

Unity(ユニティ)整理:02.ジャンプ

移動で作成してスクリプトにジャンプ機能を具現してみました。 Unity(ユニティ)整理:01.移動 ジャンプも基本的には移動と同じと思いました。 GameObjectにRigidbodyコンポネントを追加して重力を適用してから移動で利用して方式を応用しました。 1.Transform.Translate利用 -------------- if (Input.GetKey(KeyCode.Space)) {        transform.Translate(Vector3.up * Time.deltaTime *100 ); } 重力が強いなのか100ぐらいを乗じたらジャンプに見えました。 Positionを直接移動させたので不自然なジャンプです。 -------------- 2.RigidBody.Velocity利用 -------------- private Rigidbody rb; void Start () {         rb = GetComponent<Rigidbody>(); } if (Input.GetKey(KeyCode.Space)) {         rb.velocity = new Vector3(0, 5, 0); } 5ぐらいの設定でずいぶん良いジャンプです。 -------------- 3.RigidBody.AddForce利用 -------------- private Rigidbody rb; void Start () {         rb = GetComponent<Rigidbody>(); } if (Input.GetKey(KeyCode.Space)) {         rb.AddForce = new Vector3(0, 100, 0); } 100ぐらいの設定でずいぶん良いジャンプです。 -------------- 問題がありました。 スペースキーをずっと押していると無限ジャンプになります。 Plainに触れている状態のみジャンプが可能にしてみました。 -------------- private bool isJumping=false;  //ジャ

Unity(ユニティ)整理:01.移動

SFMLでゲームを作りたかったんですが ゲーム開発の初心者には簡単ではなかったので Unity(ユニティ)にしばらく目を向きました。 何回も探している内容は整理して置くことにしました。 基本設定 ======= GameObject >>3D Object >>Plane GameObject >>3D Object >>Cube Cubeが基本的にPlaneに半分埋められているので Scale(Y:高さ)1の半分の値をPosition(Y:位置上下)0.5に設定してPlaneの上にちょうど置かれようにしました。 カメラで見える画面を調整します。 Main Cameraを選択した状態で GameObject >>Align With Viewを選択すると現在Sceneに表示されているのがカメラの視点に設定されます。 Assets>>Create>>Meterial 作られたMeterialを選択、Inspector:Main Maps:Albedoで色を変更後CubeへドラックアンドドロップしてCubeの色を変更しました。 Assets>>Create>>C# Script スクリプトを1つ作成、Cubeへドラックアンドドロップして連結しました。 ======= 移動処理 ======= 1.Transform.Translate利用 GameObjectのTransform(Position,Rotate,Scale)のPositionを直接Translateメソッドを利用して移動させる方法です。 Transform.Translate -------------- void Update () {         if (Input.GetKey(KeyCode.W))         {             transform.Translate(Vector3.forward * Time.deltaTime);         }         if (Input.GetKey(KeyCode.S))         {             transform.Translate(Vector3.back * Time.deltaTime);         }    

C++ cout,cinを早くする

BAEKJOON ONLINE JUDGE をコツコツとやっています。 今年はついにランキング1000位以内に進入でき、意欲ももっと上がりましたが 簡単な問題は会えなくなり毎日1問題の目標ももっと難しくなっています。 問題の難易度=処理速度のケースが多く、c++のcout,cinの代わりにcのprintf,scanfを使ったパスしたんですが良い方法がありました。 1.ios::sync_with_stdio(false); そして改行をendlではなく'\n'で処理 基本的にc++のiostreamとcのstdioの二つのバッファーを同期化処理してそこで遅延が発生するので同期化処理をしないように設定してパフォーマンスが上がることです。 ------------------------------------ //default  for (int i = 0; i < 10; i++) {     cout << '1';     printf("2"); } >> 12121212121212121212 // ios::sync_with_stdio(false); ios::sync_with_stdio(false); for (int i = 0; i < 10; i++) {     cout << '1';     printf("2"); } >> 22222222221111111111 ------------------------------------ 2.cin.tie(NULL) cout cin cout .. 基本的に最初のcoutが出力されてcinの入力、そして2番目のcoutが出力されるのをcout.flush()もしくはバッファーがいっぱいになったのみ出力されるように変更するとパフォーマンスがあがることです。 ---------- //Default #include <iostream> using namespace std; int main(void) { int n;