C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 >>
■69729  C++におけるC互換構造体のゼロクリア
□投稿者/ キム -(2014/01/24(Fri) 18:09:42)

    分類:[C/C++] 

    環境:Visual C++ 2008

    C互換構造体ゼロ初期化に関する解釈についてご教示ください。
    下記の(A)のような記述をしたら、先輩に怒られてしまいました。
    なぜだめなのか理解できません。

    // C互換構造体
    struct Hoge
    {
    int i;
    double d;
    void* p;
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
    Hoge a = {};

    // ここで Hoge a を書き換えるような処理を実行
    a.i = 1;
    a.d = 2.345;
    a.p = &_tmain;
    std::cout << a.i << std::endl << a.d << std::endl << a.p << std::endl;

    // (A)ここで Hoge a をゼロクリア
    a = Hoge();
    std::cout << a.i << std::endl << a.d << std::endl << a.p << std::endl;

    return 0;
    }

    ゼロクリアされるのは、()による値初期化で非静的メンバーが各々ゼロクリアされるからという解釈で正しいですか?

    JIS X3014:2003 の 8.5 初期化子 を読むと、
    7 に《初期化子》の括弧の中が空(すなわち、())のオブジェクトには値初期化を行わなければならない。
    とあり、
    5 に T型のオブジェクトの値初期化とは、次のいずれかを意味する。
    - Tが利用者定義コンストラクタを持たないクラス型の場合、Tの各非静的データメンバ及び各規定クラス成分を値初期化する。
    - Tが配列型の場合、各要素に対し値初期化を行う。
    - そうでない場合、そのオブジェクトをゼロ初期化する。

    とあるので、利用者定義コンストラクタを持たないクラス型であるC互換構造体型にはこれが適用されると解釈しています。
    また、その結果、
    ・各メンバが各々ゼロ初期化される。
    ・各メンバはスカラ型なので0を型変換した値が設定される。
    (よってポインタや浮動少数の内部表現は関係ない)
    ・パディング領域がゼロクリアされるかどうかは実装依存。
    ということになると考えています。
    なので、まったく問題ないと考えているのですが。

    この解釈で正しいですか?
親記事 /過去ログ119より / 関連記事表示
削除チェック/

■69731  Re[1]: C++におけるC互換構造体のゼロクリア
□投稿者/ 774RR -(2014/01/25(Sat) 08:15:47)
    なぜ怒ったのかを訊ねてみないと、相手側の勘違いとか理解不足とかありえるわけで・・・
    「値初期化」についてよく知らない人もいるし。

    > この解釈で正しいですか?
    正しいと思う。

    規格マニアとして指摘しておくと、ここの文言は
    ISO/IEC 14882:1998 と ISO/IEC 14882:2003 で変更があるところで、
    使おうとしているコンパイラの採択している規格書の版は確認しておく必要がある。
    ISO/IEC 14882:2011 は未入手につき調査していない。
    (2011 では POD の定義が変更になっているのは知っている) 。
    # visual C++ 2008 がどうだかは調査していない。

    ・コンパイラの採択している版
    ・コンパイラの規格合致の程度
    ・コンパイラのバグの有無
    あたりで、同一ソースを別の(古い)コンパイラで使うと困る可能性は0ではない。

    ちなみにa = Hoge(); は
    1.値初期化で一時オブジェクトを作って
    2.その一時オブジェクトを a に複写して
    3.一時オブジェクトをデストラクトしている
    わけで、一時オブジェクトの生成破棄が発生する。
    最適化を考えないとき「a のメンバごとの代入」より遅いかもしれない。
    # 最適化の結果として同じ「ゼロクリア」コードが生成されたとしても不思議はないが。

    一方で、クラス実装が変化しうるとき「メンバごとの代入」では
    書き直す必要がある
    書き直す際に抜けが出るかもしれない
    という点で、提示コードのほうが安全方向であることは間違いない。

    問題ない安全なコードに対して相手がダメだしした理由を、俺も知りたいね。
