10桁以上の整数の計算
2005-12-15-1 / カテゴリ: [programming][c] / [permlink]

long long int
でGO

unsigned long long int foobar;
:
:
printf("foobar: %llu\n", foobar);

long 1個じゃ足りない。

VC++6.0 定義位置と参照位置のキーバインド
2005-12-14-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

定義位置: カーソルを合わせて [F12]
参照位置: カーソルを合わせて Shift - [F12]
次の参照位置: Ctrl - NUM+
前の参照位置: Ctrl - NUM-
一つ前に見た箇所への戻るは[2005-12-03-1]

しっかし、なんで数字キーONLYなんだ… 使いにくいよ…

ユーザ定義キーワード(VC6.0)
2005-12-12-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

ユーザー定義キーワードに色を付ける−VC++−水無瀬の部屋
実行ファイル msdev.exe のあるフォルダにキーワード定義ファイル usertype.dat を置くことで指定の字句に色を付けて表示させることができる。
某 SDK の API リストをリファレンスから抜き出して C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\usertype.dat に1行1ワードでおいておけば色が変わった。

VisualStudio 2003 .Net だと、C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\usertype.dat
Referrer (Inside): [2008-02-27-1]

UML の作成ツール
2005-12-09-3 / カテゴリ: [win][programming][アプリ] / [permlink]

Java で動作
UML Modeling Tool
PC の jre が 1.4 以上詳しいバージョンがわからんかったので、とりあえず jre を消して、フルセットでいれてみた。
意外とサクサク動くんだな。

それ以前に、クラス設計なんてできんわけだが...

C++ 基礎の超基礎の最初の方の初歩
2005-12-09-2 / カテゴリ: [programming][c] / [permlink]

間違いあるかも.

Foo::bar;
Foo クラスの bar インスタンス変数
Foo::Baz();
Foo クラスの Baz() メソッド (引数なしの場合の括弧忘れに注意->非OOPなPerl使い)

class Foo {
:
  Foo();
:
};
クラス名と同じメソッドはコンストラクタ
class Foo {
:
  ~Foo();
:
};
チルダが付くとデストラクタ

class Foo {
:
  char Baz();
  int Baz(int x);
:
};
メソッドのオーバーロードは、同じメソッド名で戻り値の型・引数の型・引数の数のどれかが異なること。

(C++)メンバ関数のポインタでエラー
2005-12-08-2 / カテゴリ: [programming][c] / [permlink]

Visual C++にて
class Hoge {
:
  int foobar();
:
};
なメンバ関数に対し、クラス内の別メソッドで
*func = &this->foobar;
とすると
error C2276: '&' : 仮想関数のアドレスを取ろうとしました。
となってしまう。

このあたりによると、
staticメンバ関数か(C-likeな)グローバル関数でないと駄目です。
理由は、「関数のアドレスが決定できない」です。
なんだって。

オブジェクトが生成されるまでメンバ関数はメモリ上のどこにあるかわからない(というかない?)ってことかな。

