C言語からVB変換

タグの編集
投稿者 マジェ  (学生) 投稿日時 2011/11/30 17:01:33
VB2005を勉強している所なのですが、

typedef vector<int> vi;
typedef vector<bool> vb;
typedef vector<double> vd;
typedef Matrix<double> md;

class MlpParam
{
public:
vi size; '// 素子数
vb act; '// 出力関数
double eta; '// 学習率
double theta; '// 温度

public:
MlpParam(){};
MlpParam(const MlpParam& mp); '//コピーコンストラクタ
MlpParam& operator =(const MlpParam& mp); '//代入演算子
};

これをVB2005に変換する場合はどのようになりますか?
投稿者 shu  (社会人) 投稿日時 2011/11/30 17:39:38
Public Class MlpParam
    Public size As New List(Of Integer)
    Public act As New List(Of Boolean)
    Public eta As Double
    Public theta As Double

    Public Sub New()
    End Sub

    Public Sub New(Src As MlpParam)
    End Sub

End Class

提示されたコードだけだとこんな感じでしょうか。
代入演算子は定義出来ないので似たような動作をするメソッドを用意する
必要があるかと思います。
投稿者 マジェ  (学生) 投稿日時 2011/11/30 17:58:45
返答有難うございます。

サンプルコードの環境はC言語ではなく、Microsoft Visual C++ .NET でした。
この言語は勉強していないこともあり、すいませんけどあまり分かりません。

サンプルコードの一部を貼り付けさせて頂きますので、ご協力お願いします。

#ifndef __MLP_H__
#define __MLP_H__
#include "Sample.h"
#include "Matrix.h"
#include "Numeric.h"
using namespace std;

typedef vector<int> vi;
typedef vector<bool> vb;
typedef vector<double> vd;
typedef Matrix<double> md;

class Mlp
{
public:
vi size;
vb act;
double eta;
double theta;

vd u[3];
vd x[3];
vd d[3];
md w[2];
double err;
public:
Mlp& Init(MlpParam& mp);
void New(istream& is);
void Read(istream& is);
void Write(ostream& os);
void Prop(const vd& in);
double& Err(const vd& tar);
void BackProp(const vd& tar);
void RenewWgt(void);
void BackPropDlt(const vd& dlt);
void RndWgt(void);

void Print(ostream& os);
};
//MLPの設定パラメータのクラス/////////////////////////////////
MlpParam::MlpParam(const MlpParam& mp)
{
size = mp.size;
act = mp.act;
eta = mp.eta;
theta = mp.theta;
}

MlpParam& MlpParam::operator =(const MlpParam& mp)
{
size = mp.size;
act = mp.act;
eta = mp.eta;
theta = mp.theta;
return *this;
}
Mlp& Mlp::Init(MlpParam& mp)
{
for(int i=0; i<3; i++) size.push_back(mp.size[i]);
for(int i=0; i<3; i++) act.push_back(mp.act[i]);
eta = mp.eta;
theta = mp.theta;
if(act[0]!=1) act[0]=0; // 入力層の出力関数は線形にセットされます.
//陰変数
for(int l=0; l<3; l++){
for(int i=0; i<size[l]; i++){
u[l].push_back(0);
x[l].push_back(0);
d[l].push_back(0);
}
}
err = 0;

for(int l=0; l<2; l++) w[l].Init(size[l+1], size[l]+1);
RndWgt();
return *this;
}

void Mlp::New(istream& is)
{
MlpParam mp;
for(int i=0; i<3; i++){int buf; is >> buf; mp.size.push_back(buf);}
for(int i=0; i<3; i++){bool buf; is >> buf; mp.act.push_back(buf);}
is.precision(10);
is >> scientific >> mp.eta;
is >> scientific >> mp.theta;
Init(mp);
}
void Mlp::Read(istream& is)
{
New(is);
for(int l=0; l<2; l++) is >> w[l];
}

大変長くなり申し訳ございません。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/11/30 18:25:16
> これをVB2005に変換する場合はどのようになりますか? 
VB には代入演算子のオーバーロードがありませんし、
const の部分も完全に同じ機能が無いため訳しきれません。

言語機能の差をどこまで吸収する必要があるのかにもよりますが、
強いて訳すとこんな感じであろうかと思います。
「直訳」ではなく「意訳」した部分もあるので、
求めるコードになっているかどうかは分かりませんけれども。

' 小文字2文字な型名というのは、.NET の標準的な命名規約から 
' 外れることになりますので、あまりおすすめしません。 
Imports vi = System.Collections.Generic.List(Of Integer)
Imports vb = System.Collections.Generic.List(Of Boolean)
Imports vd = System.Collections.Generic.List(Of Double)

