スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
line

動的メモリ割り当て

プログラム全文はこちら

今回は動的メモリ割り当てについてのメモ

動的メモリ割り当て = new でメモリ割り当ての事です(またはmalloc or calloc)
逆に静的メモリ割り当ては配列の事です

動的メモリは確保したら必ず解放しなければなりません(そうしないとずっとメモリが確保されたままになるため)

なので先にデメリットを言っておくと解放しなければいけない面倒さや下手するとバグの原因につながる面倒さが一番のつらいところです

が、メリットとしてはどんな長さの配列のように扱うことが可能という点ですかね


今回のプログラムは名前を入力しその長さ分メモリを取得すると言った単純なプログラムです
ここで配列で文字列を持ってきてもいいのですが名前はみなばらばらです
256文字もある名前の方はさすがにいませんが20文字を越える名前の方なら外国にいるかもしれません
それに反してTaroなんて名前の方がいるかもしれません

例として
「ベリー・へリントン」 = 必要なメモリサイズ:19
「タロ」        = 必要なメモリサイズ:5
となります。
(上記の名前は大文字なので2byte * xでタロの場合本来なら4byteですが文字列の末端には必ず\0が入ります
なので必要なメモリサイズは文字列の長さ+1したサイズとなります)


上記の例くらいならまぁ配列でもいいかってことになるかもしれませんがもし250文字以上の名前の方がいあにともかぎりません
しかし6文字程度の名前の人のために256文字格納できる配列を常に持っていたらすごくメモリの無駄だと思います

ということで必要となるのが好きな数のメモリが確保できる動的メモリ割り当ての技術というわけです


何度も言いますが動的メモリ確保したら必ず解放するように
スポンサーサイト
line

多重定義について

main.cpp

define.h

Character.h + .cpp

A.h + .cpp


今回はアルゴリズムではなくチーム制作ではよくある多重定義についてのメモ
ある時チーム制作だけではないんですがヘッダーによく付ける__○○_H__というまぁ重複インクルードを防ぐ処理ですね、あれをやっていたにもかかわらず重複だなんだと怒られました
ぶっちゃけ自分でもよくわかっていなかったので片っ端から当たったところ
ヘッダーでの作業は

× 変数の宣言・定義
× 変数の宣言
× 関数の宣言・定義
〇 関数の定義
〇 マクロの作成
〇 構造体の宣言
〇 クラスの宣言
〇 メンバ(インライン)関数の定義
× メンバ関数の定義
〇 externを使用した変数宣言
〇 staticを使用した変数宣言・定義
〇 staticを使用した変数宣言

というような感じになりました(×が多重定義になる可能性が高い・○が基本引っかからない)と言った感じです


変数は基本的に定義しない方がいいです、グローバルでどこからでも参照できるようにしたい場合はexternを使用すると良いです(externについては後日機会があれば・・・)


関数の宣言だけなら問題ないですが定義をヘッダーに書くとアウトです
クラスのメンバ関数などの定義もだめですが、インライン関数であるならば問題無いようです


クラスの宣言は問題ないです


上記のように重要な点を3つ書きましたが自分も今回テストしてみて色々と知れた気がしました
今まではとりあえずよく見かける#ifndef使っとけば問題ないでしょと思っていたのですが

#ifndefを使った方法は多重インクルードを防ぐものであり、多重定義は防ぐわけではないというものでした

そうですねぇ、今回は絵も描けないので何とも言えませんがこればかりは実際に試してみたほうがいいかもしれませんね

簡単に言うとヘッダーで定義するな!っていうような感じですかねw

今回externを使ったのですがこれも少し考える部分があったので少し研究したいと思います


ちなみに#ifndefを使用した重複インクルードの存在意味がわからない場合、今回のプログラムの__A_H__とかある部分を消してみて実行してみてください
宣言すら行えなくなります、とりあえず意味はわからなくてもこれ付けとけと言っていたある方のおっしゃっていた意味がわかった気がしないでもない。これ付けなきゃ始まらない気がするwww
line

マクロについて

プログラム全文はこちら


忘れることもないだろうかと思いますが一応

よく定数を定義するために使用するdefineですがこれは定数以外にも使い方はあります
まぁ関数を定義しても問題はないんですがね

