C# 从FORTRAN到C的类型转换#
我在F2008有C# 从FORTRAN到C的类型转换#,c#,fortran,C#,Fortran,我在F2008有 module mod_Blood use mod_liquid implicit none type, public :: typ_BloodComponents character(len=5) :: name real(DP):: salt real(DP):: RBC end type typ_BloodComponents type, public :: typ_BloodWork real(DP) :: DrugConc re
module mod_Blood
use mod_liquid
implicit none
type, public :: typ_BloodComponents
character(len=5) :: name
real(DP):: salt
real(DP):: RBC
end type typ_BloodComponents
type, public :: typ_BloodWork
real(DP) :: DrugConc
real(DP) :: Dilution
real(DP) :: volume
type(typ_BloodComponents) :: vein, artery
contains
procedure :: SetParameters => blood_SetParameters
procedure :: BloodProteinParams => blood_BloodProteinParams
end type typ_BloodWork
end mod_Blood
我知道静脉和动脉都有变量vein%name、vein%salt、vein%RBC和artery%name、artery%salt和artery%RBC
我怎样才能把这个转到C#?模块是名称空间吗?FORTRAN“type”是C#中的一个类吗
如果我这样做有意义吗:
class BloodComponents
{
string name;
double salt;
double RBC;
}
class BloodWork
{
double drugConc
double dil
double volume
class Vein : BloodComponents
{}
class Artery : BloodComponents
{}
void SetParameters()
{...}
void BloodComponentParameter()
{...}
}
还是我把FORTRAN翻译错了?我想这就是你想要的:
namespace Blood
{
public struct BloodComponents
{
public string name;
public double salt, RBC;
}
public struct BloodWork
{
public double drugConc, dilution, volume;
public BloodComponents vein, artery;
public void SetParameters()
{
}
public void BloodProteintParams()
{
}
}
class Program
{
static void Main(string[] args)
{
var work=new BloodWork()
{
drugConc=0.1,
dilution=0.2,
volume=0.3,
vein=new BloodComponents() { name="A", RBC=0.2, salt=0.6 },
artery=new BloodComponents() { name="B", RBC=0.5, salt=0.9 }
};
}
}
}
所有内容都是
结构
,因此仅复制值。如果你想在多个地方引用同一瞬间的BloodWork
,那么你需要将类型更改为class
“是FORTRAN”类型“C#?”>中的类,我无法详细比较这两种类型,但据我所见,FORTRAN类型似乎确实可以翻译为C#类。你的实现看起来还可以,或者至少是逻辑上可以。除非你的c版本有特殊的问题,否则这可能更适合于什么样的模块?我可以直接在FORTEAN模块中定义,但不能在C#中对命名空间进行定义。SetParameters
和BloodProteinParams
的定义是什么?@BBH1023:Fortran中的模块类似于命名空间(有时可能是类)。这两种语言中的数据结构可能重叠,但它们不是1:1。不要直接移植,而是移植意图。如果你需要一个类,那就使用一个类吧,谁会在乎Fortran是使用了模块
还是通用
。最好避免使用C#中的struct
,而是使用class
,即使struct
更接近Fortran的语义,为什么?推荐人?因为他们不像人们想象的那样工作。如果可以更改结构的任何成员的值,则可能会遇到问题。结构应该是规则的例外,通常是在P/Invoke或您确实需要复制语义的情况下。它们的预期用途是保存它们非常有效的值。如果你知道自己在做什么,就没问题。我认为当人们期望复制时,创建引用会导致问题。这个推论与你的情况相反,所以这只是一个观点,明白了。谢谢你的帮助