cwnicol programming

プログラミング関連の投稿をすこしだけ

C/C++

c言語 モジュール分割

cのプログラムはファイルを分けてモジュール分割可能。 ヘッダーファイルは設計図で、Cファイルは実装だ。 ヘッダーファイルには他モジュールが知る必要がことだけを書く。 公開関数のプロトタイプと、それの戻り値、引数で関係してくる マクロ、列挙体、構…

オプション処理 カプセル化

先日C言語でカプセル化できることを知ったので、それをオプション処理で応用してみた。(エラー処理は未実装) オプションクラスを使う人は、option.hのインターフェース使用方法を知っていれば、オプションについて詳しく知る必要もない。 option - object or…

C言語で継承(オーバーロード(=多態性)なし)

↑ソース関連図 犬(dog)クラスで動物(Animal)クラスを継承している。 ポイントは以下。 ・サブクラス宣言では一番上のメンバにスーパークラスを宣言する(dog.c, 6行目) ・スーパークラスのヘッダをAnimal.h, AnimalP.hとしてカプセル性を保持する ・スーパー…

C言語でカプセル化

Cでは不完全なカプセル化になる(メンバにアクセスできてしまうという意味で)と思っていたけど、ソース側に構造体を定義すれば完全なカプセル化を実現できる模様 c capcel

空の要素を含むCSVファイルを読み込む

sscanf()とかstrtok()だと空の要素があると、その要素の読み込みが 飛ばされる。 そこで、元データに半角スペースを挿入した上でsscanfして、 データ読み込み後に半角スペースを削除している。 sscanf

qsortで複数キー(複数条件)でソート

qsortで複数キー(複数条件)でソートしたい時があるだろう。 例えば、↑のデータを [ソート条件] ・第1ソートキー:AAA列の昇順 ・第2ソートキー:BBB列の降順 で並び替えたいとしよう。 qsort()では一つのキーしか設定できないと思われがちだが、 qsort()の第4…

関数内で引数の値変更禁止

構造体を関数にポインタ渡し(参照渡し)して、関数内で 構造体の中を変更して欲しくない時は仮引数の型の前に constをつければよい。 ※構造体でなくても、整数等も同様。 #include <stdio.h>#include <stdlib.h> typedef struct _aaa { int a;}aaa; void func_a(const aaa* b) { </stdlib.h></stdio.h>…

10進数を2進数に変換するプログラム

自前で10進数→2進数変換アルゴリズムを実装しなくても、 標準ライブラリのitoa()の第3引数に2を設定すれば、 目標を達成できるのでは。 #include <stdio.h>#include <stdlib.h> int main() { int target = 255; char buf[256] = {0}; itoa(target, buf, 2); printf("%s\n", buf)</stdlib.h></stdio.h>…

ライブラリ

まとめきれていない部分もあるかもしれないが、 とりあえず現時点でライブラリについて分かったことを記す。 名称 動的ライブラリ 静的ライブラリ 方式 レイトバインディング(遅延バインディング、実行時バインディングとも) アーリーバインディング(事前バ…

ポインタ 説明 解説 講座

ポインタ 説明 ざっくりと基本を。 ================◆使用用途====================== 関数内での変数の書き換え。 int main(){ int b; change(○○○); //この中でbの値を書き換えたい return 0; } ================================================ ========…

#includeでcsv読み込み(C, C++)

環境:VSC++ 2008 http://twitter.com/tt_clown/status/22769039758 > C++ と言うか C で今までで一番「ああその発想はなかった」てのは, > int hoge[] = { #include "hoge.csv" }; こんなの見つけたから試してみた。 以下、テストプログラム、データファイ…

2重ループを抜ける

(1)フラグを用いる。 while(XXX){ /* ループ1 */ bool bFlg1 = false; bool bFlg2 = false; while(XXX){ /* ループ2 */ /* hogehoge */ if(ZZZ){ /* ループ1でcontinueしたい現象が ループ2内で発生 */ bFlg1 = true; break; } if(ZZZz){ /* ループ1でbreak…

fopen()のテキストモード、バイナリモード

これらのモード指定はWindowsでfopen()を使用する際に 考慮するものだ。 Linuxでモード指定は必要ない。なぜならばLinuxにおける 「テキストファイルの改行コード」と「プログラム内部の改行コード」が 一致しているからだ。(共に0x0a) OS テキストファイル…

C++ソースから、Cで作成したライブラリをリンクする方法

■概要 何も考えずに下図のような構成にすると、 C++ソース(下図ではA.o)から、Cで作成したライブラリ(下図ではC.o)を リンクできない。 ■原因 関数呼び出し1で、探している名前("関数Z@sjadfpioa"(*1))と 実際の名前("関数Z")が異なるので、関数Zを探し…

C言語 ファイルサイズ(バイト)取得

GetFileSize ■注意点 fpos_t型は、環境により実装が異なるらしいので、 GetFileSize関数でファイルサイズ取得後は、 適宜環境に合わせてposを使用のこと。 ■fell()かfgetpos()のどちらを使用するかについて fell()を使用すると、long型でファイルサイズを取…

c言語 qsort

#include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct{ int i; char str[5]; } hoge; int Comp(const void *, const void *); void print(hoge *); // メイン int main(){ hoge shoge[SIZE] = { {3, "abc"}, {1, "ABC"}, {9, "uyr"}, {2, "4gy"}, {4, "stg"}, </stdlib.h></stdio.h>…

float型をhtonl(), ntohl()

int main(){ int i; char *p; float f = 1; for(i = 0;i < sizeof(float);i++){ p = (char *)&f; printf("%02X ", (char)*(p + i)); } putchar('\n'); f = htonl(f); //f = htonl(*(long *)&f); for(i = 0;i < sizeof(float);i++){ p = (char *)&f; printf("…

リトルエディアン ビッグエディアン 判別プログラム

int main(){ short s; char *cp; s = 1; cp = (char *)&s; if(*cp){ printf("リトルエディアン\n"); }else{ printf("ビッグエディアン\n"); } return 0; } shortは上図のように2バイトを使用する。 ・リトルエンディアンの場合には、低位バイトから値を格納…

#ifdef、#endifを使わないデバッグprint

#include <cstdio> using namespace std; #define DEBUG #ifdef DEBUG # define DEBUG_PRINTF(message) fprintf(stderr, message) # define DEBUG_PRINTF2(f, a, b) fprintf(stderr, f, a, b) #else # define DEBUG_PRINTF(message) # define DEBUG_PRINTF2(f, a, b)</cstdio>…