とりあえずクラスの定義で
class Hoge {
:
  static int foobar();
:
とすれば OK になった。
実際の関数の定義は
int Hoge::foobar() {
:
:
}
で、static は要らない。(というか、つけるとエラーになる)

構造体のパディングをつめる
2005-12-08-1 / カテゴリ: [programming][c] / [permlink]

「pack プラグマ」を使う

[2005-12-04-1]の続き
struct fromdata {
  unsigned char first;
  unsigned char second;
  unsigned char third;
};

#pragma pack(push, 1)
struct todata {
  unsigned first: 6;
  unsigned second: 6;
  unsigned third: 6;
  unsigned forth: 6;
};
#pragma pack(pop)
(以下略)
これで結果が
from: 3
to: 3
になった。

#pragma pack(n)
これで、それ以降の構造体・共用体のパディングに適用される
#pragma pack(push, n)
#pragma pack(pop)
(push,n)で、以降の構造体・共用体のパディングを n を基準にし、(pop)で元にもどす

テストコード書いてみたが、エンディアン関係??でサクっとは base64 変換できねぇ...(@Intel pentium M)

構造体でビットフィールド
2005-12-04-1 / カテゴリ: [programming][c] / [permlink]

独習Cにも載ってたけど気づかなかった。
構造体のメンバにchar(1バイト)以下の単位で、ビット単位のメンバを持たせることができる。
struct foo {
  int a: 1;    // 1ビットの領域
  int b: 3;    // 3ビットの領域
  int c: 2;    // 2ビットの領域
};
true/false の2値しか必要ないとかに使える。

このビットフィールドと共用体を併用すれば、ビット演算使わずに base64 エンコード/デコードできるかなーと思ったけど、sizeof(struct foo) は 4. パディングはしっかり入ってるのね...

struct fromdata {
  unsigned char first;
  unsigned char second;
  unsigned char third;
};

struct todata {
  unsigned first: 6;
  unsigned second: 6;
  unsigned third: 6;
  unsigned forth: 6;
};

union base64 {
  struct fromdata from;
  struct todata to;
};

int main() {
  printf("from: %d\n", sizeof(struct fromdata));
  printf("to: %d\n", sizeof(struct todata));
  return 0;
}
結果は
from: 3
to: 4
うーん
Referrer (Inside): [2005-12-08-1]

VC6.0 で定義位置にジャンプした後、ジャンプ元に戻る
2005-12-03-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

Ctrl-NUM*
Shift-: じゃなくてテンキーの '*' な
Referrer (Inside): [2005-12-14-1]

VC6.0 でブレークポイントの一括解除
2005-12-01-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

Ctrl-Shift-F9
プロジェクト内の複数ファイルを一括、かな。

VC6.0 で対応する括弧へジャンプする
2005-11-30-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

括弧にカーソルにあわせ、
Ctrl-E
もしくは
Ctrl-]
で。
Shift を同時に押下すればブロックが選択状態になるのでさらに見やすいかも。
Referrer (Inside): [2007-03-05-1]

dsw ファイルから起動した時、プロジェクト毎に Visual C++ を起動する(VC6.0)
2005-11-18-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

標準状態だと、dsw ファイル(プロジェクト ワークスペース)をダブルクリックした時は、Visual C++ が起動してなければ新規に起動し、すでに起動していれば(で、他のプロジェクトを開いていればそれを閉じて)起動中の Visual C++ で開かれる。
で、個人的には複数のプロジェクトを開いていてほしーんだけど。

調べたらいくらでもヒットしたんで、簡単に。
フォルダオプションのファイルの種類で、dsw ファイルの詳細設定の[MSDEVで開く(O)]を編集し、[DDEを使う(U)]のチェックをはずす。
で dsw ファイルをダブルクリックすれば、ファイル(プロジェクト)毎に Visual C++ が起動する。

可変長引数
2005-11-04-2 / カテゴリ: [programming][c] / [permlink]

めも

各変数を自前で取り出して使う場合
#include <stdarg.h>
/* 引数を全部足して返す */
int sumall(int n, ...) {
  va_list ap;
  int total = n;
  int n_tmp = 0;

  va_start(ap, n);   /* 最後の固定変数を指定し,最初の可変長引数をセットする */
  while ((n_tmp = va_arg(ap, int)) != 0) {
    total += n_tmp;  /* 型を指定することで引数を一つ取り出す.
                        ap には次の引数がセット */
  }
  va_end(ap);        /* 後始末 */

  return total;
}
というわけで,va_xxx には「引数の最後」が何かを知る術はないようなので,固定引数部分に引数の個数を入れるか,番兵を使うかするっぽい.(上のコードは 0 があったら終了する)
また,型情報が必要なので,複数の型を扱うときは工夫が必要.

printf(3) 関係のラッパ
#include <stdarg.h>
void error(char *fmt, ...) {
  va_list ap;

  fprintf(stderr, "%s", "Error! ");
  va_start(ap, fmt);
  vfprintf(stderr, fmt, ap);
  va_end(ap);
  exit(1);
}
vprintf(3) や vfprintf(3) には,ap を渡せば期待する動作になるかと.

