C言語_オバラのwiki
勘違いや間違い、キティーガイ沙汰な事を書いている可能性(大)
Visual studio 2008の場合
「文字セット」の項目を「マルチ バイト文字セットを使用する」に変更を「すべての構成」に適応させる
「構成」
Release
構成プロパティ → C/C++ → 「コード生成」
のランタイム ライブラリの項目を「マルチスレッド(/MT)」に変更
Debug
ランタイムライブラリの項目を「マルチスレッド デバッグ(/MTd)」に変更
予約語
void 型の無いことを宣言
char 1バイト・文字型
short 2バイト・単精度整数型
int 4バイト・整数型
long 4バイト・整数型
float 4バイト・単精度浮動小数点型
double 8バイト・倍精度浮動小数点型
auto 自動変数、関数を抜けるとデータは消去
static 静的変数、関数を抜けてもデータが残る
const 書き換え不可、宣言時に格納
signed 符号付変数を指定
unsigned 符号なし変数を指定
extern 異なるファイルから使用する際に宣言
volatile コンパイラに最適化させない
register レジスタに割り当て高速化、C++では使用できるが意味が無い
return 関数から抜ける、戻り値を指定できる
goto 指定ラベルへジャンプ
if 条件分岐
else if文の条件分岐
switch 条件分岐
case switchでの条件分岐
default switchでのcaseに当てはまらない条件
break ブロックから抜ける
for ループ文(初期化;終了条件;変数更新)
while ループ文(終了条件)
do do-while文で使用する、処理の開始
continue ループ文の先頭に戻る
typedef 型に別名をつける、意味は変わらず
struct 構造体、変数をまとめて宣言するユーザー定義型
enum 列挙型、整数の割り当て
union 共用体、変数をまとめて宣言できるが、アドレスは共通
sizeof 変数のサイズを取得
bulletの導入
公式から落としてきたbulletのSDKを解凍すると、中にlibというフォルダがあるが中にライブラリファイルは入っていない。
bullet-2.xx → msvc → 2008 (自分の場合) → lib → Debug
となりにreleaseもあるんじゃね(たぶん)
あんまりいじってないから知らん
を指定する
ヘッダーファイルはbullet-2.xx → srcに入っている
構造体に関して
たとえば
typedef struct Hoge
{
int int1; double double1; char char1; double double2;
}Hoge;
があったとして
サイズがいくつになるか
[obara@TandemMirror arainmento]$ ./a.out
24
stHoge 0xbfde0e2c
int1 0xbfde0e2c
double1 0xbfde0e30
char1 0xbfde0e38
double2 0xbfde0e3c
ってな感じになりchar1とdouble2の間に隙間が出来た
これはコンパイラが勝手に境界調整(アラインメント)して適当に詰め物(パディングというらしい)を入れた
CPUによってパディングのやり方が違うらしい
パディングには下手に触ってはいけないらしい
realloc
void realloc(変更したいポインタ,どんくらいヒープするかのサイズ) あんまり頻繁に使わない方がよさげ
頻繁に巨大な領域をreallocで伸ばすと時間もかかりヒープの中につかえない巨大な空き領域がどんどんできてしまうらしい
フラグメンテーション
てきとーにメモリの確保、開放を繰り返すとメモリが分断されていき使用できない細かい空きブロックができる この現象をフラグメンテーションというらしい
(メモリはいっぱいあるぜ 気にするこたぁねぇw)
再定義防止、無駄なプリコンパイルを減らす
ヘッダーに
#ifndef OBARA_H
#define OBARA_H
#endif と最初と最後に書いて置くだけで再定義防止、とビルド時間を短縮できる
ifndef とは逆にifdefというのももある ifndefとは逆で、ifdefは定義されていればendifまでを実行するらしい
なにやらプリコンパイル時に必要のないコードはコンパイルしないようにしているようだから、ifdefとか書いても速度は変わらないらしい
unsignedを使う
まず
#define aFlag (1)
#define bFlag (1 << 2)
#define cFlag (1 << 3)
とフラグをどのように使うかマクロ定義や定数で定義しておくとよい
unsigned Flag = 0;//フラグを記録させる変数
unsignedを付けないと何かで右シフトした時、補数の1がシフトしてくるかもしれない
必要な関数は3つ
セット、リセット、チェック
void set(unsigned f)
{
Flag |= f;
}
void reset(unsigned f)
{
Flag &= ~f;
}
int check(unsigned f)
{
return ((Flag & f) == f)? 1 : 0;
}
メモリの節約、可読性の向上
たとえば
if(check(aFlag|bFlag|cFlag))
{
}else
{
}
構造体
構造体
typedef struct dororo{
int hoge; int tara; int pong;
}
があるとして、
const dororo *a = (dororo*)malloc(sizeof(dororo) * i);
という宣言をしてもメンバに値を代入できる~
dororoはポインタなのでconstがついていたら a=nanntyara みたいにポインタを変更することはできないが、a->hoge=100のような変更はおk
当然ではあるがconstは修飾した変数そのものにだけ有効である
javaの場合
javaの場合も同様~
final hoge[5][5] = {
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5}
};
とあるとするとhogeは変更できないが、hoge[]とhoge[][]は弄る事ができる。
今日からLuaなるスクリプトの勉学に励もうと思いました
LuaさんはC言語に組み込む目的でRoberto IerusalimschyさんとLuiz Henrique de FigueiredoさんとWaldemar CelesさんがC言語に組み込む事を目的としたスクリプトとして開発したっぽい
ガベージコレクションはインクリメンタルGCでライセンスはMITらしい