プログラムで例を出すなら
#define DEF4(x) (sizeof(x) / sizeof((x)[0]))

の部分ですかね。計算式をdefineすることも可能です

自分はどちらかと言うと
#define DEF3() (&data)
DEF3()->name

に驚きました、いや、マクロを知ってる人なら余裕と言うか関数でも同じことは可能なんですがね
たとえば
DATA* func(){return data;}
でも
func()->name
は可能ってことです、ふむ。色々と見直さなければですね!!!
line

パーセントを求める

プログラム全文はこちら


パーセントを求めるプログラム
パーセンテージと言った方がかっこいいかもしれない

プログラムにすることもないくらい単純ですが一応プログラムにしました
とくに例にしやすいRPGでは必須のHPを例えに作りました

重要な部分は

float ans =(float)hp / (float)maxHp;
int perHp= (int)(ans * 100.0f);

の2行ですね

一行にまとめるなら

int perHp= (int)(((float)hp / (float)maxHp) * 100.0f);

こんな感じでしょうか
特にこれと言った説明はいらないでしょうとは思います
100を掛けているのは見やすいように変換しているだけです
答えが小数になるので人が見やすいように変換・・・と言ったところです、はい


これはHPが30%以下の時に~~の処理みたいな場合には使えるかもしれませんね、というか基本的な計算(ry
line

リスト構造(チェーンリスト)(単方向リスト)

プログラム全文はこちら


リスト構造、ある意味必要とされる技術ですねぇ
これはある意味配列なのですが配列より倒くさいです色々と

このリスト構造はチェーンリストとも呼ばれています、鎖でつないでいるようだからだそうです
その理由としては構造体の中にある構造体ポインタが次の構造体を指してその構造体にあるポインタが次の構造体のポインタを指して・・・というような・・・うん、ぶっちゃけ絵を書いた方が早いかもしれない

チェーンリスト1

ということで汚いながらも書きました。上が誰もが知っている配列です、下が今回のリストですね

配列は良く知っての通り綺麗に並んでいるのに対してリスト構造はチェーンのように繋がっています
これは構造体が持っている次の構造体を参照しているポインタ(next)が次の構造体に繋いでいると考えてください


これじゃ配列の方が簡単そうだと思われるかもしれません、というか実際はそうだと思います。わざわざこの技術を使わなくても済むなら使いません(多分)

しかしながらもしデータが10000個くらいあったとしましょう、そのうちの982番目のデータがいらなくなりました
その場合データを詰めなくてはいけません
配列ならば982番目のデータがなくなりそれ以降のデータを一つ前にずらしていく処理を行います
・・・どんだけ時間がかかるのか、なにより無駄に1000以上の入れ替え処理を行わなければなりません

それに比べて今回のチェーンリストならばnextの指しているアドレスを削除予定のnextが指しているアドレスにすればいいだけで済みます

1回ですね、はい


これも絵にかいた方がいいですかね

チェーンリスト2

絵書いてますが普通プログラマって絵は描かないですよ、本当に・・・orz
上の絵の通りですが絵には10000個のデータを書くなんて嫌ですので少なめにしましたが同じようなものです

次の参照先を別のところにするだけでよい、ということです
自分はまだまだ素人なのでまだ使っていませんがどこかで使用する機会があると思います

自分はこれをオンラインゲームのユーザー情報をこのリスト構造で格納していると聞いた事があります、何千何万のデータを格納する時は必須ですね
もちろん10個20個程度なら配列を使ってください、そっちの方が一緒に仕事をする人にも親切かもしれません

おまけですが今回書いたのはチェーンリストの中でも単方向リスト?(名前が微妙に思いだせない)と呼ばれるものです
これ以外に双方向リストとも呼ばれるものがあるのですがそれはまた後日やろうと思います、はい
line
line

FC2Ad

line
プロフィール

否健康食品オワタ

Author:否健康食品オワタ
27.142.178.77 (1)
27.142.178.77 (2)

2714217877.gif

line
最新記事
line
最新コメント
line
最新トラックバック
line
月別アーカイブ
line
カテゴリ
line
検索フォーム
line
RSSリンクの表示
line
リンク
line
ブロとも申請フォーム

この人とブロともになる

line
QRコード
QR
line
sub_line
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。