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

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

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

全過去ログを検索

<< 0 >>
■5688  [VB.NET] クロージャ・関数型 について
□投稿者/ mあ -(2007/07/20(Fri) 17:17:05)

    分類:[.NET 全般] 


    VS.NET2005(VB) Version8.0.5 / Oracle10i
    VB.NET 超初心者です。
    始めてまだ1時間経っていませんが、質問です。

    VB.NET でクロージャや関数型での呼び出しみたいなの、インターフェースでもいいのですが、
    似たようなやり方は出来ますでしょうか?

    # クラスとかまだ分かってない部分が多いのですが、分かってないものは土日に覚えます。
    # たぶん覚えないかも。「○○さんなら簡単でしょ、Javaと一緒だって」って言われても
    # いざ実際のコード見てみると VBScript に近いことはわかるが、Javaとは似て・・る?

    # クロージャ使うには無理があるのは分かっています。普通にクラス作ってメンバメソッド
    # をオーバーライドして違う部分だけ派生クラスで吸収すりゃOKじゃん、なんですが。

    'CSV作ってFTP転送する
    public shared function createCsvAndSendFtp (
    byref リザルトセットの不要カラムを取り除いたものを返す画面固有処理 As Function,
    byref ファイル名又はバイトストリームを引数に取りテンポラリファイルを作成してFTPで投げちゃう処理 as Fucntion
    ) As Boolean

    dim list as new ArrayList
    dim rs as ResultSet = リザルトセットの不要カラムを取り除いたものを返す画面固有処理()

    //
    //リザルトセットを "," 連結の文字列にして ArrayList に格納する内部処理
    //

    return
    ファイル名又はバイトストリームを引数に取りテンポラリファイルを作成してFTPで投げちゃう処理 (
    ArrayListを引数で取ってCSV出力する処理( list )
    )
    end function

    # クラスを一杯作ることはプロジェクト上あまり推奨されていません。


    ★理想としては、こんなのが出来ればいいなぁと思っています。
    例)
    function0001((new Function(){})(),new Function(){}, new Function(){});


    http://www.divakk.co.jp/blog/aoyagi/archive/2006/05/24/7240.aspx
    ここに9からこーゆーことできるって書いてありますが、9ってのは .NET2008 のことですかね??


    処理概要
    (1)ストアド呼び出してワークテーブル作成する。
    (2)SELECT文を発行するストアドを呼び出す。
       ワークテーブルから指定した全レコードの全カラムを引っ張ってくる。
       なぜ全カラム引っ張ってくるのかは、機能によっては要らないカラムがあり、ストアドでは機能区分は
       意識しないため。
    (3)VB側で要/不要カラムを機能別で判定して「DBのカラムの並び」でCSVを作成する。
       なぜかDBのカラム並び(SELECT A,B,C FROM TBL の 順序そのまま)です。
    (4)作成したCSVデータをテンポラリファイルに保存する。
    (5)FTP転送してローカルを削除する。
    (6)完了

    という流れの中で、そのまま引数合わせれば使えそうな部分は、ArrayList を取る(4)だけです。
    2画面で、作るCSVは全部で8つあります。
    画面1:X1,X2,X3
    画面2:X1,X2,X3,X4,X5

    X1,X2,X3 はデータ内容は違いますが、カラム数、CSVファイル内の構成は同じです。
    CSVと言っても、SVF帳票システムに読み込ませるデータファイルなので、普通のCSVの構成ではありませんが。
    カンマ区切りというだけで、CSVって呼ばれています。


    毎度わけのわからん質問で済みません。


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