記事No.69729 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69753  Re[2]: C++におけるC互換構造体のゼロクリア
□投稿者/ キム -(2014/01/27(Mon) 19:13:55)
    No69731 (774RR さん) に返信

    お返事ありがとうございます。

    > 問題ない安全なコードに対して相手がダメだしした理由を、俺も知りたいね。

    相手に確認しました。
    問題はパディング領域が不定となる可能性にあるとのことでした。
    - 今回の構造体はC言語からも呼び出される部分での受け渡しに利用されていること。
    - C言語開発陣の間では構造体の比較にmemcmpを使用する習慣があり、今更ダメ出しできない。
    - なので、ZeroMemoryを使ってほしい。

    memcmpやZeroMemoryなど、非常に不安なのですが、現在の実行環境では問題く動く実績があるので、実績優先の決定とのことです。
    仕様制定時にはそのような話は微塵も無かったのですが、たぶん私の突込みが足りなかったのだと反省しています。

    > 規格マニアとして指摘しておくと、ここの文言は
    > ISO/IEC 14882:1998 と ISO/IEC 14882:2003 で変更があるところで、
    > 使おうとしているコンパイラの採択している規格書の版は確認しておく必要がある。

    値初期化って2003版からなのですね。
    1998版は手元にないのですが、何とか調べて見ます。
    今回のことがきっかけで非常に勉強になり、感謝しています。
記事No.69729 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■69754  Re[3]: C++におけるC互換構造体のゼロクリア
□投稿者/ 774RR -(2014/01/27(Mon) 20:10:50)
    > 問題はパディング領域が不定となる可能性にあるとのことでした。
    なるほど。というか、それ以外に不安材料がないよね。

    > - C言語開発陣の間では構造体の比較にmemcmpを使用する習慣があり、今更ダメ出しできない。
    習慣があってもダメなもんはダメ。
    ・C の構造体代入で padding が複写される保証はない。だから、
     暗黙の複写が行われるが padding をゼロクリアする機会がないようなケース、たとえば
     「関数の引数」での構造体の受け渡しの際に
     渡す元のバイナリイメージと渡された後のバイナリイメージが同一である保証はない。
     (特定処理系の特定コンパイルオプション採用時に padding を含む複写がされる、というのと別の話)
    ・メンバに char [] を置いて文字列を保持するだけで破綻する
     (有効文字数が増減するとき '\0' 以後は操作しないで放置プレイなことが多いため)

    > 値初期化って2003版からなのですね。
    「値初期化 (value-initialize) という文言は 2003 で追加されている。
    1998 には zero-initialize と default-initialize の2つしかなかった。

    よそんちの様子が垣間見えて、こっちもとても参考になったですよ。
    ありがとうございました。
