如何在另一个.c中定义的函数中填充一个.c文件中定义的结构而不将指针作为参数传递?

时间:2016-06-18 17:57:47

标签: c pointers struct fortran extern

我有一个C函数(store_mode_ - 在file_A.c中定义),它在Fortran代码中调用。

看起来像这样..

public class MyService : IMyService
{
    private IObserverManager observerManager;

    public MyService(IObserverManager obsManager){
             this.observerManager = obsManager;
    }

    public void MyMethod(MyObject myObject){

        IObserver[] observers = this.observerManager.GetObservers();
        foreach(var ob in observers){
               ob.Execute(myObject);
        }
    }
}

public class ObserverManager : IObserverManager {
    public List<IObserver> GetObservers(){
        ... some code to return the list of observers
    }

    public void RegisterObserver(IObserver obs)
    {
        ... add obs to list of obs
    }
}

public class Ob1 : IObserver{
      public void Execute(MyObject obj){
           //do something
       }
}

public class Ob2 : IObserver{
      public void Execute(MyObject obj){
           //do something
       }
}

public class StrategyResolver : IStrategyResolver
{
    private IUnityContainer container;

    public StrategyResolver(IUnityContainer c)
    {
         this.container = c;
    }

    public T Resolve<T>(String namedStrategy){
         return this.container.Resolve<T>(namedStrategy); 
    }
}

public class MyRegistry : UnityRegistry
{
    private IUnityContainer container;

    public MyRegistry(IUnityContainer c)
    {
       this.container = c;
    }

    public MyRegistry(){
        this.container.RegisterType<IObserverManager, ObserverManager>();
        this.container.RegisterType<IMyService, MyService();
        this.container.RegisterType<ISomeClass, SomeClass>();
        this.container.RegisterType<IObserver, ObserverA>("CategoryA");
        this.container.RegisterType<IObserver, ObserverB>("CategoryB");
        this.container.RegisterType<IStrategyResolver, StrategyResolver>();
    }
}

public class SomeClass : ISomeClass
{
     private IObserverManager observerManager;
     private IStrategyResolver strategyResolver;

     public SomeClass(IObserverManager oManager, IStrategyResolver sResolver)
     {
         this.observerManager = oManager;
         this.strategyResolver = sResolver;
     }

     public void Process(MyObject obj)
     {
         IObserver obs = this.strategyResolver.Resolve<IObserver>(obj.Category);
         this.observerManager.RegisterObserver(obs);

         ...etc....
     }
}

我正在尝试使用在Fortran调用中作为参数传递的值(n,l,w,U)来填充结构。上面的代码在我的主文件File_B.c中直接定义时工作,该文件调用其中的fortran代码。

但是..如果我在file_A.c中定义了上面的函数(main不在的那个),它就不起作用了。我很欣赏这是由于.c文件之间缺少共享全局变量。我想知道是否有解决方案吗? 也许对于extern,虽然我玩了一点没有成功。

1 个答案:

答案 0 :(得分:1)

static int nmode = 0;

如果要在两个文件中包含该行,那么您有两个nmode个变量,每个文件一个。 static使符号成为翻译单元的私有

相反,你可能想要

int nmode;

在一个文件中,

extern int nmode;

在另一个。 (没有必要明确地将其初始化为零。保证静态存储。)

相关问题