カテゴリー「C言語」の2件の記事

【C#備忘ログ】 2014/11/08(土) C#でFormをデザインできなくなる

Visual C#でソースコードをいじっていたらFormがデザイナーで表示できなくなってた、なんてよくありますよね。
Form
この現象が出たら、保存前のバージョンをチェックアウトして・・なんてやってませんか?
この現象が発生するのは、Formのソースファイル(Form1.csなど)に問題がある時です。
問題とは、C#の文法的に正しいかどうかではなく、デザイナーがこのソースファイルを正しく読み込めるかどうかです。
ありがちなパターン1
Formに独自機能を追加させるために、親クラスを追加した、あるいはFormのクラスを抽象クラスにした
namespace BindingListTest
{
    public partial class Form1 : CustomForm
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}
この場合、CustomFormが抽象クラスであった場合に発生します。
ここに詳しく解説されています。
仕方ないので、構成マネージャで「VIEW_TEST」などを作ったのち、プロジェクトのプロパティからビルドを選択し、「条件付きコンパイルシンボル」にVIEW_TESTを追加。
さらに、ソースコードのクラス定義してる行を以下のように切り替え式に。
#if VIEW_TEST
    public partial class Form1 : Form
#else
    public partial class Form1 : CustomForm
#endif
ありがちなパターン2
Formのソースには、Formクラス以外にも独自クラスを追加するかも知れませんが、Formクラスよりも上で定義するとこの現象が出ます。
namespace BindingListTest
{
    public class user
    {
 public user()
        {
        }
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}
これで現象が出た場合・・
namespace BindingListTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
    public class user
    {
 public user()
        {
        }
    }
}
こうします。

【C言語備忘ログ】 2012/09/08(土) memcpyの速度

電文処理でバイト配列と数値型との相互変換というものがしょっちゅう出てきます。

char型配列dataを数バイト使ってシーケンス番号を表現する、などです。

例えば、dataの格納イメージが

data[0] = 0x12
data[1] = 0x34

の時、2byte使って0x1234という数値を意味している、などです。

このdata配列をint型に変換する場合には

int sequence;

sequence = data[0] << 8 | data[1]; ・・・①

などとしますが、ビッグエンディアン時に限り、

memcpy(&sequence, data, 2); ・・・②

とかも出来ます。

んが、このmemcpy(に限らずmem系関数全般)は処理にやたら時間がかかります。
CPUによって差はあるものの②は①の約2倍の時間が掛かります。

エンディアンの影響も受けるし、素直に①でやっといた方がいいですね。

(Windowsなどリトルエンディアン環境下で②を実行するとsequenceには0x3412と格納されます)