■55716  Re[10]: ASP.NETのListViewで空行表示の方法
□投稿者/ MM -(2010/12/10(Fri) 09:59:21)
    ↑何を言っているのかわかりませんね
    <asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1"
    のやり方は通常業務では避けるべきなはずです。DB接続失敗を拾えない、並び順を変えたいとか汎用性に掛けるからです。
    あるいはテーブル結合して条件付けをしたいなど
    ↓も意味不明
    >>ObjectDataSource.Selected イベントのハンドラーで
    処理すべきです。

    protected void ObjectDataSource1_Selected(
    object sender, ObjectDataSourceStatusEventArgs e) {
    型指定されたDataTable table = (型指定されたDataTable)e.ReturnValue;
    ...
    }
    まったく意味不明。ObjectDataSource.Selected イベント?表示する時の問題のはず
    これ以上、もりおさんと議論しても無駄なで失礼します。

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

■69146  動的に作成したテキストボックスの入力方法
□投稿者/ coscos -(2013/12/06(Fri) 10:05:42)

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

    いつもお世話になります。
    テキストボックスを動的に配置しました。
    それで、別のsubでテキストに入力したいのですが、どうすれば良いのでしょう?
    どう呼ぶかがわかりません。インデックスで呼ぶ、単独で呼ぶ場合が知りたいです。
    宜しくお願い致します。

    Public Class Form1
    Inherits System.Windows.Forms.Form
    Public kosu As Integer = 29
    Private WithEvents tbox As TextBox
    Private WithEvents elabel As Label

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.AutoSize = True
    Me.SuspendLayout()
    Dim yoko_d As Integer
    Dim tmp_d As Integer
    Dim count_d As Integer
    For ii As Integer = 0 To kosu
    tbox = New TextBox
    Me.Controls.Add(tbox)
    tmp_d = tbox.Height * count_d * 2.3 + 40
    Me.tbox.SetBounds(50 + yoko_d, tmp_d, 200, 19)
    If count_d = 9 Then
    count_d = 0
    yoko_d = yoko_d + 250
    Else
    count_d = count_d + 1
    End If
    Next
    Me.ResumeLayout()
    End Sub
    End Class
親記事 /過去ログ118より / 関連記事表示
削除チェック/

