2017年11月15日水曜日

VisualStudioのプロジェクトウィザードでgoogleが見れる




最近、VisualStudioのプロジェクトウィザードを実装していて、大発見。

VisualStudioのプロジェクトウィザードってhtmlで記載しているんですが、
標準のショートカットが使えてしまうらしい。。。

なので、上のキャプチャーんみたいに、ファイルも開く(Ctrl+O)ことができてしまうんです。
ってことは、、、、



なぜか、プロジェクト作成中に、googleが開けてしまうという結果に。。。
ちなみに、ウィザードには戻せません。
ついでに、Ctrl+マウスホイールのスクロールで拡縮も!!(老眼には、優しい仕様です。)



どうしたら、標準のショートカットを抑制できるのか、調べてみたけど、
これに関しての記事が見つからない。。。

そもそも、これが仕様なのか、バグなのか。。。
どう対処したらいいのか。。。
だれか、助けてくれ。。。



2017年11月14日火曜日

C#で共用体(union)を利用する

C#で共用体(union)を利用する


「C#で共用体(union)を利用する」と書いたけれども、C#には、共用体がありません。
属性(StructLayoutとFieldOffset)を駆使して記載します。



[StructLayout(LayoutKind.Explicit)]struct BitData{
    [FieldOffset(0)]    public byte Data0;
    [FieldOffset(1)]    public byte Data1;
    [FieldOffset(2)]    public byte Data2;
    [FieldOffset(3)]    public byte Data3;
    [FieldOffset(0)]    public UInt32 Data;}



LayoutKind.Explicitを指定することで、
フィールド内のFieldOffsetが使用可能になります。



2017年11月10日金曜日

C#でTextBoxに数値のみの入力制限をする方法



C#でTextBoxに数値のみの入力制限をする方法を紹介します。
基本的な入力制限はもちろんのこと、コピペや再変換にも対応。

対応方法としては、テキスト変換時に数値以外を空文字に変更するだけ。
ただし、文字の削除のみだと、選択位置が変わるため、少し調整しています。


Regex m_NumOnlyRegex = new Regex("[^0-9]");
private void numTextBox_TextChanged( object sender, EventArgs e )
{
    var preTextLen = numTextBox.Text.Length;
    var selectPos = numTextBox.SelectionStart;
    numTextBox.Text = m_NumOnlyRegex.Replace( numTextBox.Text, String.Empty );
    var removeLen = preTextLen - numTextBox.Text.Length;
    if( selectPos > removeLen )
    {
        numTextBox.SelectionStart = selectPos - removeLen;
    }
    else
    {
        numTextBox.SelectionStart = 0;
    }
}

初期化したバイト配列の作成(C#)その2


初期化したバイト配列の別のやり方があったため、記載。
ついでに速度を比較してみました。

実装

配列を作った後に、値を設定しなおして配列に戻すw

var datas = new Double[10000].Select(val=> val = 5.0).ToArray();

もう一つの方法は、こちらを参照

速度比較のコード


private void Test()
{
    InitializeArray_Select();
    InitializeArray_Repeat();
}
private void InitializeArray_Select()
{
    var stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();
    var datas = new Double[10000].Select(val=> val = 5.0).ToArray();
    stopwatch.Stop();
    Debug.WriteLine( stopwatch.ElapsedTicks );
}
private void InitializeArray_Repeat()
{
    var stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();
    var datas = Enumerable.Repeat<Double>(5.0,10000).ToArray();
    stopwatch.Stop();
    Debug.WriteLine( stopwatch.ElapsedTicks );
}

比較結果


InitializeArray_Select :6954tick(6.9ms)
InitializeArray_Repeat:3367tick(3.4ms)

Enumerable.Repeatのほうが少しはやい。

2017年11月9日木曜日

DirectXSDKがS1023エラーでインストールできない




DirectXSDKがS1023エラーでインストールできない場合の対処法です。

対処法

「Microsoft Visual C++ 2010 再頒布可能パッケージ」(x86)(x64)のアンインストール


原因

DirectXSDKのインストール時に「Microsoft Visual C++ 2010 再頒布可能パッケージ 10.0.30319」がインストールされるのですが、新しい再頒布可能パッケージ「Microsoft Visual C++ 2010 再頒布可能パッケージ 10.0.40219」がインストールされていると、エラーになってしまうようです。

2017年11月8日水曜日

C#でDecimalの演算速度が遅いので速度比較


C#でDecimalの演算速度が遅い気がしたので、計測してみた。
比較対象は、天下の浮動小数点のDouble。


計測の際に使用したプログラム

private void Test()
{
    DecimalDivide();
    DoubleDivide();
}
private void DecimalDivide()
{
    var stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();
    Decimal val = 10000;
    Decimal calc= 2m;
    for( Int32 i = 0; i < 10000; i++ )
    {
        val = val / calc;
    }
    stopwatch.Stop();
    Debug.WriteLine( stopwatch.ElapsedTicks );
}
private void DoubleDivide()
{
    var stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();
    Double val = 10000;
    Double calc = 2.0;
    for( Int32 i = 0; i < 10000; i++ )
    {
        val = val / calc;
    }
    stopwatch.Stop();
    Debug.WriteLine( stopwatch.ElapsedTicks );
}

測定結果

速度差にして約5倍。計算が多くなってくると、ちょっと気になる差かも。。。
まぁ、基本的に、使用する型は、必要十分な型にすべきということですね。

Decimal:1309tick(1.3ms)
Double:224tick(0.24ms)

ビルドイベントでの複数コマンドの実行



VisualStudioのビルドイベントで、ビルド前や、ビルド後にコマンドを実行することができます。
その際に、複数のツールを実行したい場合には、ツールの戻り値を見たいケースが出てきます。
単純に
consoleApp.exe
consoleApp2.exe
と記載すると、1つ目が失敗しても、2つ目のアプリで正常な戻り値が返ってしまうと、ビルドが継続してしまいます。
errorlevelの変数を記載することで、1つ目が失敗した場合にビルドエラーにすることができます。


consoleApp.exe
if %errorlevel% == 0 consoleApp2.exe