Public Class MlpParam
    Implements ICloneable

    Public size  As vi      '素子数 
    Public act   As vb      '出力関数 
    Public eta   As Double  '学習率 
    Public theta As Double  '温度 

    Public Sub New()
        size = New vi()
        act = New vb()
    End Sub

    ''' <summary>コピーコンストラクタ</summary> 
    Public Sub New(ByVal mp As MlpParam)
        Me.size = New vi(mp.size.ToArray())
        Me.act = New vb(mp.act.ToArray())
        Me.eta = mp.eta
        Me.theta = mp.theta
    End Sub

    Public Function Clone() As Object Implements ICloneable.Clone
        Return New MlpParam(Me)
    End Function
End Class
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/11/30 22:26:13
> すいませんけどあまり分かりません。
すなわち、「全部わからない」というわけでは無いのですよね?
具体的には、どの部分の書き換えで悩んでいるのでしょうか。


> 大変長くなり申し訳ございません。
分からない個所が提示されていなかったので、
こちらで勝手に幾つか拾い出してみます。


> for(int i=0; i<3; i++) size.push_back(mp.size[i]);
> for(int i=0; i<3; i++) act.push_back(mp.act[i]);
vector<int> を List(Of Integer) 型で代用しているとすれば、
For i As Integer = 0 To 3
  Me.size.Add(mp.size(i))
  Me.act.Add(mp.act(i))
Next

で書き換えられるかと思います。


> if(act[0]!=1) act[0]=0; // 入力層の出力関数は線形にセットされます.
act は vector<bool> でしたね。List(Of Boolean) で代用するのであれば、
扱う値は 1 や 0 ではなく、True および False に置き換えてみてください。


> for(int l=0; l<3; l++){
>  for(int i=0; i<size[l]; i++){
>   u[l].push_back(0);
>   x[l].push_back(0);
>   d[l].push_back(0);
>  }
> }
この部分は、たとえばこのように書けます。
For l As Integer = 0 To 3
  For i As Integer = 0 To Me.size(l) - 1
    u(l).Add(0)
    x(l).Add(0)
    d(l).Add(0)
  Next
Next



> void Mlp::Read(istream& is)
> {
>    New(is);
>    for(int l=0; l<2; l++) is >> w[l];
> }
VB では「Is」が予約語になっていますので、is という変数名は
別の名前に変えておいてください。(たとえば stm など)

また、New という部分も、別の名に変えた方が良いでしょう。たとえば、
「void New(~);」を「Sub New(~)」としてしまうと
メソッドではなくコンストラクタの意味になってしまいます。

どうしてもメソッド名として使いたければ、「Sub [New](~)」などのように
予約語を各括弧で囲ってやる必要があります。


> is >> scientific >> mp.eta;
VB の「>>」は算術右シフト演算の意味ですが、
この場合の「>>」は、入力演算子の意味なのでご注意を。

ところで、今回使用しているストリームは何でしょうか?
VB でストリームというと、抽象クラス System.IO.Stream の事であり、たとえば
テキストファイルであれば StreamWriter クラスなどを使って読み書きできます。

また、標準入出力の場合には、Stream 型経由で読み書きする方法の他、
Console.WriteLine() や Console.ReadLine() を使う方法も用意されています。


> is >> scientific >> mp.eta;
ここでいう scientific は "1.234568e+007" などといった
「浮動小数点数の表記に科学的表記法を使う」の意味ですね。

指数表記の文字列を浮動小数点型として扱う場合は、
Dim a As String = "1.234568E+007"
Dim b As Double = CDbl(a)   '12345680.0 に変換される 

のようにして変換できます。

逆に、浮動小数点から指数表記への変換の場合は、"E" の書式指定を使えます。
Dim d As Double = 12345678.9
Dim s1 As String = d.ToString("E")  '"1.234568E+007"に変換される 
Console.WriteLine("{0:E}", d)       '"1.234568E+007"と出力される 
Console.WriteLine("{0:E3}", d)      '"1.235E+007"と出力される 
投稿者 マジェ  (学生) 投稿日時 2011/12/1 10:58:53
大変詳しく返答有難うございます。

正直申し上げますと、Microsoft Visual C++ .NET はほとんど分りません。
昨日1日勉強したぐらいです。

詳しく説明してくださったおかげでほとんどの部分を変換させることが出来ました。
大変助かりました。

Dim Fname As String = System.IO.Path.GetFullPath.......
これで保存を行い、

  intFileNo = FreeFile()  
        If Me.OpenFileDialog1.ShowDialog() = _
                              Windows.Forms.DialogResult.OK Then.......
これでファイルを開き、

 Dim Writer1 As New IO.StreamWriter.......
これで書き出して上記で指定した場所に保存を行っています。

分かりにくい説明になってしまったかもしれませんがすいません。
引き続き説明してくださったことを踏まえて作成していきたいと思います。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/12/1 12:31:22
> 正直申し上げますと、Microsoft Visual C++ .NET はほとんど分りません。
> 昨日1日勉強したぐらいです。
ぶっちゃけていうと、私も C++ は一切分かりません(C なら扱えるのですが)。
そもそも、C++ を勉強したことが無いという。(^^;
(ストリームの「>>」演算子の存在も、今回初めて知りました)

ただ、文法を知らないまでも、ある程度推測はできそうな範囲だったので、
ネットで調べた情報を基にして書き換えた次第です。
そのため情報の正確さは保証しきれません。その点は御容赦を。
投稿者 マジェ  (学生) 投稿日時 2011/12/1 13:53:33
そうだったんですか。
でも大変助かりました。

親切に教えてくださり有難うございました。