printfのフォーマットで桁数を変数指定
2005-11-04-1 / カテゴリ: [programming][perl][c] / [permlink]

 * を使う

printf("%*d", width, val);
で,width で桁数を指定できる.
width を負の数にすれば,左寄せも可.

Perl でもまったくおんなじ
printf("%0*d\n", $width, $val);
こっちはゼロ詰指定

static 変数 static 関数
2005-11-03-2 / カテゴリ: [programming][c] / [permlink]

2種類あるのが紛らわしいのでメモ

(1) 外部変数・関数の static
static 関数および,static な外部変数(グローバル変数)は,「スコープはファイル」になって,ほかのファイルからは参照できなくする.

(2) 内部変数の static
関数内の内部変数に static がつくと,スコープは変化なく,「寿命がプログラム終了まで」になり,関数(ブロック)終了後も生き残る.よくある例は再帰処理内や関数呼出回数のカウント.

static 関数は,すべて(1)だぞ,と.
(1) については,Perl の my と同じだぞ,と.
Referrer (Inside): [2005-11-24-1]

memcpy memset
2005-09-23-2 / カテゴリ: [programming][c] / [permlink]

備忘録
void* memcpy(void *dest, const void *src, size_t count);

src が指してるアドレスから count バイト分を dest へコピーする。
void* memset(void *dest, int c, size_t count);

dest が指してるアドレスから count バイト分を c で埋める。

いつのまにかゴッチャになってて、
memset(p_data, 0, n_datasize);
とすべきところを
memcpy(p_data, 0, n_datasize);
と何箇所も記述していた…
しかも win 上だとエラーになるが、実際に動作させるデバイスではエラーにならんかったので気づかなかった。

メモリのポインタを受け渡しする関数の設計
2005-09-23-1 / カテゴリ: [programming][c] / [permlink]

C言語でポインタを引数に関数を呼び出し、関数での処理結果をそのポインタにセットしてもらうような場合(特に文字列)、

(1) 呼び出し元で初期化して(\0詰等)関数をよびだす
(2) 関数内で初期化して(\0詰め等)処理する



(1) 呼び出し時に有効なメモリのサイズも渡す
(2) サイズは固定で関数内で注意する

あたりに気をつける。
というか、共通の設計思想でコーディングする。

汎用的という点では、前者は (1) 後者も (1)
memcpy やら strncpy なんかのように。

と、今日教わった。
今の会社じゃ誰も教えてくれないこと…

POST されるデータサイズの制限
2005-09-21-1 / カテゴリ: [programming][CGI][perl] / [permlink]

CGI.pm では、$CGI::POST_MAX に値(byte単位)を設定することで、そのサイズを超えた POST データのハンドリングができる。
$CGI::POST_MAX = 1024 * 1024 * 5; # 5MB
$obj_cgi = new CGI;
:
CGI を new するより前にセットしないと無効。

指定サイズを超えるデータが POST された場合は、cgi_error() にエラーメッセージがセットされるので、
if ($msg = $obj_cgi->cgi_error) {
	print "Error: ", $msg, "\n";
	exit;
}
みたいなかんじで。

先頭の1文字を消す
2005-09-14-2 / カテゴリ: [programming][c] / [permlink]

memmove を使う
char string[] = "foobarbaz";
memmove(string, string + 1, strlen(string));
これで、[string + 1] から [strlen(string)] バイト分を [string] へコピーする。
つまり、"oobarbaz[NULL]" を f のところへコピーする。
memcpy と異なり、第一引数と第二引数が重なっていても正しく動く。

末尾を消すなら、消したいところで '\0' をいれればいい。

int の 0-9 を char の '0'-'9' に
2005-09-09-1 / カテゴリ: [programming][c] / [permlink]

ch_number = int_number + '0';
int_number が 10以上の場合は、もちろんズレる:p
9(57/0x39)以降は、':', ';', '<', '=', '>', '?', ... と特に脈略はない(ように見える)

逆変換は '0' を引く。もしくは atoi で。
カテゴリ: programming / 前ページ 1 2 3 4 5 6 7 次ページ

最終更新時間: 2013-05-02 16:12