記事No.69729 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■69608  DateTimePickerのデータバインド時の動作
□投稿者/ コージ -(2014/01/13(Mon) 11:23:26)

    分類:[C#] 

    2014/01/13(Mon) 11:39:31 編集(投稿者)
    2014/01/13(Mon) 11:37:47 編集(投稿者)
    2014/01/13(Mon) 11:37:30 編集(投稿者)

    <pre><pre>Formアプリで、DataTimePickerおよびNumericUpDownコントロールを自分で定義したクラスオブジェクトへバインドした場合の動作が、
    期待していた動作と違うので教えてください。

    やりたいことは、
    自作Personクラスを定義し、FormにPersonオブジェクトの各メンバに対応するコントロールを配置して、
    入力された内容をデータバインドにてPersonオブジェクトに反映させることです。

    具体的には、Personクラスに、「名前」「誕生日」「年齢」プロパティを用意し、Formには
    名前(TextBox)、誕生日(DatetimePicker)、年齢(NumericUpDown)の各コントロールを張り付けます。

    コードはこんな感じです。
    ○Personクラス
    class Person
    {
    private string _name;
    public string Name
    {
    get { return _name; }
    set { _name = value; }
    }

    private DateTime _birthDay;
    public DateTime BirthDay
    {
    get { return _birthDay; }
    set { _birthDay = value; }
    }

    private decimal _age;
    public decimal Age
    {
    get { return _age; }
    set { _age = value; }
    }

    public Person()
    {
    _birthDay = new DateTime(2014, 1, 20);
    }

    }

    ○入力用フォーム
    public partial class Form1 : Form
    {
    private Person hoge = new Person();

    private void Form1_Load(object sender, EventArgs e)
    {
    bindingSource1.DataSource = hoge; // デザイナでフォームに貼り付けてある
    txtName.DataBindings.Add("Text", bindingSource1, "Name");        // 名前
    dateTimePicker1.DataBindings.Add("Value", bindingSource1, "BirthDay"); // 誕生日
    numericUpDown1.DataBindings.Add("Value", bindingSource1, "Age"); // 年齢
    }
    }

    上記コーディングで、
    データバインディング機能により、コントロールからフォーカスが離れたとき(離れようとするとき?)に、
    Personクラスのセッターメソッドが呼ばれ、クラスオブジェクトのメンバに値が設定されると考えていました。
     
    しかしながら、たとえば
    dateTimePicker1で1月をキーボードの「2」キー押下により2月に変更した後、
    ほかのコントロールへ移動してもPersonの誕生日セッターメソッドが呼び出されません。(ブレークポイントを設定して確認)
    続けてdateTimePicker1にフォーカスを戻して何の変更も行わずにフォーカスを移動すると、変更していないのにセッターメソッドが呼ばれます。

    1月を「矢印」キー押下で2月に変更したときは、期待通りに動きます。


    それで教えていただきたいのですが、
    これってコーディングで何か抜けていることがありますか?
    この現象を回避するにはどのようにしたら良いでしょうか。

    よろしくお願いいたします。(NumericUpDownでも同様の動きでした。)

    </pre></pre>
親記事 /過去ログ119より / 関連記事表示
削除チェック/

■69609  Re[1]: DateTimePickerのデータバインド時の動作
□投稿者/ WebSurfer -(2014/01/13(Mon) 11:38:39)
    No69608 (コージ さん) に返信

    ご自分の環境(OS, .NET Framework, Visual Studio のバージョンなど)ぐらいは最初に書けませんか?
記事No.69608 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69610  Re[2]: DateTimePickerのデータバインド時の動作
□投稿者/ コージ -(2014/01/13(Mon) 11:43:54)
    No69609 (WebSurfer さん) に返信
    > ■No69608 (コージ さん) に返信
    >
    > ご自分の環境(OS, .NET Framework, Visual Studio のバージョンなど)ぐらいは最初に書けませんか?

    すみません。
    環境は
    Windows7
    VisualStudio2010 Express
    .NET Framework 4 Client Profile

    です。

記事No.69608 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69756  Re[3]: DateTimePickerのデータバインド時の動作
□投稿者/ コージ -(2014/01/27(Mon) 23:48:39)
    No69610 (コージ さん) に返信
    > ■No69609 (WebSurfer さん) に返信
    >>■No69608 (コージ さん) に返信
    >>
    >>ご自分の環境(OS, .NET Framework, Visual Studio のバージョンなど)ぐらいは最初に書けませんか?
    >
    > すみません。
    > 環境は
    > Windows7
    > VisualStudio2010 Express
    > .NET Framework 4 Client Profile
    >
    > です。
    >
    >
記事No.69608 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■69760  指定した列のみフォーカス移動
□投稿者/ 龍鳳 -(2014/01/28(Tue) 15:36:32)

    分類:[VB.NET/VB2005 以降] 

    DataGridViewで指定した列のみフォーカス移動する方法が解りません。

     奇数列だけTabでフォーカス移動するなど

    ご存知の方よろしくお願いします。

    環境は、
    言語:VB.Net2010
    OS:Win7



親記事 /過去ログ119より / 関連記事表示
削除チェック/

■69768  Re[1]: 指定した列のみフォーカス移動
□投稿者/ shu -(2014/01/28(Tue) 17:35:06)
    No69760 (龍鳳 さん) に返信
    > DataGridViewで指定した列のみフォーカス移動する方法が解りません。
    > 例
    >  奇数列だけTabでフォーカス移動するなど
    > 
    > ご存知の方よろしくお願いします。
    単純な設定で行う方法はわかりません。
    だいたい以下のような感じで出来ると思います。
    
        Private Sub DataGridView1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown
            If e.KeyCode = Keys.Tab Then
                e.Handled = True
                Dim Col = DataGridView1.CurrentCell.ColumnIndex
                Dim Row = DataGridView1.CurrentCell.RowIndex
                If Col Mod 2 = 0 Then
                    If e.Shift Then
                        Col -= 2
                        If Col < 0 Then
                            If Row > 0 Then
                                Col = DataGridView1.ColumnCount - 1
                                Row -= 1
                            Else
                                Col = 0
                            End If
                        End If
                    Else
                        Col += 2
                        If Col >= DataGridView1.ColumnCount Then
                            If Row < DataGridView1.RowCount - 1 Then
                                Col = 0
                                Row += 1
                            Else
                                Col = DataGridView1.ColumnCount - 1
                            End If
                        End If
                    End If
                    DataGridView1.CurrentCell = DataGridView1.Item(Col, Row)
                End If
            End If
        End Sub
    
        Private Sub DataGridView1_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyUp
            If e.KeyCode = Keys.Tab Then
                e.Handled = True
            End If
        End Sub
記事No.69760 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69757  NETFrameworkを4⇒4.5にする
□投稿者/ よしおか -(2014/01/28(Tue) 00:58:14)

    分類:[.NET 全般] 



    C#で Visualstudio2012を活用しています。

    依然作ったプログラムをバージョンアップしようとしたらPCが変わり、NETFrameworkのバージョンが変わっていてエラーが発生してしまいました。

    警告 1 プライマリ参照 "ファイル名" は、".NETFramework,Version=v4.5" フレームワークに対して作成されているため、解決できませんでした。これは現在ターゲットされているフレームワーク ".NETFramework,Version=v4.0" よりも新しいバージョンです。


    4で書かれている部分を4.5に変更する変更する方法はありませんか?
親記事 /過去ログ119より / 関連記事表示
削除チェック/

■69758  Re[1]: NETFrameworkを4⇒4.5にする
□投稿者/ WebSurfer -(2014/01/28(Tue) 12:37:56)
    No69757 (よしおか さん) に返信
    > 依然作ったプログラムをバージョンアップしようとしたらPCが変わり、NETFrameworkのバージョンが変わっていてエラーが発生してしまいました。

    意味がよくわかりません。もっと具体的に何をどうしたらどうなったのか書けませんか?

    #誤字をどうのこうの細かいことを言っている訳ではありません。
記事No.69757 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69759  Re[1]: NETFrameworkを4⇒4.5にする
□投稿者/ 魔界の仮面弁士 -(2014/01/28(Tue) 13:18:26)
    No69757 (よしおか さん) に返信
    > 依然作ったプログラムをバージョンアップしようとしたらPCが変わり、
    > NETFrameworkのバージョンが変わっていてエラーが発生してしまいました。

    ここでいう「PC」とは、開発環境のことでしょうか、実行環境の事でしょうか。
    また、.NET Framework のバージョンが変わったというのは、何から何に変わったのでしょうか。


    Visual Studio 2012 を入れているのであれば、プロジェクトのプロパティを開けば
    対象となるターゲットフレームワークを選ぶためのドロップダウンリストが
    あるはずですが、そういう話ではない…?
     .NET Framework 2.0
     .NET Framework 3.0
     .NET Framework 3.5
     .NET Framework 3.5 Client Profile
     .NET Framework 4
     .NET Framework 4 Client Profile
     .NET Framework 4.5
記事No.69757 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69771  Re[2]: NETFrameworkを4⇒4.5にする
□投稿者/ よしおか -(2014/01/28(Tue) 19:35:30)
    教えていただいた方法で、できました!
    プロジェクトのプロパティにドロップメニューがあったのですね!

    ありがとうございます。




    No69759 (魔界の仮面弁士 さん) に返信
    > ■No69757 (よしおか さん) に返信
    >>依然作ったプログラムをバージョンアップしようとしたらPCが変わり、
    >>NETFrameworkのバージョンが変わっていてエラーが発生してしまいました。
    >
    > ここでいう「PC」とは、開発環境のことでしょうか、実行環境の事でしょうか。
    > また、.NET Framework のバージョンが変わったというのは、何から何に変わったのでしょうか。
    >
    >
    > Visual Studio 2012 を入れているのであれば、プロジェクトのプロパティを開けば
    > 対象となるターゲットフレームワークを選ぶためのドロップダウンリストが
    > あるはずですが、そういう話ではない…?
    >  .NET Framework 2.0
    >  .NET Framework 3.0
    >  .NET Framework 3.5
    >  .NET Framework 3.5 Client Profile
    >  .NET Framework 4
    >  .NET Framework 4 Client Profile
    >  .NET Framework 4.5
記事No.69757 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69772  Re[3]: NETFrameworkを4⇒4.5にする
□投稿者/ よしおか -(2014/01/28(Tue) 19:43:30)
    解決積みにするの忘れてました。
記事No.69757 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■69761  C# XMLのSelectSingleNodeでノードが取れ
□投稿者/ まめしば -(2014/01/28(Tue) 15:49:21)

    分類:[.NET 全般] 

    VS2008/Windows7

    お世話様です。
    標題のメソッドを使ってXMLの操作を行っています。
    利用するのは初めてではないのですが、現在取得しようとしてる内容だとノードが取得できず、
    その理由が全く分からないのでどなたか御教示ください。

    やっている流れとしては
    HTTPリクエストのレスポンスをXmlDocumentでロードし、その後SelectSingleNode()でトップのノード名指定をしています。
    以下にコードとXmlDocumentのInnerXmlの内容を記載します。

    ----------------------------------------------------------------
    XmlNode node = xml.SelectSingleNode("./WMS_Capabilities");
    →nodeが取得できずnullとなる。

    ----------------------------------------------------------------
    <?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
    <WMS_Capabilities>
    <Service>
    </Service>
    </WMS_Capabilities>
    (属性などは視認性を考慮し削除しています)

    宜しくお願い致します。
親記事 /過去ログ119より / 関連記事表示
削除チェック/

■69762  Re[1]: C# XMLのSelectSingleNodeでノードが取れ
□投稿者/ Hongliang -(2014/01/28(Tue) 16:18:37)
    少なくとも見える範囲では間違っていないように見えます。
    変数xmlはXmlDocumentオブジェクトですよね?
    
    デバッガでブレークするなどしてxml.ChildNodesを確認してみて下さい。
    WMS_Capabilitiesを指すXmlElementは存在していますか?
    
    // ./WMS_Capabilities の先頭の.は無い方が自然じゃないかなぁ。
記事No.69761 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69763  Re[2]: C# XMLのSelectSingleNodeでノードが取れ
□投稿者/ まめしば -(2014/01/28(Tue) 16:47:22)
    >>Hongliang さん
    レスありがとうございます。
    自分でも特に間違いはないと思ってはいるのですが・・・。
    (いままでにない経験のため)

    ちなみにChildNodesにも含まれています。実際xml.LastChildでは該当の要素が取れるので。
    ただその後取得したノードで同メソッドを実行するとやはり正常に取得できないみたいです。
    何かxpath部分のコードの問題でしょうか・・・。

    ちなみに御指摘頂いたコロンなしや"//WMS_Capabilities"、"WMS_Capabilities"などいくつか試してみましたが
    結果は変わりませんでした。
記事No.69761 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69764  Re[3]: C# XMLのSelectSingleNodeでノードが取れ
□投稿者/ Hongliang -(2014/01/28(Tue) 16:52:51)
    LastChildで取れるのなら、そのLocalNameとWMS_Capabilitiesが等しいかどうかをチェックしてみて下さい。

    ところで、まさかとは思いますが、xmlns属性が存在していたりしませんか?
記事No.69761 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69766  Re[4]: C# XMLのSelectSingleNodeでノードが取れ
□投稿者/ まめしば -(2014/01/28(Tue) 17:27:09)
記事No.69761 のレス /過去ログ119より / 関連記事表示
削除チェック/

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 >>

ヒット件数が多いので過去ログ1〜119 までの検索結果 / 過去ログ120からさらに検索→

パスワード/

- Child Tree -