Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从FORTRAN到C的类型转换#_C#_Fortran - Fatal编程技术网

C# 从FORTRAN到C的类型转换#

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

我在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
    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或您确实需要复制语义的情况下。它们的预期用途是保存它们非常有效的值。如果你知道自己在做什么,就没问题。我认为当人们期望复制时,创建引用会导致问题。这个推论与你的情况相反,所以这只是一个观点,明白了。谢谢你的帮助