■91942  Re[18]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(2019/08/12(Mon) 17:33:28)
    No91939 (えんえん さん) に返信
    > できれば、最終回答をお教えいただけないでしょうか?
    > 恐らく、こうやって何度もやりとりするよりも
    > 効率的だと思うのですが・・・

    申し訳ありませんが、現状は言語文法的な側面からしか回答できません。

    自分は高速フーリエ変換について正確に理解しているわけではないため、
    「作成依頼」に近い「質問」をされても、デバッグすることができないためです。


    実引数としてどういう値を入れた時に、なんという結果が返されるのか示す、
    ブラックボックステストのための情報があるわけでも無いですし。



    > もし、出力引数がなければ、
    > 再帰処理の意味がなくなってしまうと思うのですが・・・

    今回は ByVal で十分でしょう。

    改めて、 No91906 の最後の個所にあるコードで説明してみます。
    今回は意図的に ByVal を付けておきます。

      Sub Test4_Modify(ByVal a As ArraySegment(Of Double))
        a.Array(a.Offset + 1) *= 10
      End Sub

    このコードは「ByVal a As ArraySegment(Of T)」という宣言になっていますが、
    呼び出し元の値は、きちんと 10 倍になっています。


    ・ArraySegment(Of T) 構造体は値型。

    ・T が値型であれ参照型であれ、配列 T() は列は常に「参照型」。

    ・a.Array プロパティが返す型は As T() なので「参照型」。

    ・a.Array プロパティは ReadOnly であり、書き換えられない。
     たとえば「a.Array = Nothing」などと書くことはできない。

    ・a.Array プロパティから返される「一次元配列」は、
     ReadOnly というわけではないので、その要素を書き換えることができる。
     たとえば「a.Array(0) = Nothing」や「a(1) *= 10」と書いても良い。



    ==== 入力引数の例 <In> === ※いずれも ByVal で書いている。

     Sub Method1(ByVal x() As Integer)
       x(0) = 100 ' 呼び出し元の実引数では、配列の先頭要素が 100 に替わる。ただし、配列そのものが指しかわるわけでは無い。
     End Sub

     Sub Method2(ByVal lbl As Label)
       lbl.Text = CStr(Now) ' 呼び出し元で指定した Label のテキストが変化する。ただし、Label 型変数が別のラベルを指し示すわけでは無い。
     End Sub

     Sub Method3(ByVal pt As Point)
       Console.WriteLine("{0}, {1}", pt.X, pt.Y)
     End Sub


    ==== 出力引数の例 <Out> === ※いずれも ByRef で書いている。

     Sub Method4(ByRef x() As Integer)
       x = New Integer() { 0, 1, 2, 3 } ' 呼び出し元が渡した変数の内容は、新しい配列の参照へと差し替わる。
     End Sub

     Sub Method5(ByRef f As Form)
       f = New Form2() ' 呼び出し元が渡した変数の内容は、Form2 への参照へと書き換わる。
     End Sub

     Sub Method6(ByRef i As Integer)
       i = 12345 ' 呼び出し元が渡した変数の内容は、12345 という値に書き換わる。
     End Sub

     Sub Method7(ByRef pt As Point)
       pt = New Point(-1, 1) ' 呼び出し元が渡した変数の内容は、座標 (-1, 1) という値に置き換わる。
     End Sub


    ==== 入出力引数の例 <In, Out> === ※いずれも ByRef でなければならない。

     Sub Method8(ByRef x As Integer)
       x += 1
     End Sub

     Sub Method9(ByRef pt As Point)
       pt.Offset(-1, 1)
     End Sub

     Function Method10(ByVal x As Point) As Point
       pt.Offset(-1, 1)
       Return pt
     End Sub
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91946  Re[17]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(2019/08/13(Tue) 01:00:13)
    No91938 (魔界の仮面弁士) に追記
    >  Dim x() As Byte = New Byte(5) {11, 22, 33, 44, 55, 66}
    >  Dim y As New ArraySegment(Of Byte)(x)
    >  Dim z As New ArraySegment(Of Byte)(x, 2, 3)
    > において、「y.Array」や「z.Array」は、配列 x への参照を意味します。
    > なので、x(3) = 100 と代入すれば、z(1) も同様に 44 から 100 へと変化します。

    補足説明。

    System.ArraySegment(Of T) は、.NET Framework 2.0 以上で使用可能な、比較的歴史の長い型ですが、
    「 z(1) 」のようにインデクサで参照するためには、.NET Framework 4.5 以上が必要となります。

    .NET Framework 4 以下の場合、LINQ 操作にさえ対応していないのでご注意ください。




    No91942 (魔界の仮面弁士) に追記
    >> できれば、最終回答をお教えいただけないでしょうか?
    > 申し訳ありませんが、現状は言語文法的な側面からしか回答できません。


    ということで、文法的に変換しただけで、コンパイルすらしていないコードですが、
    一応、当方で翻訳してみたものを掲載してみます。

    C/C++ はそもそも専門外ですし、FFT の理論も全く理解しておらず、おまけに
    どんな値を渡せばよいのか、そしてどういう結果になるべきかというテスト要件すら不明なので、
    およそ「最終回答」と呼ぶには程遠いコードではありますが、一応参考までに。



    'void fft(int n, double theta, double ar[], double ai[], double tmpr[], double tmpi[])
    '{
    Private Sub fft(ByVal n%, ByVal theta#, ByVal ar As ArraySegment(Of Double), ByVal ai As ArraySegment(Of Double), ByVal tmpr As ArraySegment(Of Double), ByVal tmpi As ArraySegment(Of Double))

      'if (n <= 1) return;
      If n <= 1 Then Exit Sub

      '/* ---- factorization ---- */
      'for (radix = 2; radix * radix <= n; radix++) {
      '  if (n % radix == 0) break;
      '}
      Dim radix As Integer = 2
      Do While radix * radix <= n
        If n Mod radix = 0 Then Exit Do
        radix += 1
      Loop

      'if (n % radix != 0) radix = n;
      'n_radix = n / radix;
      If n Mod radix <> 0 Then radix = n
      Dim n_radix As Integer = n \ radix

      '/* ---- butterflies ---- */
      'for (j = 0; j < n_radix; j++) {
      '  for (m = 0; m < radix; m++) {
      For j As Integer = 0 To n_radix - 1
        For m As Integer = 0 To radix - 1

          'xr = ar[j];
          'xi = ai[j];
          '==> ここから修正案の新コード
          Dim xr As Double = ar(j)
          Dim xi As Double = ai(j)
          '=== ここから No91939 の旧コード
          'Dim xr As Double = ar.Array(j)
          'Dim xi As Double = ai.Array(j)
          '<==


          'for (r = n_radix; r < n; r += n_radix) {
          For r As Integer = n_radix To n - 1 Step n_radix

            'wr = cos(theta * m * r);
            'wi = sin(theta * m * r);
            Dim wr0 As Double = Math.Cos(theta * m * r)
            Dim wi0 As Double = Math.Sin(theta * m * r)

            'xr += wr * ar[r + j] - wi * ai[r + j];
            'xi += wr * ai[r + j] + wi * ar[r + j];
            '==> ここから修正案の新コード
            xr += wr0 * ar(r + j) - wi0 * ai(r + j)
            xi += wr0 * ai(r + j) + wi0 * ar(r + j)
            '=== ここから No91939 の旧コード
            xr += wr0 * ar.Array(r + j) - wi0 * ai.Array(r + j)
            xi += wr0 * ai.Array(r + j) + wi0 * ar.Array(r + j)
            '<==

          '}
          Next r

          'wr = cos(theta * m * j);
          'wi = sin(theta * m * j);
          Dim wr As Double = Math.Cos(theta * m * j)
          Dim wi As Double = Math.Sin(theta * m * j)

          'tmpr[m * n_radix + j] = xr * wr - xi * wi;
          'tmpi[m * n_radix + j] = xi * wr + xr * wi;
          tmpr.Array(tmpr.Offset + m * n_radix + j) = xr * wr - xi * wi
          tmpi.Array(tmpi.Offset + m * n_radix + j) = xi * wr + xr * wi

        '}
        Next m

      '}
      Next j


      'for (r = 0; r < n; r += n_radix) {
      '  fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai);
      '}
      For r As Integer = 0 To n - 1 Step n_radix
        '==> ここから修正案の新コード (要 No91917 の拡張メソッド)
        fft(n_radix, theta * radix, tmpr.AsSegment(r), tmpi.AsSegment(r), ar, ai)
        '=== ここから No91939 の旧コード
        fft(n_radix, theta * radix, New ArraySegment(Of Double)(tmpr.Array, tmpr.Offset + r, tmpr.Count - r), New ArraySegment(Of Double)(tmpi.Array, tmpi.Offset + r, tmpi.Count - r), ar, ai)
        '<==
      Next r

      'for (j = 0; j < n_radix; j++) {
      '  for (m = 0; m < radix; m++) {
      '    ar[radix * j + m] = tmpr[n_radix * m + j];
      '    ai[radix * j + m] = tmpi[n_radix * m + j];
      '  }
      '}
      For j As Integer = 0 To n_radix - 1
        For m As Integer = 0 To radix - 1
          '==> ここから修正案の新コード (要 No91917 の拡張メソッド)
          ar.SetValue( radix * j + m, tmpr(n_radix * m + j) )
          ai.SetValue( radix * j + m, tmpi(n_radix * m + j) )
          '=== ここから No91939 の旧コード
          ar.Array(ar.Offset + radix * j + m) = tmpr.Array(n_radix * m + j)
          ai.Array(ai.Offset + radix * j + m) = tmpi.Array(n_radix * m + j)
          '<==
        Next m
      Next j

    '}
    End Sub
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -